2014-01-25 2 views
6

я просматривал underscore.js annotated source, когда я столкнулся с этим:Когда объект obj.length не равен + obj.length?

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

теперь я знаю от this stackoverflow question что знак плюс (+) оператор возвращает числовое представление объекта.

Сказанное, obj.length возвращает число. Когда obj.length не будет +obj.length?

+5

гарантирует, что длина содержит фактическое число, а не строку, представляющую число .. (* потому что он использует '===', который также проверяет тип *). Таким образом, он увеличивает защиту от передачи ему случайного объекта, который имеет свойство 'length'. –

ответ

1

Когда, например:

var obj = { 
    0: 'first', 
    length: '1' 
}; 

alert(obj.length === +obj.length); 

Подчеркивание-х each является общим, поэтому может работать с другими другими, чем array объектов. Аналогично ECMA5 forEach

Функция forEach намеренно является общей; он не требует, чтобы это значение было объектом Array. Поэтому он может быть передан другим типам объектов для использования в качестве метода. Может ли функция forEach успешно применяться к объекту хоста, зависит от реализации.

Таким образом, подчеркивание проверяет действительность объекта length. И они считают объект arrayLike, для этого метода итерации, только если объект length возвращает number, который не является NaN, и, безусловно, не является string. Таким образом, в моем примере выше obj провалится на свою итерацию keys, если нет нативного/полифорированного forEach.

5

Оператор === не выполняет никаких приемов при его проверке, поэтому различные типы данных немедленно возвращают false, даже если '5' == 5. +, как вы сказали, выводит объект в число. Если вы задаете число в число, оно по-прежнему является числом, поэтому вы в основном проверяете, существует ли ваш номер object.length, и это число. Такие значения, как undefined, NaN, null, string и другие возвращаются false. Вы не уверены в том, что происходит с OBJ, так что вы должны проверить ...

+0

Числовой примитив - объект с номером приведет к его ложному. – gsnedders

+0

Числовой объект - это объект, а не число, серьезно чувак –

+0

Ну вы * можете * сделать 'новый номер (num)', но это глупое – scrblnrd3

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