问题在代码中
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
首先来解决第一个问题,截图是表示打印出来的window对象
可以看到a的确是在window对象上的,那为什么console.log(a in window)是错误的呢,下面就要看看关键词in到底是什么,参考MDN的如下
注意到有一个A string,表示它要是一个字符串(或者 symbol),你把代码改成
下面解决NaN的问题,同样下面是window的截图
window下面是有NaN的
第一条的解释 @zhanfang 的应当是正解,in 运算符不太常用理解有偏颇。
原答案:
1.如 @wangfulin 所说,使用 var 声明的全局变量是不可枚举的,相当于:
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
对象的静态特性.故可以通过NaN
和Number.NaN
访问。又因为运行的环境是浏览器,全局对象是window
,故也可以通过window.NaN
访问参考:
Number 静态特性
全局对象