消除零某种JavaScript性能技巧?

查看jQuery核心,我发现了以下代码约定:

nth: function(elem, i, match){ return match[3] - 0 === i; }, 

我对片段match[3] - 0感到好奇match[3] - 0

在Google上搜索“-0”并不是很有效率,搜索“减零”会返回对Bob Dylan歌曲的引用。

所以,谁能告诉我。 这是某种性能技巧,还是有理由这样做而不是parseIntparseFloat

基于一些快速和肮脏的基准测试运行, "1234" - 0parseInt("1234")快50%,比Firefox 3.6中的+"1234"快10%。

更新:

我的“快速和肮脏”基准测试不是很有用,因为它只是在循环中转换字符串“1234”。 我再次尝试使用随机数字列表,结果遍布地图。 这台计算机上的三种方法都在400-500毫秒内,除非它们跳到1300毫秒! 我认为垃圾收集正在干扰。 这里有一些代码可以在Firebug中使用,以防我做了一些愚蠢的事情:

 function randomList() { var list = []; for (var i = 0; i < 1000000; i++) { list.push("" + Math.floor(Math.random()*4000000000)); } return list; } function testParseInt(list) { console.log("Sanity check: parseInt('" + list[0] + "') = " + parseInt(list[0]) ); var start = new Date(); for (var string in list) var tmp = parseInt(string); var time = new Date() - start; console.log("parseInt(string): " + time); } function testMinusZero(list) { console.log("Sanity check: '" + list[0] + "' - 0 = " + (list[0] - 0)); var start = new Date(); for (var string in list) var tmp = string - 0; var time = new Date() - start; console.log("string - 0: " + time); } function testUnaryPlus(list) { console.log("Sanity check: +'" + list[0] + "' = " + (+list[0])); var start = new Date(); for (var string in list) var tmp = +string; var time = new Date() - start; console.log("+string: " + time); } function testPlusZero(list) { console.log("Sanity check: '" + list[0] + "' + 0 = " + (list[0] + 0) + " Oh no!"); var start = new Date(); for (var string in list) var tmp = string + 0; var time = new Date() - start; console.log("string + 0: " + time); } var numbers = randomList(); testParseInt(numbers); testMinusZero(numbers); testUnaryPlus(numbers); testPlusZero(numbers); 

可能只是一种迫使左手边变成整数的简单方法。 当然,并不像调用函数那样清晰。

关于类型转换的本教程说明:

除串联/加法运算符之外的任何数学运算符都将强制进行类型转换。 因此,将字符串转换为数字可能需要对不会影响结果数的数字的字符串表示执行数学运算,例如减零或乘以1。

这也表明“减去”是一个比“减”更好的搜索词。 🙂

将JS字符串强加给数字的各种方法及其后果:

使用上述技术转换各种字符串的结果http://sofzh.miximages.com/javascript/string_to_number.png

我个人使用*1因为它是短的打字,但仍然突出(不像一元+),并且或者给我用户输入或完全失败的内容。 当我知道最后会有非数字内容忽略,或者我需要解析非基数为10的字符串时,我只使用parseInt()

只是一个信息,根据这个网站

使用一元+运算符比以下任何一个(包括’ – 0’)更快:

 var numValue = stringValue - 0; /* or */ var numValue = stringValue * 1; /* or */ var numValue = stringValue / 1; 

一元+运算符也将其操作数类型转换为数字,因为它不执行任何其他数学运算,所以它是将字符串类型转换为数字的最快方法。

这与詹姆斯的基准相矛盾,尽管他可能是正确的。 我认为如果jQuery很慢,jQuery就不会使用这种语法。

使用此语法的主要原因是,如果您的通用代码可能是任何数字(int或float),并且您希望进行类型敏感的比较(===)

如果它不是丢失的旧遗物,那么它只是尝试将类型更改为数字。

对我来说,它看起来真的像一个“高性能”的parseInt。