2016-07-16 6 views
0

toString() возвращает "[тип объекта]", так что toString.call(new Date) возвращает [object Date] и toString.call(new String) возвращается [object String]. Мне любопытно, какой будет характер «[тип объекта]»: он не может быть массивом, как подразумевает использование []; если это объект, не будет ли более информативным синтаксисом {type: object}? Если это строка, почему бы просто не вернуться, например, «тип», где тип - это тип объекта, такой как Date и String?Что такое "[тип объекта]"

+1

Нет никаких особых причин для такого поведения, кроме того, что это сделала первоначальная реализация. Он просто работает именно так, и его нельзя изменить, потому что на него опирается огромное количество программного обеспечения. – Pointy

+1

Как отмечено, 'toString' возвращает строку, содержащую открывающую скобку, конструктор, тип и закрывающую скобку. Скобки не имеют особого значения, они не являются массивом, это всего лишь [** спецификация **] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.2. 4.2) говорится, что он должен быть возвращен. – adeneo

+0

Обратите внимание, что вы называете «тип» не [типом] (http://www.ecma-international.org/ecma-262/6.0/#sec-type). В ES5 это внутренний [[Class]], в ES6 - это нечто более сложное. – Oriol

ответ

3

Это именно то, что Javascript спецификации языка говорит метод toString должен сделать

  1. Если это значение не определено, возвращение «[объект Неопределенный]». Если значение равно null, верните «[объект Null]».
  2. Пусть O является результатом вызова ToObject, передающего это значение как аргумент.
  3. Пусть класс будет значение [[Class]] внутреннее свойство О.
  4. возвращают значение Строка, которая является результатом конкатенации три струны «[» объект, класс, и «]».

В oriol заостренным ECMAscript 2015 (также известный как ES6) сделал метод toString немного более сложной. То, как он узнает, какой тип объекта он имеет дело, немного более подробен. Вы можете увидеть новую спецификацию here Source

+1

Примечание. ES6 удален [[Класс]], теперь это [немного сложнее] (http://www.ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring). – Oriol

+0

'const letsBreakJQuery = {[Symbol.toStringTag]: 'Array'};' - позволяет сломать некоторые библиотеки :) –

+0

@Oriol обновил ответ, чтобы включить ссылку на новую спецификацию и способ обращения к вызову 'ToString' – eltonkamami

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