Если вы посмотрите на исходный код jQuery (или даже незавершенная производственная версия), вы увидите, что ветвь if (typeof value === "string" ...
кода значительно более сложна, чем окончательная версия else
, которая будет иметь место при прохождении номера.
Вот 1.4.4 код, если значение является строкой:
} else if (typeof value === "string" && !rnocache.test(value) &&
(jQuery.support.leadingWhitespace || !rleadingWhitespace.test(value)) &&
!wrapMap[ (rtagName.exec(value) || ["", ""])[1].toLowerCase() ]) {
value = value.replace(rxhtmlTag, "<$1></$2>");
try {
for (var i = 0, l = this.length; i < l; i++) {
// Remove element nodes and prevent memory leaks
if (this[i].nodeType === 1) {
jQuery.cleanData(this[i].getElementsByTagName("*"));
this[i].innerHTML = value;
}
}
// If using innerHTML throws an exception, use the fallback method
} catch(e) {
this.empty().append(value);
}
}
Вот что он делает с номером:
} else {
this.empty().append(value);
}
Очевидно, накладные расходы всех этих дополнительных проверок и вызовы функций. Я имею в виду, что даже в заявлении if
наверху есть три теста регулярных выражений, поиск по карте и строчка, сделанная в нижнем регистре —, и это до того, как мы войдем в тело утверждения (если мы это сделаем , возможно, одна из проверок возвращает false
), которая включает в себя дополнительное регулярное выражение (как часть параметризованной замены) и петлю ...
вероятно потому, что строки должны быть разобраны на содержание HTML, а номера нет. Попробуйте запустить тот же тест с .text вместо .html и посмотреть, есть ли еще большая разница. –
Я верю, потому что jquery анализирует строку как html. – Ish
Вы пытались использовать 'text' вместо' html'? Было бы интересно. –