更好的获取Javascript变量类型的方法?
在这篇文章中,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变量类型的不同方法,并介绍了一个新的方法来解决这个问题。但是,它也指出了一些可能的问题和改进的空间。
获取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版本解决这个问题。
这个方法在压缩代码后是否仍然有效,尚不清楚。
问题的出现原因:在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
方法并传入变量作为参数来获取变量的类型。这种方法相对稳定,不受代码压缩的影响,适用于大多数情况。
需要注意的是,这两种方法都有其局限性,例如null
和undefined
没有构造函数。此外,一些浏览器可能不支持constructor.name
方法。
JavaScript在获取变量类型方面存在一些困难,开发者需要根据具体情况选择合适的解决方法,并注意其中的潜在问题。