关于isNaN("12")返回false、12与"12"相等及字符串差异的技术咨询
让我一步步帮你搞清楚这些JavaScript里的常见疑问:
1. 为什么isNaN("12")的计算结果为false?
首先得明确isNaN()函数的工作逻辑:它不会直接判断参数是不是NaN,而是先尝试把参数转换成数字类型,如果转换后的结果是NaN,才返回true,否则返回false。
对于字符串"12"来说,它可以被JavaScript成功转换成数字12(这是一个有效的数值,不是NaN),所以isNaN("12")就返回了false。
结合你给出的代码例子来看:
function sanitise(x) { if (isNaN(x)) { return NaN; } return x; } var a = "12" var b = 12 console.log(typeof(a)) console.log(sanitise(a)); console.log(sanitise(b));
当调用sanitise(a)时,因为isNaN("12")是false,所以函数直接返回原字符串"12",这就是你看到的输出结果:
"string"
"12"
12
2. 为什么JavaScript会将数值12和字符串"12"视为相等?
这是因为JavaScript的宽松相等运算符(==)会触发隐式类型转换。当你用==比较不同类型的值时,JS会按照特定规则先把它们转换成相同类型,再比较:
- 当数字和字符串比较时,字符串会被自动转换成数字。
所以12 == "12"的过程是:先把"12"转换成数字12,然后比较12和12,结果自然是true。
如果你不想触发类型转换,应该用严格相等运算符(===),它会同时比较值和类型,12 === "12"就会返回false。
3. 字符串"12"与普通字符串"string"之间的区别是什么?
这两个字符串的核心区别在于是否能被有效转换为数字:
"12"是一个"数字型字符串",它可以被隐式或显式转换成有效的数值12。比如+"12"会得到12,isNaN("12")返回false。"string"是普通文本字符串,尝试转换成数字时会得到NaN(非数字)。比如+"string"返回NaN,isNaN("string")返回true。
反映到你的sanitise函数里:如果传入"string",isNaN("string")是true,函数会返回NaN;而传入"12"则会返回原字符串。
另外,在涉及算术运算时两者表现也不同:比如"12" * 2会得到24(先转数字再运算),但"string" * 2会得到NaN。
内容的提问来源于stack exchange,提问作者Shuai Li
相关产品推荐
相关产品推荐

