下面这行是做什么的?
undefined = 'A value';
如果它没有改变undefined
的值,那么幕后会发生什么?
答案 0 :(得分:53)
undefined
是全局对象的属性,即它是全局范围内的变量。undefined
的初始值是原始值undefined
。
请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined
所以,它只是一个变量,没有什么特别之处。现在,回答你的问题:
undefined = 'A value';
尝试将字符串'A value'
分配给全局变量undefined
undefined === 'A value'; // true
。在严格模式下的较新浏览器中,操作会导致错误。 您可以在浏览器控制台中测试以下内容(我在这里使用现代浏览器 - Google Chrome):
undefined = true;
console.log(undefined); // undefined
// in older browsers like the older Internet Explorer it would have logged true
undefined
的值在上例中没有变化。这是因为(强调我的):
在现代浏览器(JavaScript 1.8.5 / Firefox 4+)中,undefined是符合ECMAScript 5规范的不可配置,不可写属性。
在严格模式下:
'use strict';
undefined = true; // VM358:2 Uncaught TypeError: Cannot assign to read only property 'undefined' of object
答案 1 :(得分:24)
与true
,123
或null
不同,undefined
不是literal。这意味着使用undefined
identifier并不是获得undefined value的简单方法。相反,可以使用void
operator,例如void 0
。
默认情况下,undefined
定义了global object的属性,即全局变量。在ECMAScript 5之前,该属性是可写的,所以
undefined = "A value";
替换了window.undefined
的值,假设它没有被局部变量遮蔽。然后,如果您使用"A value" === undefined
,则会获得true
。而void 0 === undefined
会产生false
。
ECMAScript 5改变了这种行为,现在该属性不可写也不可配置。因此,在非严格模式下将忽略对undefined
的赋值,并且将在严格模式下抛出异常。引擎盖下,
undefined = "A value";
是Simple Assignment "A value"
放在引用中,基于全局对象,引用名称为"undefined"
,如果在严格模式下进行赋值,则使用strict flag。"undefined"
作为属性名称,"A value"
作为值,将strict标志作为throw标志。"undefined"
,属性描述符{[[Value]]: "A value"}
和throw标志作为参数。但是,您仍然可以声明本地undefined
变量:
(function() {
var undefined = "A value";
alert(undefined); // "A value";
})();
答案 2 :(得分:3)
我在有strict mode
的情况下做了一点POC。
效果是,如果你不使用strict mode
,一切都会好起来的。如果你正在使用strict mode
,那么你会很高兴:
TypeError:无法分配给只读属性' undefined'
现在让我们进入POC:
"use strict"
var c;
if (c === undefined) {
console.log("nothing happened")
}
undefined = "goofy"
c = "goofy"
if (c === undefined) {
console.log("c is 'goofy' and it's equal to undefined.. gosh.. we broke js")
}
现在,正如我所说,使用严格模式,您获得TypeError
,同时删除"use strict"
脚本正常,输出只是nothing happened
。
如果您想了解更多信息,我发现this Q/A可能很有用
注意:我已使用Node.js
测试了此代码。