在 JavaScript 中查找变量类型

IT技术 javascript
2021-01-14 05:31:25

在 Java 中,您可以在变量上使用instanceOfgetClass()来找出其类型。

如何在非强类型的 JavaScript 中找出变量的类型?

例如,我怎么知道bar是 aBoolean还是 a Number,还是 a String

function foo(bar) {
    // what do I do here?
}
6个回答

使用typeof

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

所以你可以这样做:

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

但是,如果您使用对象包装器定义这些原语(您永远不应该这样做,请尽可能使用文字)时要小心:

> typeof new Boolean(false)
"object"
> typeof new String("foo")
"object"
> typeof new Number(42)
"object"

数组的类型仍然是object在这里,您确实需要instanceof操作员。

更新:

另一个有趣的方法是检查输出Object.prototype.toString

> Object.prototype.toString.call([1,2,3])
"[object Array]"
> Object.prototype.toString.call("foo bar")
"[object String]"
> Object.prototype.toString.call(45)
"[object Number]"
> Object.prototype.toString.call(false)
"[object Boolean]"
> Object.prototype.toString.call(new String("foo bar"))
"[object String]"
> Object.prototype.toString.call(null)
"[object Null]"
> Object.prototype.toString.call(/123/)
"[object RegExp]"
> Object.prototype.toString.call(undefined)
"[object Undefined]"

有了它,您就不必区分原始值和对象。

问题询问如何查找变量的类型您的答案显示了如何查找value的类型这些是完全不同的东西。
2021-03-17 05:31:25
更新我上面列出的函数定义:function getVariableType(object){ return(object === undefined ? "Undefined" : object.__proto__.constructor.name);
2021-03-21 05:31:25
使用proto .constructor.name 一个简单的函数的缺点是:function getVariableType(object){ return(object.__proto__.constructor.name); }
2021-04-05 05:31:25

typeof 仅适用于返回“原始”类型,例如数字、布尔值、对象、字符串和符号。您还可以instanceof用于测试对象是否属于特定类型。

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

var obj = new MyObj(10);

console.log(obj instanceof MyObj && obj instanceof Object); // outputs true
@JörgWMittag Care 解释一下你的意思?与其评论现有答案的问题(您复制粘贴整个),如果您只是发布自己的答案来解释差异会更好
2021-03-19 05:31:25
问题询问如何查找变量的类型您的答案显示了如何查找value的类型这些是完全不同的东西。
2021-03-20 05:31:25
@JörgWMittag 你正在分叉;我们知道 variablse 在 JavaScript 中有动态类型,并且 OP 显然是在试图找出变量包含的值的类型
2021-04-03 05:31:25
已经有正确答案了:stackoverflow.com/a/20369089/2988不用自己加了,答案很简单:JavaScript中的变量没有类型,所以无法获取变量的类型。
2021-04-08 05:31:25

使用type

// Numbers
typeof 37                === 'number';
typeof 3.14              === 'number';
typeof Math.LN2          === 'number';
typeof Infinity          === 'number';
typeof NaN               === 'number'; // Despite being "Not-A-Number"
typeof Number(1)         === 'number'; // but never use this form!

// Strings
typeof ""                === 'string';
typeof "bla"             === 'string';
typeof (typeof 1)        === 'string'; // typeof always return a string
typeof String("abc")     === 'string'; // but never use this form!

// Booleans
typeof true              === 'boolean';
typeof false             === 'boolean';
typeof Boolean(true)     === 'boolean'; // but never use this form!

// Undefined
typeof undefined         === 'undefined';
typeof blabla            === 'undefined'; // an undefined variable

// Objects
typeof {a:1}             === 'object';
typeof [1, 2, 4]         === 'object'; // use Array.isArray or Object.prototype.toString.call to differentiate regular objects from arrays
typeof new Date()        === 'object';
typeof new Boolean(true) === 'object'; // this is confusing. Don't use!
typeof new Number(1)     === 'object'; // this is confusing. Don't use!
typeof new String("abc") === 'object';  // this is confusing. Don't use!

// Functions
typeof function(){}      === 'function';
typeof Math.sin          === 'function';
使用没有问题Number(1), Boolean(true)...唯一的问题是当您使用new并创建一个装箱对象时,将它们用作函数实际上可以从其他类型转换有用。Boolean(0) === false, Number(true) === 1
2021-03-16 05:31:25
问题询问如何查找变量的类型您的答案显示了如何查找value的类型这些是完全不同的东西。
2021-03-23 05:31:25
怎么样nulltypeof null是“对象”
2021-03-26 05:31:25

在 Javascript 中,您可以使用 typeof 函数来做到这一点

console.log(typeof bar);
就像我在回答中提到的那样,typof 只会返回数字、布尔值、对象、字符串。对于确定任何其他类型(如 Array、RegExp 或自定义类型)没有用处。
2021-03-30 05:31:25
问题询问如何查找变量的类型您的答案显示了如何查找value的类型这些是完全不同的东西。此外,typeof是运算符而不是函数。
2021-04-05 05:31:25

比其他答案更精确一点(有些人可能会说迂腐):

在 JavaScript 中,变量(和属性)没有类型:值有。此外,只有 6 种类型的值:Undefined、Null、Boolean、String、Number 和 Object。(从技术上讲,还有 7 种“规范类型”,但您不能将这些类型的值存储为对象的属性或变量的值——它们仅在规范本身中使用,以定义语言的工作方式。值您可以明确操作的只有我列出的 6 种类型。)

当它想要谈论“x 的类型”时,规范使用符号“Type(x)”。这只是规范中使用的符号:它不是语言的特性。

正如其他答案所表明的那样,在实践中,您可能想知道的不仅仅是值的类型——尤其是当类型为 Object 时。无论如何,为了完整起见,这里是 Type(x) 的一个简单的 JavaScript 实现,因为它在规范中使用:

function Type(x) { 
    if (x === null) {
        return 'Null';
    }

    switch (typeof x) {
    case 'undefined': return 'Undefined';
    case 'boolean'  : return 'Boolean';
    case 'number'   : return 'Number';
    case 'string'   : return 'String';
    default         : return 'Object';
    }
}
还有符号
2021-04-03 05:31:25
ECMAScript 5.1 中没有,也没有。
2021-04-06 05:31:25