这行代码是做什么的?
undefined = 'A value';
如果它不改变undefined
的值,那么幕后会发生什么?
如果它不改变
undefined
的值,那么幕后会发生什么?这行代码是做什么的?
undefined = 'A value';
如果它不改变undefined
的值,那么幕后会发生什么?
undefined
的值,那么幕后会发生什么?
undefined
是全局对象的属性,也就是说它是全局范围内的变量。undefined
的初始值是原始值undefined
。
参见 https://developer.mozilla.org/zh-CN/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+),根据 ECMAScript 5 规范,undefined 是一个不可配置的、不可写的属性。
在严格模式下:
'use strict';
undefined = true; // VM358:2 Uncaught TypeError: Cannot assign to read only property 'undefined' of object
void
运算符 - 它评估其参数,然后返回undefined
,因为它是一个运算符,所以不能分配一个值。 因此,您始终可以使用表达式void 0
或void(0)
获取undefined
(运算符不需要在参数周围使用括号)。 - Aaron Dufour与 true
、123
或 null
等不同,undefined
不是 字面量。这意味着使用 undefined
标识符 并非获取 undefined 值 的绝对可靠方法。相反,可以使用 void
运算符,例如 void 0
。
默认情况下,undefined
定义了一个全局对象的属性,即全局变量。在ECMAScript 5之前,该属性是可写的,因此
undefined = "A value";
window.undefined
的值,假设它没有被本地变量遮蔽。因此,如果您使用"A value" === undefined
,则会得到true
。而void 0 === undefined
将产生false
。undefined
的赋值将被忽略,在严格模式下将引发异常。在幕后,
undefined = "A value";
是一个 简单赋值。"A value"
放入基于全局对象的引用中,引用名称为 "undefined"
,如果在严格模式下进行赋值,则使用严格标志。"undefined"
,将值设置为 "A value"
,将抛出标志设置为严格标志。"undefined"
,将属性描述符设置为 {[[Value]]: "A value"}
,将抛出标志设置为 throw flag。undefined
变量:(function() {
var undefined = "A value";
alert(undefined); // "A value";
})();
NaN
也是一个可以写入的全局变量。 - Edwarric我制作了一个小型的POC,有和没有使用严格模式
。
效果是,如果你不使用严格模式
,一切都很好。 如果你使用严格模式
,将会出现一个如下的错误:
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
。Node.js
测试了此代码。window
、querySelector
等,而node则有global
、fs.write
等)。 - Oleg除了Oriol答案之外
你还可以有一个块级未定义变量
{
let emptyVar;
// console.log(emptyVar === undefined); // Cannot access 'undefined' before initialization
const undefined = "some value";
console.log(undefined);
console.log(void 0); // primitive undefined
}