javascript - 在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);
})();
解决方案
这正如预期的那样。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
是不可覆盖的。
推荐阅读
- javascript - 在引导程序 3 中使用网格制作图像库,使用 col-lg-4 类并在一行中添加 6 个图像,我得到空白
- reactjs - 反应本机签名捕获参考困境
- java - Java - 静态类的列表数组总是返回相同的值
- asp.net - 无法在后面的代码中获得控制权或命名空间
- python - 从 pubsub 回调函数返回值
- vba - 如何将子表单中的数据自动填充到主表单中的文本框?
- r - papaja and text references knitting to word
- android-management-api - Android 管理 API 注册“无效令牌”:如何调试?
- cassandra - 如何使用datastax DevCenter在Cassandra中检查!= null?
- sharepoint - 使用列格式自定义 SharePoint