Скорость сравнения с нулевым и неопределенным в JavaScript - PullRequest
36 голосов
/ 02 сентября 2011

Я только что запустил очень простой тест производительности 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

Ответы [ 4 ]

18 голосов
/ 02 сентября 2011

null - зарезервированное ключевое слово, которое нельзя переопределить, поэтому, когда вы делаете сравнение с нулем, все, что вам нужно сделать, - это одно сравнение.

Однако, когда вы проверяете по undefined, движок должен выполнить поиск типа и затем сравнение, что означает, что на самом деле это немного более требовательно.


Если вам нужно проверить, не является ли что-то неопределенным, вы должны использовать

if(typeof notSet == "undefined"){ }

Доказательство

Попробуйте ... иустановите что-то на null в вашей консоли JavaScript.

null = "will error";
// Errors with --> ReferenceError: invalid assignment left-hand side

Однако, если вы попытаетесь сделать это с неопределенным значением, это не приведет к ошибке.Это не означает, что вы можете переопределить undefined, потому что вы не можете, но undefined является его собственным примитивным типом.

Единственное реальное сходство между нулевым и неопределенным - то, что они могут обабыть приведенным к логическому ложному.

1 голос
/ 26 февраля 2016

Я недавно обнаружил, что это:

 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));    
1 голос
/ 02 сентября 2011

Вы сравниваете с поиском переменной с именем undefined (которая возвращает неопределенное значение), поэтому она не выполняет то, что вы намеревались.

Есть способы проверить, является ли переменная неопределенной,Как упоминалось в других постерах, typeof x === 'undefined' - это одно.(Вероятно, существует другая возможность, что-то вроде hasOwnProperty('x'), выполняемое для глобального объекта, но это не проверяет цепочку областей действия.)

1 голос
/ 02 сентября 2011

если я думаю хорошо, они не одинаковы.поэтому вы не можете использовать null вместо undefined.

typeof! == "undefined" против! = null

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...