在 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,而windowundefined属性是不可写的:

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 不可 覆盖。