扫码关注官方订阅号
如下代码:
undefined = 123; NaN = 123; Infinity = 123; null = 123; // 报错:Uncaught Reference Error
前三条语句可以执行,尽管赋值并没有成功;最后一条语句报错。
为什么?它们有什么区别?
认证0级讲师
undefined/NaN/Infinity是全局属性,这些属性是不可写(writable:false)的,也就是说在全局作用域内不能重新赋值(赋值无效,不会报错);MDN-undefinednull是一个JavaScript字面量(而不是全局对象的一个属性),不能对其赋值。MDN-null
undefined
NaN
Infinity
writable:false
null
因为null是js的关键字,而undefined虽然含义和null很像,但是他是js预定义的一个全局变量,他的值就是'undefined'。其实早在ES3中,有一个bug,undefined是一个可读可写的变量,可以给他赋任意值,但到了ES5就被修复了,他是一个只读的值,所以虽然没有报错,但是赋值语句是没有效果的。
自问自答了,不过采纳了jasonintju的回答,因为他是最先回答出来。
undefined、NaN和Infinity是全局对象window的属性。所以可以被赋值,但是由于它们的内部属性[[writable]]为false,所以赋值实际上无效。证明:
window
[[writable]]
false
Object.getOwnPropertyDescriptor(window, 'undefined'); // 结果: // Object {value: undefined, writable: false, enumerable: false, configurable: false}
可见,undefined确实是window的属性,并且不可写。
null与true、false类似,是字面量,属于JavaScript的保留字。换句话说,跟123、'foobar'是一类的,当然不能赋值。
true
123
'foobar'
参考:1. ECMA-262 Edition 5.1: 15.1 The Global Object2. ECMA-262 Edition 5.1: 7.6.1 Reserved Words
规定null在左边导致语法错误Invalid left-hand side in assignment。理解它并没有什么特殊的意义。规定0是自然数,那为什么0是自然数呢?
这里没有因果关系,只有存在本身。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
undefined
/NaN
/Infinity
是全局属性,这些属性是不可写(writable:false
)的,也就是说在全局作用域内不能重新赋值(赋值无效,不会报错);MDN-undefined
null
是一个JavaScript字面量(而不是全局对象的一个属性),不能对其赋值。MDN-null
因为null是js的关键字,而undefined虽然含义和null很像,但是他是js预定义的一个全局变量,他的值就是'undefined'。
其实早在ES3中,有一个bug,undefined是一个可读可写的变量,可以给他赋任意值,但到了ES5就被修复了,他是一个只读的值,所以虽然没有报错,但是赋值语句是没有效果的。
自问自答了,不过采纳了jasonintju的回答,因为他是最先回答出来。
undefined
、NaN
和Infinity
是全局对象window
的属性。所以可以被赋值,但是由于它们的内部属性[[writable]]
为false
,所以赋值实际上无效。证明:可见,undefined确实是window的属性,并且不可写。
null
与true
、false
类似,是字面量,属于JavaScript的保留字。换句话说,跟123
、'foobar'
是一类的,当然不能赋值。参考:
1. ECMA-262 Edition 5.1: 15.1 The Global Object
2. ECMA-262 Edition 5.1: 7.6.1 Reserved Words
规定null在左边导致语法错误Invalid left-hand side in assignment。理解它并没有什么特殊的意义。
规定0是自然数,那为什么0是自然数呢?
这里没有因果关系,只有存在本身。