1. JavaScript / Говнокод #16335

    +155

    1. 1
    Object.prototype.toString.call(o).match(/\[object (\w+)\]/)[1];

    Реализация typeof

    Запостил: kissarat, 15 Июля 2014

    Комментарии (10) RSS

    • Взято из https://github.com/LeaVerou/prism/blob/af7a42a414a7d061f1b7546804b1212726390847/prism.js , строка 33
      Ответить
    • Ну, к слову, этот тайпоф будет повменяемее настоящего...

      По крайней мере null и [] для него это Null и Array, а не object и object.
      Ответить
      • А еще есть instanceof
        Ответить
        • Но он не работает на примитивах (по понятным причинам).
          Ответить
          • Поэтому и существует ещё и typeof )
            Имя прототипа можно получить с помощю .constructor.name
            Ответить
            • Ага. Особенно у null и undefined :) Свойство функций name нестандартное и отсутствует в IE, его использование для получения имени внутреннего класса - вот настоящее говно. Как бы коряво использование Object.prototype.toString.call для получения внутреннего класса не выглядело - это общепринятый и единственный правильный подход. Вместо того, что бы что-то называть говном хотя бы в основы вникли.
              Ответить
              • > единственный правильный подход
                Если классы наши, то уж лучше вручную им typeid'ы прописать.
                Ответить
                • Не о тех 'классах' речь. У инстансов пользовательских конструкторов внутренний класс всегда будет 'Object'. Этот трэш решает другую проблему:
                  function classof(it){
                    return Object.prototype.toString.call(it).slice(8, -1);
                  }
                  
                  // число - примитив
                  var num = 42;
                  typeof num;            // => 'number'
                  num instanceof Number; // => false
                  classof(num);          // => 'Number'
                  
                  // число - объект
                  var num = new Number(42);
                  typeof num;            // => 'object'
                  num instanceof Number; // => true
                  classof(num);          // => 'Number'
                  
                  // совсем не число, но хрен отличишь
                  var num = Object.create(Number.prototype);
                  typeof num;            // => 'object'
                  num instanceof Number; // => true
                  classof(num);          // => 'Object'
                  Ответить
              • Зачем столь абстрактная функция?
                Ответить
    • Не typeof, а, гмм, classof, т.к. внутреннее свойство [[Class]] выдирает, да и говно разве что в .match вместо .slice(8, -1).
      Ответить

    Добавить комментарий