You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript字符串转对象:非数值字段返回NaN的问题

嘿,我一眼就看到问题出在哪啦!你代码里用了var value = singleArr[1]-0;,这个操作会把所有值都往数值类型转——但像#dfdfdf、solid这种非数字字符串,转数值肯定会得到NaN呀!

下面给你几种修复方案,按需选就行:

方案1:简单区分数值与字符串

修改value的赋值逻辑,先尝试转数字,转失败就保留原字符串:

var str = "margin_top=5&margin_bottom=5&border_color=#dfdfdf&border_style=solid";
console.log(strToObj(str)); // 用console.log比alert调试更方便哦

function strToObj(str){
 str = str.replace(/\(|\)/g,'');
 var arr = str.split('&');
 var obj = {};
 for (var i = 0; i < arr.length; i++) {
  var singleArr = arr[i].trim().split('=');
  var name = singleArr[0];
  // 核心:转数值失败就用原字符串
  var value = isNaN(singleArr[1] - 0) ? singleArr[1] : singleArr[1] - 0;
  if (obj[name] === undefined) {
   obj[name] = value;
  }
  console.log(`${name}: ${value}`);
 }
 return obj;
}

方案2:更严谨的数值判断(推荐)

isNaN偶尔会有小坑(比如空字符串转数值是0,可能不符合预期),用isFinite判断更靠谱:

function strToObj(str){
 str = str.replace(/\(|\)/g,'');
 var arr = str.split('&');
 var obj = {};
 for (var i = 0; i < arr.length; i++) {
  var singleArr = arr[i].trim().split('=');
  var name = singleArr[0];
  var numValue = Number(singleArr[1]);
  // 只有是有效有限数字时才转数值,否则用原字符串
  var value = isFinite(numValue) ? numValue : singleArr[1];
  if (obj[name] === undefined) {
   obj[name] = value;
  }
  console.log(`${name}: ${value}`);
 }
 return obj;
}

方案3:用现代JS API偷懒(最简洁)

如果你的项目支持ES6+,直接用浏览器原生的URLSearchParams,它能帮你省掉很多手动拆分的代码:

var str = "margin_top=5&margin_bottom=5&border_color=#dfdfdf&border_style=solid";
function strToObj(str) {
  const params = new URLSearchParams(str);
  const obj = {};
  for (const [key, value] of params) {
    const numValue = Number(value);
    obj[key] = isFinite(numValue) ? numValue : value;
    console.log(`${key}: ${obj[key]}`);
  }
  return obj;
}
console.log(strToObj(str));

这样改完之后,数值类型的参数会保留数字格式,字符串类型的参数也能正常显示,不会再出现NaN的问题啦!

内容的提问来源于stack exchange,提问作者Mustapha Fersaoui

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:10:56