2013-02-14 3 views
4

Чтение через исходный код underscore.js я наткнулся на following line:Javascript idiom: Что делать, если (x === + x) делать?

... if (obj.length === +obj.length) { ... 

Это немного сбивает с толку для меня. Что на самом деле сравнивается здесь? Я считаю, что это что-то связано с обнаружением собственных массивов, но не может понять, что происходит на самом деле. Что делает +? Зачем использовать === вместо ==? И каковы преимущества производительности этого стиля?

ответ

6

+ принуждают значение на номер (так же, как !! принуждают его логическое значение).

if (x === +x) 

... может быть использован для подтверждения того, что x сама содержит целое число. В этом случае может быть необходимо убедиться, что свойство length из obj является целым числом и не было перезаписано строковым значением, так как это может привести к итерации, если obj рассматривается как массив.

+0

В JavaScript нет целых чисел. –

+0

'+ '5.5'' '5.5', вы ищете _Number_. (& @ Salman, Integers будут введены в ES6) –

+2

Чтобы быть точным, '+' является ярлыком для 'parseFloat', а не' parseInt'. Таким образом, он вызывает значение для float (или * «Number» * type). – VisioN

1

Это глупый (ИМО) способ проверки, если obj.length является Number. Это лучше:

typeof obj.length == "number" 
+3

Почему это глупо? Какая предпочтительная альтернатива? – Saintali

+0

Я не думаю, что это глупо. Возможно, это даже быстрее, чем 'typeof'. – VisioN

+0

ленивый? да .. глупо? nahhh ... 'Number (obj.length)' гораздо больше, чтобы ввести;) – itsid

1

+ coheres, что на правой стороне, чтобы быть числом.

В этом случае, если длина не была определена для объекта undefined, будет возвращена. + undefined даст Nan, и эта оценка будет ложной.

Если строка может быть coheres-й изд на некоторое число, то это будет .. например + '1' даст 1 как Number это особенно важно при работе с шестигранными значениями в виде строки, например, +'0x7070'28784

+0

Интересно. Я предполагаю, что значение '+ 'everthing, но число« 'также является« NaN »? – Saintali

+0

Обновлен мой ответ, чтобы уточнить! Если вам нужно что-нибудь еще, дайте мне знать! – Jay

+0

Это круто. Благодаря! – Saintali

Смежные вопросы