查看jQuery核心,我发现了以下代码约定:
nth: function(elem, i, match){
return match[3] - 0 === i;
},
Run Code Online (Sandbox Code Playgroud)
我对这个片段非常好奇 match[3] - 0
在Google上搜索"-0"并不是很有效率,搜索"减零"会返回对Bob Dylan歌曲的引用.
所以,谁能告诉我.这是某种性能技巧,还是有理由这样做而不是parseInt或parseFloat?
在Web和框架中看到类似的代码是很常见的:
var args = Array.prototype.slice.call(arguments);
Run Code Online (Sandbox Code Playgroud)
在这样做时,您将参数Object转换为实数Array(尽管JS具有真正的数组),它允许您在Array原型中应用的任何数组方法等应用于它等.
我记得在某处读取arguments直接访问Object的速度明显慢于Array克隆,或者明显选择命名参数.是否有任何事实,在什么情况下/浏览器会导致性能损失?你知道的关于这个主题的任何文章?
从http://bonsaiden.github.com/JavaScript-Garden/#function.arguments 更新有趣的发现,这使我之前阅读的内容无效...希望这个问题可以从写这篇文章的@Ivo Wetzel那里获得更多答案.
在该部分的底部,它说:
表现神话和真相
始终创建arguments对象,只有两个例外,即在函数内部或其形式参数之一声明它的名称.无论是否使用都无关紧要.
这与http://www.jspatterns.com/arguments-considered-harmful/冲突,其中指出:
但是,出于以下原因使用参数不是一个好主意:
- 性能
- 安全
每次调用函数时都不会自动创建arguments对象,JavaScript引擎只会按需创建它(如果使用的话).而且这种创造在性能方面并不是免费的.使用参数与不使用参数之间的差异可能会慢1.5到4倍,具体取决于浏览器
显然,不能两者都是正确的,那么它是哪一个呢?
ECMA顽固的Dmitrty Soshnikov说:
究竟"JavaScript引擎"是什么意思?你在哪里得到这个确切的信息?虽然,在某些实现中可能是正确的(是的,这是一个很好的优化,因为在解析代码时可以获得有关上下文的所有必需信息,因此如果在解析时找不到,则不需要创建参数对象),但是当你知道ECMA-262-3语句,每次进入执行上下文时都会创建参数对象.
阅读underscore.js我的源代码,偶然发现了以下几行:
... if (obj.length === +obj.length) { ...
Run Code Online (Sandbox Code Playgroud)
这对我来说有点混乱.这里的实际比较是什么?我相信它有关于检测本机数组的一些事情,但无法弄清楚实际发生了什么.怎么+办?为什么用===而不是==?这种风格的性能优势是什么?