gpt4 book ai didi

javascript - 为什么 window.undefined 在旧浏览器中是可变的?

转载 作者:行者123 更新时间:2023-11-30 12:24:52 29 4
gpt4 key购买 nike

编写规范以使 undefined 可变并因此不利于比较的团队的意图是什么?

最佳答案

我不知道关于这个问题的单一、明确的答案,但这里有一些语言设计问题,它们提供了对此处起作用的机制和考虑因素的部分解释。

首先也是最重要的:nulltruefalse 等可比较的值是 reserved words .这些是 JavaScript 语言的基本部分 - 与 iffor 的级别相似。 undefined 看起来非常像 null,因此可以很直观地认为它们在用法方面是相同的。它最终有点不同 - 在这个特定方面更像 NaN

问这个问题时,值得一问的是,实际上有多少是可变的。实际上一切——如果你想覆盖任何标准构造函数或函数,你可能可以。 Array, Math, eval 等都可以设置。

原始语言中甚至没有使窗口属性不可变的机制。即使设计者认为阻止对 undefined 的更改是个好主意,但除了在语言中更改其句法含义之外,目前还没有其他方法可以做到这一点。

不过现在,核心语言规范对如何以及为什么可以更改变量提供了更多的控制。 ECMAScript 5 添加了一些方法来控制属性如何可变,以及是否可以配置变量 writable。这可以通过 Object.getOwnPropertyDescriptor 看到功能。我相信 window 上唯一可能被认为是“核心 JavaScript”的不可写值是 undefinedInfinityNaN(其他值是非-在浏览器中可写,但我相信它们几乎都与浏览器本身有关,而不是语言的基础)。 Section 15.1.1规范的详细信息;我在 original spec 中找不到任何类似内容.

这仍然不能完全阻止您“覆盖未定义”——如果您不在全局范围内,您可以将其视为一个变量。因此,这将在全局范围内执行时简单地打印 undefined -

var undefined = 5;
console.log(undefined);

但这会打印出 5 -

(function() {
var undefined = 5;
console.log(undefined);
})();

这根本不会改变值,它只是创建一个新的局部引用到一个名为“undefined”的变量。由于该值是在顶级范围 (window) 上定义的,因此该语言只会阻止对那个特定对象的特定属性进行赋值。

关于javascript - 为什么 window.undefined 在旧浏览器中是可变的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29742135/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com