Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   false, true - это объект? (https://javascript.ru/forum/misc/40970-false-true-ehto-obekt.html)

ilja209 26.08.2013 18:09

false, true - это объект?
 
Как-то попробовал взять свойство у false, к пример:
false.a
и получил
undefined

Тогда решил посмотреть и обнаружил, что false это не примитив, а объект (если я правильно все понимаю), у которого есть конструктор Boolean().

Но одновременно
false instanceof Boolean

Выдает
false

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

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

Уточню вопрос:
У false есть свойство constructor.

И вопрос в том, откуда у примитивного типа поведение объекта?

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

Яростный Меч 26.08.2013 18:47

булы, числа и строки - элементарные типы.
для них есть объектные обертки.
вкратце тут http://javascript.ru/basic/types
ещё глянь http://dmitrysoshnikov.com/ecmascrip...umber-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

Да немного не понятно написал:)
Вот нашёл, тут вроде нормально разжевали.

ilja209 27.08.2013 12:04

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

ilja209 27.08.2013 13:00

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


Часовой пояс GMT +3, время: 17:13.