是否将某种JavaScript性能技巧归结为零?

Jam*_*man 18 javascript jquery

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

nth: function(elem, i, match){
    return match[3] - 0 === i;
},
Run Code Online (Sandbox Code Playgroud)

我对这个片段非常好奇 match[3] - 0

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

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

unw*_*ind 14

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

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

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

这也表明"减去"是一个比"减"更好的搜索词.:)


Phr*_*ogz 10

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

使用上述技术转换各种字符串的结果http://phrogz.net/JS/string_to_number.png

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


Jam*_* M. 9

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

更新:

我的"快速而肮脏"的基准测试不是很有用,因为它只是在循环中转换字符串"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);
Run Code Online (Sandbox Code Playgroud)

  • 为什么会这样? (3认同)

YOU*_*YOU 5

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

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

var numValue = stringValue - 0;
/* or */
var numValue = stringValue * 1;
/* or */
var numValue = stringValue / 1;
Run Code Online (Sandbox Code Playgroud)

unary + operator也将其操作数类型转换为数字,因为它不进行任何额外的 数学运算,所以它是将字符串类型转换为数字的最快方法.

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