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

Скорость сравнения с нулевым 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

4b9b3361

Ответ 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));