luk*_*nis 3 javascript underscore.js
我一直在阅读underscore.js源代码并注意到这个比较_.each():
(obj.length === +obj.length)
Run Code Online (Sandbox Code Playgroud)
我知道在变量转换为数字/整数之前+.所以在这个原因
[1,2,3].length === +[1,2,3].length
Run Code Online (Sandbox Code Playgroud)
是真的.如果我传入一个对象:
var obj = {a: 1, b: 2, c: 3};
Run Code Online (Sandbox Code Playgroud)
+obj.length产生NaN
在最后一种情况下,我有
[1,2,3, {a: [4,5,6]}].length
Run Code Online (Sandbox Code Playgroud)
这是4.把它铸成一个数字..仍然是4.
从else的情况决定,我可以看到这种比较可能是为了区分数组和对象,就像它使用的其他情况一样:
for (var key in obj) { ...
Run Code Online (Sandbox Code Playgroud)
我没有看到任何理由使用这种比较.谁能解释一下?
基本上,这是测试的类型的方法length属性Number,而不使用typeof 和这个号码是不是NaN.所以实际上:
if (typeof obj.length === "number" && !isNaN(obj.length))
Run Code Online (Sandbox Code Playgroud)
比较n === +n只对数字有效,因为===测试类型和值,+n并将创建Number(可能,如您所见,数字NaN).而且因为NaN === NaN它是错误的,它也会把它们除掉.
因此,它是一种检测方法,根据一个定义("具有数字length不是NaN"),以迭代的对象是否是阵列- 等.JavaScript和浏览器世界中有几个类似数组的东西,比如arguments伪数组和DOM的NodeList.
愚蠢的表现比较:
+与typeof无需担心NaN:当true | 什么时候false+vs. typeof和isNaN:当true | 什么时候false(错误的类型) | 什么时候false(NaN)Upshot:没有NaN方面,typeof速度更快(当类型错误时显然如此).使用NaN方面,+结果将会更快,true因为它会更快,因为它是错误的类型NaN,结果将更慢(显然是这样)false.(当然,歌剧与往常不同.)
并不是说它在现实世界中很重要(见上文"愚蠢").
| 归档时间: |
|
| 查看次数: |
278 次 |
| 最近记录: |