更好的获取Javascript变量类型的方法?

33 浏览
0 Comments

更好的获取Javascript变量类型的方法?

有没有比typeof更好的方法来获取JS变量的类型?当你这样做时,它可以正常工作:

> typeof 1
"number"
> typeof "hello"
"string"

但是当你尝试这样做时,它就无用了:

> typeof [1,2]
"object"
>r = new RegExp(/./)
/./
> typeof r
"function"

我知道instanceof,但这要求你事先知道类型。

> [1,2] instanceof Array
true
> r instanceof RegExp
true

有没有更好的方法?

0
0 Comments

在这篇文章中,Angus Croll提到了获取JavaScript变量类型的不同方法的优缺点,并定义了一种新的方法'toType'来解决这个问题。他提供的代码如下:

var toType = function(obj) {
  return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
}

但是他也指出了一个有趣的问题,当将一个"host"对象传递给该函数时,这段代码可能会出现问题,例如Internet Explorer的ActiveXObject实例。

此外,如果你创建了自己的对象类型(原型继承),你如何让它返回比"object"更具体的值呢?这个问题也在这里提出过,但从未得到解决。

如果你的类型命名中包含":"或"_",你可以将正则表达式扩展为match(/\s([a-z,_,:,A-Z]+)/)

对于像Uint8Array这样的类型,正则表达式还需要包括数字。相反,考虑使用更通用的match(/\s([^\]]+)/),它应该能处理任何情况。

作者还建议使用\w来代替这个解决方案。

这篇文章提供了获取JavaScript变量类型的不同方法,并介绍了一个新的方法来解决这个问题。但是,它也指出了一些可能的问题和改进的空间。

0
0 Comments

获取Javascript变量类型的更好方法是通过调用`{}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase()`来返回变量的类型。也可以使用ES7中的语法来实现相同的功能。

以下是使用该方法得到的一些结果:

typeOf(); //undefined

typeOf(null); //null

typeOf(NaN); //number

typeOf(5); //number

typeOf({}); //object

typeOf([]); //array

typeOf(''); //string

typeOf(function () {}); //function

typeOf(/a/) //regexp

typeOf(new Date()) //date

typeOf(new Error) //error

typeOf(Promise.resolve()) //promise

typeOf(function *() {}) //generatorfunction

typeOf(new WeakMap()) //weakmap

typeOf(new Map()) //map

typeOf(async function() {}) //asyncfunction

这个方法对于日期对象也适用。

在TypeScript中可能会出现错误,因为无法重新声明块作用域变量'toString'。可以尝试使用ES7版本解决这个问题。

这个方法在压缩代码后是否仍然有效,尚不清楚。

0
0 Comments

问题的出现原因:在JavaScript中,获取变量的类型是一种常见的需求。然而,JavaScript没有提供直接获取变量类型的内置方法,这导致了开发者需要寻找其他解决方案。

解决方法:以下是两种常见的解决方法。

1. 使用constructor.name方法:

[].constructor.name
new RegExp().constructor.name

这种方法通过获取变量的构造函数名称来间接获取变量的类型。然而,需要注意的是,这种方法可能在某些情况下会出现问题,特别是在代码被压缩时,constructor.name可能被压缩成与预期不符的结果。

2. 使用Object.prototype.toString.call方法:

Object.prototype.toString.call([])
Object.prototype.toString.call(/./)

这种方法通过调用Object.prototype.toString方法并传入变量作为参数来获取变量的类型。这种方法相对稳定,不受代码压缩的影响,适用于大多数情况。

需要注意的是,这两种方法都有其局限性,例如nullundefined没有构造函数。此外,一些浏览器可能不支持constructor.name方法。

JavaScript在获取变量类型方面存在一些困难,开发者需要根据具体情况选择合适的解决方法,并注意其中的潜在问题。

0