Вход

Просмотр полной версии : false, true - это объект?


ilja209
26.08.2013, 18:09
Как-то попробовал взять свойство у false, к пример:
false.a и получил undefined
Тогда решил посмотреть и обнаружил, что false это не примитив, а объект (если я правильно все понимаю), у которого есть конструктор Boolean().

Но одновременно
false instanceof Boolean
Выдает
false
Получается false не является экземпляром Boolean.

И теперь я плохо понимаю как это устроено. Был бы рад, если кто-нибудь объяснит. Или укажет пальцем мне в документацию, потому что я там не нашел (либо плохо искал).

Уточню вопрос:
У false есть свойство constructor.
http://s6.hostingkartinok.com/uploads/images/2013/08/35d61d13d81850f3b427ba7971ffd7fa.png
И вопрос в том, откуда у примитивного типа поведение объекта?

Ответ на вопрос:
http://habrahabr.ru/post/150730/

Яростный Меч
26.08.2013, 18:47
булы, числа и строки - элементарные типы.
для них есть объектные обертки.
вкратце тут http://javascript.ru/basic/types
ещё глянь http://dmitrysoshnikov.com/ecmascript/ru-chapter-7-2-oop-ecmascript-implementation/#boolean-string-i-number-obyektyi

ilja209
27.08.2013, 09:41
Честно говоря, обе эти статьи мало чем помогли разобраться.
То что есть объектные обертки - это я писал выше.

Там написано про примитивы:
Данные значения в реализации представляются напрямую на низком уровне. Они не являются объектами, у них нет прототипов, равно как и конструкторов.
Но вот, что мы имеет в консоли:
alse.constructor
function Boolean() { [native code] }
Как я понимаю, конструктор всё-таки есть.

Я бы почитал про объектное поведение примитива, зачем это так реализовано, и почему в конкретном true/false в свойстве prototype отсутствует ссылка на родителя (Boolean).

ilja209
27.08.2013, 09:49
Да, и еще такой нюанс, в консоли:
false.__proto__
Boolean {}

Получение свойства .__proto__ не очень красиво, но chrome мне его отдал, и мы видим, что есть прототип.

Skipp
27.08.2013, 10:55
Попробую показать вам на примере, думаю так будет понятнее:

alert(false instanceof Boolean);
alert((new Boolean('false')) instanceof Boolean);

аналогично

alert('' instanceof String);
alert((new String('')) instanceof String);

Суть в том, что объект Boolean и остальные типы данных не являются теми объектами которые создаются из этих литералов, используйте typeof, если необходимо сравнить тип, а не принадлежность к объекту.

Но это не работает только с примитивами.

alert([] instanceof Array);
alert([] instanceof Object);

ilja209
27.08.2013, 11:33
Суть в том, что объект Boolean и остальные типы данных не являются теми объектами которые создаются из этих литералов

Я слабо понял смысл этой фразы.

ilja209
27.08.2013, 11:34
alert([] instanceof Array);
alert([] instanceof Object);


Они как раз возвращают true

Skipp
27.08.2013, 11:49
Да немного не понятно написал:)
Вот (http://stackoverflow.com/questions/203739/why-does-instanceof-return-false-for-some-literals) нашёл, тут вроде нормально разжевали.

ilja209
27.08.2013, 12:04
Вопрос собственно больше в другом, откуда у примитивного типа поведение объекта?

ilja209
27.08.2013, 13:00
Объяснение нашел вот здесь:
http://habrahabr.ru/post/150730/

bes
27.08.2013, 20:14
я бы сказал, что есть алгоритмы работы конструкций, описанные в спецификации, всё остальное - лирика для удобства понимания/запоминания/использования

Riim
28.08.2013, 07:22
11.2.1 Доступ к свойствам (http://es5.javascript.ru/x11.html#x11.2.1)
8.7.1 GetValue (V) (http://es5.javascript.ru/x8.html#x8.7.1)
9.9 ToObject (http://es5.javascript.ru/x9.html#x9.9)