Что лучше всего проверять тип переменной в javascript

<script type="text/javascript">   
function saveName (firstName) {
    function capitalizeName () {
        return firstName.toUpperCase();
    }
    var capitalized = capitalizeName();console.log(capitalized instanceof String);
    return capitalized; 
}
console.log(saveName("Robert")); // Returns "ROBERT"
</script>

Вопрос:

Я хочу проверить тип заглавной буквы, поэтому я использую capitalized instanceof String? Но он показывает: false в консоли, я не хочу попробовать capitalized instanceof Function, Object... Это займет слишком много времени, так что лучший способ определить тип переменной?

Ответ 1

Лучший способ - использовать ключевое слово typeof.

typeof "hello" // "string"

Оператор typeof отображает операнд в одно из шести значений: "string", "number", "object", "function", "undefined" и "boolean". Метод instanceof проверяет, находится ли прототип предоставленной функции в цепочке прототипов объекта.

Эта статья Wikibooks вместе с этой статьей MDN довольно хорошая работа по подведению типов JavaScript.

Ответ 2

typeof capitalized == 'string'

Ответ 3

Лучший способ - использовать typeof

typeof "blahha" 

Я сделал функцию с помощью кода библиотеки jQuery, метод типа библиотеки jQuery github link.

var getType = (function() {

    var objToString = ({}).toString ,
        typeMap     = {},
        types = [ 
          "Boolean", 
          "Number", 
          "String",                
          "Function", 
          "Array", 
          "Date",
          "RegExp", 
          "Object", 
          "Error"
        ];

    for ( var i = 0; i < types.length ; i++ ){
        typeMap[ "[object " + types[i] + "]" ] = types[i].toLowerCase();
    };    

    return function( obj ){
        if ( obj == null ) {
            return String( obj );
        }
        // Support: Safari <= 5.1 (functionish RegExp)
        return typeof obj === "object" || typeof obj === "function" ?
            typeMap[ objToString.call(obj) ] || "object" :
            typeof obj;
    }
}());

Вы можете назвать его getType("Hello")

Ответ 4

использовать typeof();

пример:

> typeof "foo"
"string"
> typeof true
"boolean"
> typeof 42
"number"

Итак, вы можете сделать:

if(typeof bar === 'string') {
   //whatever
}

Имейте в виду, что typeof хорош только для возвращения "примитивных" типов, числа, булевых, объектов, строк. Вы также можете использовать instanceof для проверки того, имеет ли объект определенный тип.

function MyObj(prop) {
  this.prop = prop;
}

var obj = new MyObj(10);

console.log(obj instanceof MyObj && obj instanceof Object); // outputs true

Ответ 5

Метод getVarType (ниже) работает практически для всех переменных. Проверьте эту скрипту. Сначала он использует очень быстрый тип для случаев, когда результаты являются надежными. Затем он использует более дорогой метод toString для других случаев. Наконец, если он имеет дело с именованным объектом (возвращаемым Firefox для таких объектов, как document.location), он проверяет объекты, подобные Array, и сообщает их как массивы.

В сравнении, typeof смущает плохо. typeof ([]) возвращает 'object', typeof (new Number()) возвращает объект. Он также возвращает "объект" для многих других переменных, которые не являются (для практических целей) объектами. Для сравнения см. Результаты скрипки.

  // Begin public utility /getVarType/
  // Returns 'Function', 'Object', 'Array',
  // 'String', 'Number', 'Null', 'Boolean', or 'Undefined'
  //
  getVarType = (function () {
    var typeof_map = {
      'undefined' : 'Undefined',
      'boolean'   : 'Boolean',
      'number'    : 'Number',
      'string'    : 'String',
      'function'  : 'Function',

      'Undefined' : 'Undefined',
      'Null'      : 'Null',
      'Boolean'   : 'Boolean',
      'Number'    : 'Number',
      'String'    : 'String',
      'Function'  : 'Function',
      'Array'     : 'Array',
      'StyleSheetList' : 'Array'
    };

    return function( data ) {
      var type, type_str;

      if ( data === null      ) { return 'Null'; }
      if ( data === undefined ) { return 'Undefined'; }

      type     = typeof( data );
      type_str = typeof_map[ type ];

      if ( type_str ) { return type_str; }

      type = {}.toString.call( data ).slice( 8, -1 );
      return typeof_map[ type ]
        || ( data instanceof Array ? 'Array' :
        ( data.propertyIsEnumerable(0) && data.length !== undefined
          ? 'Array' : 'Object' )
        );
    };
  }());
  // End public utility /getVarType/

Единственный возможный отказ возможен, если вы тестируете именованный массив, который пуст (например, пустой объект DOM, кроме StyleSheetList). Но при добавлении они могут быть добавлены к типу type_of_map по мере необходимости.

Я надеюсь, что это поможет!

Ответ 6

Тип переменной Javascript можно определить с помощью typeof/instanceOf.

Но как различать массивы и объекты, из-за:

typeof [] === typeof {}

Легко мы можем различать их там. Имя класса с toString:

function what(v) {
    if (v === null) return 'null';
    if (v !== Object(v)) return typeof v;
    return ({}).toString.call(v).slice(8, -1).toLowerCase();
}

Позвольте мне проверить функцию what:

what({}); // 'object'
what({abc: 123}); // 'object'

what([]); // 'array'
what([123, 'abc']); // 'array'

what(function() {}); // 'function'
what(setTimeout); // 'function'

what(/^what\.js$/); // 'regexp'

what(new Date()); // 'date'

what(null); // 'null'
what(undefined); // 'undefined'

what('abc'); // 'string'
what(123); // 'number'
what(12.3); // 'number'

what(true); // 'boolean'
what(false); // 'boolean'

Функция what предназначена только для проверки типа одной переменной. Как проверить сложную переменную.

Чтобы обработать этот случай, я делаю что-то на what(), с проектом с открытым исходным кодом с именем variable-type, очень прост в использовании, вы можете попробовать.