首页 > 解决方案 > 在Javascript中为未定义和未定义类型赋值

问题描述

"non-strict"javascript 模式下,我们可以为undefined. 我试图给它赋值,但是当我试图打印那个值时,它给了我奇怪的结果。

let a = 10;
undefined = 20;
a = undefined;
console.log(a); // 	undefined not 20
console.log(undefined); // undefined not 20

如果我创建自己的范围,那么undefined可以被覆盖。我知道自从 ECMA 5 以来你不能覆盖undefined它是只读的。那么我如何为我自己的范围获得以下输出(将未定义设置为 10)?

这是否意味着我只能在自己的范围(非全局)中编写它?

(function (undefined) {
  undefined = 10;
  console.log("Value of undefined: " + undefined);
})();

标签: javascriptecmascript-6undefinedecmascript-next

解决方案


这正如预期的那样。undefined对is 实际上的引用window.undefined,并且 of 的undefined属性window是不可写的:

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


推荐阅读