Некоторые люди хотели бы написать:

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 раз больше за операцию сравнения.