Некоторые люди хотели бы написать:
if (typeof v == ‘undefined’) { … }
другие считают, что это должно быть
if (typeof v === ‘undefined’) { … }
Что касается стиля — меня это мало заботило. Но когда поступило заявление о снижении производительности — мне пришлось проверить это, и вот мой вывод:
При сознательном сравнении значений одного и того же типа двойные кавычки имеют тенденцию быть немного быстрее для строк и чисел, где тройные кавычки, как правило, немного быстрее. для ссылочных типов (объект, функции) и логических значений (wtf…?).
Очевидно — при поиске равенства между неизвестными типами — это означает, что произойдет приведение — вы должны по умолчанию использовать тройные кавычки, потому что приведение увеличивает стоимость на величину!
Так что — если вы не хотите запоминать, что для чего лучше, или если вы пишете линдер и хотите облегчить себе жизнь — можете предпочесть тройки.
(Однако в случае с примером выше — мы намеренно сравниваем строки и поэтому должны предпочесть двойные кавычки)
Результаты перед вами, взятые из REPL узла 6.
Подготовка инструментов:
> function double(a,b) { return a == b }
undefined
> function triple( a, b) { return a === b }
undefined
> cases = [];
[]
> function test(f) {
... cases.forEach(function(a) {
..... cases.forEach(function(b) {
......... f(a,b)
....... })
..... })
... }
undefined
> function messure(f, times) {
... var start = Date.now();
... while (--times) test(f);
... return Date.now() — start
... }
И для работы:
Сравнение строк
> cases = [‘dsf23sdfsd’,’sdffsdfds’,’sdffsdfds’,’sdffs765dfds’,’sdffsdfds’,’sdffs34dfds’,’sdffsdfds’,’sdff872sdfds’,’sddfffsdfds’] [ ‘dsf23sdfsd’, ‘sdffsdfds’, ‘sdffsdfds’, ‘sdffs765dfds’, ‘sdffsdfds’, ‘sdffs34dfds’, ‘sdffsdfds’, ‘sdff872sdfds’, ‘sddfffsdfds’ ] > messure(double, 100000) 286 > messure(double, 100000) 268 > messure(double, 100000) 271 > messure(double, 100000) 264 > messure(double, 100000) 273 > messure(triple, 100000) 285 > messure(triple, 100000) 294 > messure(triple, 100000) 291 > messure(triple, 100000) 284 > messure(triple, 100000) 400
Сравнение чисел
> cases = [1,3,4,6,7,2,-3,0.4] [ 1, 3, 4, 6, 7, 2, -3, 0.4 ] > messure(triple, 100000) 231 > messure(triple, 100000) 232 > messure(triple, 100000) 230 > messure(double, 100000) 213 > messure(double, 100000) 219 > messure(double, 100000) 215
Сравнение логических значений:
> cases = [ true, false, true, false, false, true, true, false] [ true, false, true, false, false, true, true, false ] > messure(triple, 100000) 229 > messure(triple, 100000) 220 > messure(triple, 100000) 219 > messure(double, 100000) 289 > messure(double, 100000) 284 > messure(double, 100000) 299
…Что за хрень?
Сравнение объектов
> cases = [ {}, [], {}, [], {}, {}, [] ]
[ {}, [], {}, [], {}, {}, [] ]
> messure(double, 100000)
187
> messure(double, 100000)
188
> messure(double, 100000)
194
> messure(double, 100000)
186
> messure(triple, 100000)
169
> messure(triple, 100000)
169
> messure(triple, 100000)
168
> messure(triple, 100000)
169
Сравнение объектов, включая нули
> cases = [ {}, [], null, {}, [], null, {}, {}, [] ]
[ {}, [], null, {}, [], null, {}, {}, [] ]
> messure(triple, 100000)
287
> messure(triple, 100000)
258
> messure(triple, 100000)
257
> messure(double, 100000)
302
> messure(double, 100000)
285
> messure(double, 100000)
289
Сравнение функций
> cases = [console.log, console.error, function() {}, process.exit, require]
[ [Function: bound ],
[Function: bound ],
[Function],
[Function],
{ [Function: require]
resolve: [Function: resolve],
main: undefined,
extensions: { ‘.js’: [Function], ‘.json’: [Function], ‘.node’: Function] },
cache: {} ]
> messure(double, 100000)
116
> messure(double, 100000)
111
> messure(double, 100000)
113
> messure(double, 100000)
116
> messure(triple, 100000)
122
> messure(triple, 100000)
137
> messure(triple, 100000)
108
> messure(triple, 100000)
105
> messure(triple, 100000)
105
> messure(triple, 100000)
105
> messure(triple, 100000)
104
> messure(double, 100000)
111
> messure(double, 100000)
111
> messure(double, 100000)
111
> messure(double, 100000)
120
> messure(double, 100000)
112
Сравнение неизвестных типов
> cases = [ 123, ‘123’, ‘sadads’, null, undefined, {}, [] ]
[ 123, ‘123’, ‘sadads’, null, undefined, {}, [] ]
> cases.push(cases)
8
> messure(triple, 100000)
250
> messure(triple, 100000)
214
> messure(triple, 100000)
212
> messure(double, 100000)
1751
> messure(double, 100000)
1738
> messure(double, 100000)
1732
> messure(double, 100000)
1751
> messure(double, 100000)
1734
Если вы не знаете, что сравниваете и имеете в виду, что допускаете принуждение — приготовьтесь к штрафу в 8-9 раз больше за операцию сравнения.