在 Javascript 中为 undefined 和 undefined 类型赋值
assigning value to undefined and type of undefined in Javascript
在javascript的"non-strict"
模式下,我们可以给undefined
赋值。我试图给它赋值,但当我试图打印该值时,它给了我奇怪的结果。
let a = 10;
undefined = 20;
a = undefined;
console.log(a); // undefined not 20
console.log(undefined); // undefined not 20
如果我创建自己的作用域,则 undefined
可以被覆盖。我知道自 ECMA 5 以来你不能覆盖 undefined
它是只读的。那么我如何为我自己的范围获得以下输出(将 undefined 设置为 10)?
这是否意味着我只能在我自己的范围内(非全局)编写它?
(function (undefined) {
undefined = 10;
console.log("Value of undefined: " + undefined);
})();
这符合预期。 undefined
的引用实际上是window.undefined
,而window
的undefined
属性是不可写的:
console.log(Object.getOwnPropertyDescriptor(window, 'undefined'));
并且无法覆盖不可写的属性。
不同之处在于,在严格模式下,尝试写入它会引发错误,而在草率模式下,失败是无声的。
如果您将另一个不可写的 属性 分配给 window
并尝试覆盖它,则可以看到相同类型的行为:
Object.defineProperty(window, 'prop', { value: 'value', writable: false });
window.prop = 5;
console.log(window.prop);
(() => {
'use strict';
window.prop = 10;
})();
虽然 You Don't Know JS 说你可以 "assign a value to the globally provided undefined identifier",但这只适用于 ES3 及以下环境。在 ES5+(现在几乎所有浏览器都支持)中,undefined
不可 覆盖。
在javascript的"non-strict"
模式下,我们可以给undefined
赋值。我试图给它赋值,但当我试图打印该值时,它给了我奇怪的结果。
let a = 10;
undefined = 20;
a = undefined;
console.log(a); // undefined not 20
console.log(undefined); // undefined not 20
如果我创建自己的作用域,则 undefined
可以被覆盖。我知道自 ECMA 5 以来你不能覆盖 undefined
它是只读的。那么我如何为我自己的范围获得以下输出(将 undefined 设置为 10)?
这是否意味着我只能在我自己的范围内(非全局)编写它?
(function (undefined) {
undefined = 10;
console.log("Value of undefined: " + undefined);
})();
这符合预期。 undefined
的引用实际上是window.undefined
,而window
的undefined
属性是不可写的:
console.log(Object.getOwnPropertyDescriptor(window, 'undefined'));
并且无法覆盖不可写的属性。
不同之处在于,在严格模式下,尝试写入它会引发错误,而在草率模式下,失败是无声的。
如果您将另一个不可写的 属性 分配给 window
并尝试覆盖它,则可以看到相同类型的行为:
Object.defineProperty(window, 'prop', { value: 'value', writable: false });
window.prop = 5;
console.log(window.prop);
(() => {
'use strict';
window.prop = 10;
})();
虽然 You Don't Know JS 说你可以 "assign a value to the globally provided undefined identifier",但这只适用于 ES3 及以下环境。在 ES5+(现在几乎所有浏览器都支持)中,undefined
不可 覆盖。