关于typeof与isNaN处理(1 + undefined)结果矛盾的技术疑问
为什么
typeof(1+undefined)返回"number"但isNaN(1+undefined)返回true? 哈哈,这个问题其实是JavaScript里两个容易被误解的知识点撞在一起了,咱们一步步理清楚:
1. 先搞明白1 + undefined的结果是什么
当你执行1 + undefined时,JavaScript会自动做隐式类型转换:
undefined在算术运算场景下会被转换成NaN(全称Not a Number,翻译过来是“不是一个数字”)- 所以
1 + undefined最终得到的结果就是NaN
这里有个关键细节:NaN本身的类型就是number——这是JavaScript语言规范明确规定的,typeof NaN永远返回"number"。所以typeof(1+undefined)返回"number"完全合理,它只是在告诉你这个值的类型归属,不管这个数字是不是有效的。
2. 再说说isNaN的“历史坑”
你可能以为isNaN是直接判断某个值是不是NaN,但早期的isNaN函数有个设计缺陷:它会先把传入的参数强制转换成数字,然后再判断转换后的结果是不是NaN。
对于1+undefined的结果NaN来说,转换后还是NaN,所以isNaN(NaN)自然返回true。但这个逻辑会导致很多“反直觉”的情况,比如isNaN("abc")也会返回true——因为字符串"abc"转数字会得到NaN,但typeof "abc"可是"string"哦。
如果想真正严格判断一个值是不是NaN,ES6之后出了个更靠谱的方法:Number.isNaN()。它不会做任何类型转换,只会直接判断值本身是不是NaN。举个例子:
Number.isNaN(1+undefined)→true(确实是NaN)Number.isNaN("abc")→false(字符串不是NaN)
最后总结
这根本不是什么矛盾,只是两个API的职责完全不同:
typeof负责判断值的类型归属,NaN属于number类型,所以返回"number"- 传统
isNaN负责判断值转换为数字后是否是无效值,NaN本身就是无效数字,所以返回true
内容的提问来源于stack exchange,提问作者abhiox
相关产品推荐
相关产品推荐

