【问题标题】:assigning value to undefined and type of undefined in Javascript在Javascript中为未定义和未定义类型赋值
【发布时间】:2020-02-24 10:30:48
【问题描述】:

在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);
})();

【问题讨论】:

  • 你不能重新分配 global undefined.
  • “在现代浏览器(JavaScript 1.8.5 / Firefox 4+)中,根据 ECMAScript 5 规范,undefined 是一个不可配置、不可写的属性。即使不是这种情况,也要避免覆盖它。” — MDN docs for undefined
  • @SebastianSimon 谢谢!抱歉,不知道。
  • @PraveenKumarPurushothaman 不是。它是 window 对象的一个​​属性 - 在最近的环境中,它是写保护的,但过去不是。
  • @VLAZ 谢谢!抱歉,不知道。

标签: javascript ecmascript-6 undefined ecmascript-next


【解决方案1】:

这符合预期。对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 说您可以“为全局提供的未定义标识符赋值”,但这仅适用于 ES3 及以下环境。在 ES5+(现在几乎所有浏览器都支持)中,undefined不可被覆盖。

【讨论】:

    猜你喜欢
    • 2022-12-23
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 2012-07-28
    • 2010-10-21
    • 1970-01-01
    相关资源
    最近更新 更多