Скорость сравнения с нулевым vs undefined в JavaScript
Я только что запустил очень простой JavaScript тест производительности (не спрашивайте, почему). Тест объявляет переменную, но не присваивает ей ничего:
var x;
Затем он сравнивает скорость сравнения переменной значения с null
и с undefined
, другими словами:
var y = (x == null);
и var y = (x == undefined);
.
Я ожидал, что сравнение с undefined
будет поститься. На самом деле это было совсем близко. Сравнение с null
было самым быстрым, примерно на 80% быстрее.
Результаты, описанные выше, взяты из запуска тестов в Chrome (версия 13). Запуск их в Firefox дает результаты гораздо ближе к тому, что я ожидал (сравнение с undefined
выполняется быстрее, чем с null
, хотя и очень незначительно).
Итак, мой вопрос в том, что может быть причиной этого? Почему Chrome, похоже, так сильно отличается от null
?
Для быстрой справки, здесь снимок экрана результатов:
![enter image description here]()
Ответы
Ответ 1
null
- зарезервированное ключевое слово, которое нельзя переопределить, поэтому, когда вы делаете сравнение с пустым, все, что вам нужно сделать, это одно сравнение.
Однако, когда вы проверяете undefined
, движок должен выполнять поиск по типу, а затем сравнивать, что означает, что он на самом деле немного более требовательный.
Если вам действительно нужно проверить, есть ли что-то undefined, вы должны использовать
if(typeof notSet == "undefined"){ }
Доказательство
Попробуйте... и установите что-то в null
в вашей консоли JavaScript.
null = "will error";
// Errors with --> ReferenceError: invalid assignment left-hand side
Однако, если вы попытаетесь сделать это с помощью undefined, это не приведет к ошибке. Это не означает, что вы можете переопределить undefined
, потому что вы не можете, но что undefined
это собственный примитивный тип.
Единственное реальное сходство между нулем и undefined заключается в том, что они могут быть принудительно введены в логическое значение false.
Ответ 2
Если я думаю, что это не то же самое. поэтому вы не можете использовать null вместо undefined.
typeof! == "undefined" vs. null =
Ответ 3
Вы сравниваете поиск с переменной undefined
(которая возвращает значение undefined), поэтому она не делает то, что вы намеревались.
Есть способы проверить, есть ли переменная undefined. Как отмечали другие плакаты, typeof x === 'undefined'
- один. (Вероятно, существует другая возможность, которая похожа на hasOwnProperty('x')
, выполняемая на глобальном объекте, но не проверяющая цепочку областей.)
Ответ 4
Недавно я обнаружил, что это:
if (typeof this._minLat === 'undefined') {
this._minLat = Math.min(...this.points.map(point => point.lat));
}
return this._minLat;
кажется во много раз быстрее, чем это:
return this._minLat || Math.min(...this.points.map(point => point.lat));