2017-02-16 12 views
3

Я столкнулся со следующей таблицей, в которой указано свойство объекта [[Class]] и его соответствующее значение, которое возвращает оператор typeof.Понимание оператора typeof в Javascript

Value    Class  Type 
------------------------------------- 
"foo"    String  string 
new String("foo") String  object 
1.2     Number  number 
new Number(1.2)  Number  object 
true    Boolean boolean 
new Boolean(true) Boolean object 
new Date()   Date  object 
new Error()   Error  object 
[1,2,3]    Array  object 
new Array(1, 2, 3) Array  object 
new Function("") Function function 
/abc/g    RegExp  object (function in Nitro/V8) 
new RegExp("meow") RegExp  object (function in Nitro/V8) 
{}     Object  object 
new Object()  Object  object 

Одна вещь, чтобы отметить это typeof правильно возвращает примитивные типы данных, связанных с JavaScript.

Тем не менее, он возвращает object тип для массива, который наследует от Array.prototype, но возвращает тип function для функции, которая наследует от Function.prototype.

Учитывая, что все является объектом в Javascript (включая массивы, функции & примитивных объектов типа данных), я нахожу это поведение оператора typeof очень непоследовательным.

Может ли кто-нибудь проливать свет на то, как работает оператор typeof?

+0

Вы должны учитывать ** экземпляр ** при работе с объектами https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof – ymz

+0

Существуют только определенные типы с конкретным результатом. Каждый другой тип считается объектом. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof – Armin

+0

Если typeof возвратил 'object' для всего, так как все является объектом в javascript, это было бы совершенно бесполезно. –

ответ

2

Это немного странное, идиосинкразированное поведение Javascript. Он унаследован с самых ранних дней Javascript и, вероятно, сегодня не будет написан таким образом.

Тем не менее, мы находимся там, где находимся с Javascript, поэтому нам нужно иметь дело с этим!

Дело в том, что значения в Javascript являются либо объектами, либо примитивами. Это дизайнерское решение. Они не могут быть ничем иным. The types of primitives are:

  • строки
  • номера
  • булевы
  • символы (от ES2015)
  • особое значение undefined
  • особое значение null (для которых typeof также возвращает object)

Все, что угодно и все остальное, является объектом. Это по дизайну. Массивы - это объекты, поэтому typeof возвращает object, равно как и любой другой объект, который не является вызываемым (т. Е. Функция). См. the spec for typeof.

Лучше спросить , почему вы хотите проверить, если что-то такое массив. Вам, вероятно, не нужно, тем более, что такие объекты массива, как NodeLists, не являются массивами, но похожи на них разными способами.

Лучшим решением в большинстве случаев является вызов Array.from по предоставленному значению: тогда вы знаете, что это массив.

+0

Чтобы проверить массив, я мог бы использовать 'Array.isArray()' или 'instanceof'. Просто интересно, почему аномалия возвращаемого типа для функций и массивов. – nashcheez

+0

@nashcheez Ответ - историческое решение, что массивы не примитивы. – lonesomeday