编写规范以使undefined
可变,因此不适合比较的团队的意图是什么?
答案 0 :(得分:3)
我不知道对此有一个单一的,明确的答案,但这里有一些语言设计问题,它们提供了对机制和部分的部分解释。在这里发挥作用。
首先:null
,true
和false
等可比值为reserved words。这些是JavaScript语言的基本部分 - 与if
和for
类似。 undefined
似乎与null
非常相似,所以认为它们在使用方面是相同的是相当直观的。它最终有点不同 - 在这方面更像NaN
。
在提出这个问题时,值得问的是,实际上有多少是可变的。实际上一切 - 如果你想覆盖任何标准的构造函数或函数,你可能会。可以设置Array
,Math
,eval
等。
原始语言中没有机制甚至使窗口上的属性不可变。即使设计师认为阻止对undefined
进行更改也是一个好主意,除了在语言中改变其语法意义之外,还有其他方法无法做到这一点。
尽管如此,核心语言规范提供了对变量变更方式和原因的更多控制。 ECMAScript 5添加了控制属性如何可变的方法,以及是否可以配置变量writable
。这可以通过Object.getOwnPropertyDescriptor
函数看到。我相信窗口上唯一可以被视为“核心JavaScript”的不可写值是undefined
,Infinity
和NaN
(其他值在浏览器中是不可写的,但我相信它们几乎都与浏览器本身有关,并且不是语言的基础)。规范的Section 15.1.1有详细说明;我在original spec找不到任何类似内容。
这仍然不能完全阻止你“覆盖未定义” - 如果你不在全局范围内,你可以把它当作变量。因此,只需在全局范围内执行时打印undefined
-
var undefined = 5;
console.log(undefined);
但这会打印5 -
(function() {
var undefined = 5;
console.log(undefined);
})();
这根本不会改变值,它只是创建一个名为“undefined”的变量的新本地引用。由于该值是在顶级作用域(window
)上定义的,因此该语言仅阻止在该特定对象上分配该特定属性。