Какой самый точный способ проверить переменные типа JavaScript? - PullRequest
0 голосов
/ 12 мая 2010

Мне нужно проверить тип переменной в JavaScript. Я знаю 3 способа сделать это:

  1. оператор instanceof: if(a instanceof Function)

  2. Тип оператора: if(typeof a=="function"

  3. метод toString (jQuery использует это): Object.prototype.toString.call(a) == "[object Function]"

Какой самый точный способ проверки типов между этими решениями? И почему? Пожалуйста, не говорите мне, что последнее решение лучше только потому, что это использует jQuery.

1 Ответ

1 голос
/ 12 мая 2010

Как насчет функции домашнего приготовления для определения переменной «тип»? Он также может определять тип пользовательских объектов:

function whatType(somevar){
    return String(somevar.constructor)
            .split(/\({1}/)[0]
            .replace(/^\n/,'').substr(9);
}
var num = 43
    ,str = 'some string'
    ,obj = {}
    ,bool = false
    ,customObj = new (function SomeObj(){return true;})();

alert(whatType(num)); //=>Number
alert(whatType(str)); //=>String
alert(whatType(obj)); //=>Object
alert(whatType(bool)); //=>Boolean
alert(whatType(customObj)); //=>SomeObj

На основании свойства конструктора переменных вы также можете сделать:

function isType(variable,type){
 if ((typeof variable).match(/undefined|null/i) || 
       (type === Number && isNaN(variable)) ){
        return variable
  }
  return variable.constructor === type;
}
/** 
 * note: if 'variable' is null, undefined or NaN, isType returns 
 * the variable (so: null, undefined or NaN)
 */

alert(isType(num,Number); //=>true

Теперь alert(isType(customObj,SomeObj) возвращает false. Но если SomeObj является нормальной функцией конструктора, она возвращает true.

function SomeObj(){return true};
var customObj = new SomeObj;
alert(isType(customObj,SomeObj); //=>true
...