Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Object.prototype.toString (https://javascript.ru/forum/misc/81067-object-prototype-tostring.html)

Faab 25.09.2020 09:48

Object.prototype.toString
 
В документации приведена возможность использования метода Объекта toString(), для определения типа объекта:
var toString = Object.prototype.toString;

toString.call(new Date);    // [object Date]
toString.call(new String);  // [object String]
toString.call(Math);        // [object Math]

// Начиная с JavaScript 1.8.5
toString.call(undefined);   // [object Undefined]
toString.call(null);        // [object Null]


Об этом свойстве метода toString(), я честно говоря не знал, пока не наткнулся там же, в описании полифила метода масиива from() на такое вот условие для проверки что функция "вызываема":
var toStr = Object.prototype.toString;
    var isCallable = function(fn) {
      return typeof fn === 'function' || toStr.call(fn) === '[object Function]';
    };



Вопрос собственно в чём: когда первое условие (typeof fn === 'function') может не сработать? Зачем расширили условие?

Лоэнрон 27.09.2020 07:34

Раз никто не отвечает - попробую я.
Меня данный вопрос тоже заинтересовал, но я не смог ничего нарыть.
По сути, начиная со спецификации 1997 года, typeof возвращает "function" для любого объекта с возможностью вызова
Цитата:

Object (native and
implements [[Call]])
https://www.ecma-international.org/p...pdf#sec-11.4.3

Потому, я предполагаю, учитывая, что данный фрагмент показан на сайте разработчиков, альтернатива дается исключительно с целью показать эту самую альтернативу. Чтобы показать все возможные способы.

Faab 29.09.2020 11:13

Я не знал что typeof возвращает "function" для любого с возможностью вызова. Спасибо, это интересно.


Я тоже так и ничего не нашёл. Единственное что я нарыл, то это фраза "Вы не можете переопределить то, что возвращается из typeof". Направление наверное верное, но не понимаю смысл , так как результат метода call() тоже уже никак не переопределить.


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