javascript - javasript内置属性的问题
大家讲道理
大家讲道理 2017-04-11 09:51:43
0
3
295

问题在代码中

var a = 3;
console.log( a in window ); // false,-------------为什么,

// NaN明明是Number的属性,为什么可以直接使用,也可以通过window访问
console.log(NaN); // NaN
console.log(Number.NaN); // NaN
console.log(window.NaN); // NaN

console.log(Number.hasOwnProperty(NaN)); // true
大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

reply all(3)
巴扎黑

首先来解决第一个问题,截图是表示打印出来的window对象

可以看到a的确是在window对象上的,那为什么console.log(a in window)是错误的呢,下面就要看看关键词in到底是什么,参考MDN的如下

prop
A string or symbol representing a property name or array index (non-symbols will be coerced to strings).

注意到有一个A string,表示它要是一个字符串(或者 symbol),你把代码改成

console.log("a" in window) //true

下面解决NaN的问题,同样下面是window的截图

window下面是有NaN的

Peter_Zhu

第一条的解释 @zhanfang 的应当是正解,in 运算符不太常用理解有偏颇。


原答案:
1.如 @wangfulin 所说,使用 var 声明的全局变量是不可枚举的,相当于:

// 相当于 var a = 3
Object.defineProperty(window, 'a', {
    value: 3,
    enumerable: false,
    configurable: false
})

console.log(a in window) // false
// 除此之外还无法删除
delete window.a // false

2.ECMAScript 规范中明确定义了两个 NaN,一个作为全局对象的属性,一个作为 Number 对象的属性,可以直接访问的其实是全局对象的属性,即 window.NaN
http://www.ecma-international.org/ecma-262/6.0/index.html#sec-value-properties-of-the-global-object-nan
http://www.ecma-international.org/ecma-262/6.0/index.html#sec-number.nan

阿神

1, 任何一个 javascript property 都有三个 attribute,分别是 configurable,enumerable,writable. 通过 var 声明的变量是不可以 enumberable 的,所以无法通过 a in window 判断出来改特性是否在 window 对象上。
2, NaN 既是一个全局的特性也是 Number 对象的静态特性.故可以通过 NaNNumber.NaN 访问。又因为运行的环境是浏览器,全局对象是 window,故也可以通过 window.NaN 访问

参考:
Number 静态特性
全局对象

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template