Подтвердить что ты не робот

Является ли Subtracting Zero каким-то трюком производительности JavaScript?

В ядре jQuery я нашел следующее соглашение о коде:

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

И мне действительно понравился фрагмент match[3] - 0

Охота на "-0" в google не слишком продуктивна, и поиск "минус нуля" возвращает ссылку на песню Боба Дилана.

Итак, может кто-нибудь мне сказать. Это какой-то трюк производительности или есть причина для этого, а не parseInt или parseFloat?

4b9b3361

Ответ 1

Основываясь на нескольких быстрых и грязных тестах, "1234" - 0 был примерно на 50% быстрее, чем parseInt("1234") и на 10% быстрее, чем +"1234" в Firefox 3.6.

Update:

Мой "быстрый и грязный" тест был не очень полезен, потому что он просто преобразовал строку "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);

Ответ 2

Наверное, это просто короткий способ заставить левую сторону в целое. Не так ясно, как вызов функции, конечно.

В этом руководстве по преобразованию типов указано:

Любой математический оператор, кроме оператор конкатенации/сложения будет принудительное преобразование типа. Итак, конверсия строки к числу может повлечь за собой выполняя математическую операцию по строковое представление число, которое не повлияет на результирующее число, например вычитание ноль или умножение на единицу.

Это также показывает, что "вычитание" является лучшим поисковым термином, чем "минус".:)

Ответ 3

Различные способы приведения строк JS к числам и их последствия:

Results of converting various strings using the above techniques
(источник: phrogz.net)

Я лично использую *1, так как он короток для ввода, но все еще выделяется (в отличие от унарного +), и либо дает мне то, что набрал пользователь, либо дает сбой. Я использую parseInt() только тогда, когда знаю, что в конце будет нечисловой контент, который нужно игнорировать, или когда мне нужно проанализировать строку не-base-10.

Ответ 4

Просто информация, согласно этот сайт

с использованием оператора унарного + быстрее одного из следующих (включая "- 0" ):

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

Унарный + оператор также преобразует тип его операнд к числу и потому что он не делает никаких дополнительныхматематических операций это Самый быстрый метод для преобразования типа string в число.

Это противоречит критерию Джеймса, хотя он может быть и прав. Я думаю, что jQuery не использовал бы этот синтаксис, если бы он был медленным.

Ответ 5

Основная причина использования этого синтаксиса заключается в том, что у вас есть общий код, который может быть любым числом (int или float), и вы хотите выполнить сравнение типа (===)

Ответ 6

Если это не старая реликвия, которая потерялась, тогда она просто пытается изменить тип на Number.

Ответ 7

Это действительно выглядит как "исполнитель" parseInt для меня.