2013-04-11 2 views
4

Отрывок из underscore.js для объекта тестированияПроизводительность. Что делает Object (obj)?

_.isObject = function(obj) { 
    return obj === Object(obj); 
    }; 

Что именно это делает, что делает его проверять тип?

Jsperf показывает, что это быстрее, чем обычная проверка, поэтому она используется.

+0

Что вы подразумеваете под «обычной проверкой»? Если вы имеете в виду 'typeof', то есть также разница в поведении – Bergi

+0

Не могли бы вы ссылаться на этот тест jsperf? – Bergi

ответ

1

Что делает объект (obj)?

Прочитать спецификацию EcmaScript на The Object Constructor Called as a Function и abstract ToObject operation.

Что именно это делает, что заставляет его проверять тип?

Object(obj) только выход объект, который является strictly equal (===) к obj (то есть та же ссылка в качестве входного сигнала), когда вход был непримитивный значение (null, Booleans, строки, числа, undefined), т.е. EcmaScript Object (включая экземпляры String/Boolean/Number/Array, функции, другие объекты).

+0

Поскольку противоположность «примитивное значение» является «объектом», нет никаких оснований в инвертировании имени :-) – Bergi

+0

Что не так с этой скрипкой, вы ожидали, что что-то будет работать иначе, чем оно? – Bergi

+0

Нет, я не :-) Мы не говорим об объектных * литералах * (как они появляются в исходном коде), а о * объектах *, которые они могут представлять. Кстати, мы не говорим об объекте Object.prototype.toString и внутреннем [[class]] объекте, а также о языке Java. Если вы видите объекты как «ссылочный тип» и примитивы как «типы значений», это звучит отлично. – Bergi

5

Конструктор объектов создает обертку объекта для данного значения. Если значение равно null или undefined, оно создаст и вернет пустой объект, иначе он вернет объект типа, который соответствует данному значению.

Source

1

Я не могу найти соответствующую документацию, но это, кажется, что функция Object либо возвращает новый объект, который оборачивает переданному в значении или возвращает аргумент, если это уже объект; в противном случае тест === всегда будет возвращать значение false.

Object(5) === 5   // false, Object(5) creates Number object 
Object(null) === null // false, Object(null) creates an empty object 

var foo = { prop: 'value' }; 
Object(foo) === foo  // true!? Argument is not wrapped 

Похоже, что это поведение проверяет, является ли значение объектом.

Update

Оказывается, что это in the spec:

Когда функция Object вызывается без аргументов или с одним значением аргумента, предпринимаются следующие шаги:
1. Если значение является null, undefined или не поставляется, создает и возвращает новый объект Object точно так же, как если бы стандартный встроенный конструктор Object был вызван с теми же аргументами (15.2.2.1).
2. Return ToObject (значение).

И результат ToObject - это входной объект is also defined in the spec.