javascript - javasript内置属性的问题
大家讲道理
大家讲道理 2017-04-11 09:51:43
[JavaScript讨论组]

问题在代码中

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
大家讲道理
大家讲道理

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

全部回复(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的

天蓬老师

第一条的解释 @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 静态特性
全局对象

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号