Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Определение типа с помощью Object.prototype.toString.call (https://javascript.ru/forum/misc/5593-opredelenie-tipa-s-pomoshhyu-object-prototype-tostring-call.html)

Octane 25.10.2009 17:33

Определение типа с помощью Object.prototype.toString.call
 
alert(Object.prototype.toString.call(undefined));


Google Chrome 4
[object builtins]


Safari 4
[object DOMWindow]


Firefox 3.5, Opera 10
[object Window]


IE8, IE6
[object Object]


Тот же эффект с null. Ладно уж с DOM-элементами и коллекциями разные значения, но почему стандартные вещи по разному :(

Zeroglif 25.10.2009 18:27

Будешь смеяться, но все примеры абсолютно точно соответствуют требованиям стандарта. Вместо null/undefined в call подставляется глобальный объект. Для глобального объекта значение свойства [[Class]] может быть и есть implementation-dependent (15.1 ES). То есть там может быть что угодно. ;-)

Dmitry A. Soshnikov 25.10.2009 19:05

Цитата:

Сообщение от Zeroglif
Вместо null/undefined в call подставляется глобальный объект

Кроме, видимо, Chrome, который различает this-value для undefined и null.

alert(Object.prototype.toString()); // [object Object]
alert(Object.prototype.toString.call(undefined)); // [object builtins]
alert(Object.prototype.toString.call(this)); // [object global]

По идее, первые два вызова должны (по алгоритму Function.prototype.call, 15.3.4.4) подставить thisArg, как глобальный объект (а третий - и так глобальный объект), но Хром различает реально переданный undefined от непереданного значения.

Octane 25.10.2009 19:26

Я просто забыл, что toString будет вызвана в контексте window, когда первый аргумент метода call равен null или undefined… :) пойду отдохну, хватит сидеть за компом)


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