undefined和null
在JS里,undefined和null都被用来表示 “无”
undefined==null
其主要是有历史原因的:
null像在Java里,被当成一个对象
typeof null == object
但是如果数据不匹配,null会隐式自动转换为0 Number(null) == 0
如果只有null的话,自动转为0也不容易被发现;且并不希望表示无的值为一个对象。所以又设计了一个undefined
Number(undefined) == NaN
目前的区别:
null表示"没有对象",即该处不应该有值。
(1) 作为函数的参数,表示该函数的参数不是对象。
(2) 作为对象原型链的终点
undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。
(1)变量被声明了,但没有赋值时,就等于undefined。
(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。
(4)函数没有返回值时,默认返回undefined。
引用:https://www.ruanyifeng.com/blog/2014/03/undefined-vs-null.html
引用评论:
typeof null 结果是 ”object“ 更像是一个设计失误
因为 typeof null === "object" 而认为 null 语义是表示空对象是个不谨慎的猜测,感觉像是先射箭后画靶一般。
简单的反例:在强类型数据交换协议 odata(http://www.odata.org/)的 JSON 格式中,即使一个成员定义为特定类型(比如string),也可以设置其值为 null 来表示这个值是空值,这可不是表示这个成员是空对象,只是说值为空而已(和空字符串、0、false有所区别)。
而 typeof null === "object" 更可能是一个设计失误,所以在 harmony 中有提议将这个返回值修正为 null :
http://wiki.ecmascript.org/doku.php?id=harmony:typeof_null
当然该提议因为会造成大量旧 Javascript 脚本出现问题而被否决了……