为什么JavaScript让NAN可以在函数中被覆盖



我在Chrome 56

中测试了此代码

我刚刚找到了这个怪异的代码。

如果我在控制台const NaN = '';

中键入此代码

我收到了我期望的这一消息。Uncaught SyntaxError: Identifier 'NaN' has already been declared at <anonymous>:1:1

但是,如果我覆盖nan关键字,则像这样

function a(){ const NaN = ''; return NaN; }

它返回空字符串''

为什么javascript让关键字可以在函数中覆盖?

根据MDN文档:

nan 是全局对象的属性,即它是全局范围中的变量。

这是不可重写的,您无法为其分配任何其他值。

注意实际上可能是可能的,但在全局范围中不可能。如果您可以在功能中进行操作,则可以覆盖其值并访问它,但是仅在功能范围内。即使您对函数内的NaN属性有重新签名的值,全局对象也不会受到影响。

同样的涉及例如Infinity

不要对const关键字误导,无论使用let还是var,都不可能,但是值得一提的是 - 使用var不会丢任何错误,但是全局对象仍然不会被覆盖。p>

(function() {
  const NaN = 'something';
  const Infinity = '5';
  console.log(NaN);
  console.log(Infinity);
})();
console.log(NaN); //hasn't been overwrited
console.log(Infinity); //hasn't been overwrited
//const NaN = ''; --> throws error (has already been declared)
//const Infinity = 5; --> throws error (has already been declared)

来自MDN文档:

nan是全局对象的属性。NAN的初始值为 非数字 - 与数字的值相同。在现代 NAN浏览器是不可配合的,不可抛弃的财产。即使什么时候 事实并非如此,避免覆盖它。

该文档告诉所有现代浏览器中它是不可配合的,也不可用,即使您也应该避免更改。

最新更新