js判断数组的3个方法
1,Object.prototype.toString.call()
能准确的判断所有的数据类型类型
每一个继承Object的对象都有一个toString方法,如果toString方法没有被重写的话,会返回[Object type],其中type为对象的类型。
const arr = ["Hello", "World"]
arr.toString() // => "Hello,World"
Object.prototype.toString.call(arr) // => "[Object Array]"
除Object类型的对象外,其他类型直接使用toString()方法,会直接返回字符串。所以需要使用call或者apply方法来改变toString方法的执行上下文。
Object.prototype.toString.call('string')
Object.prototype.toString.call(1)
Object.prototype.toString.call(false)
Object.prototype.toString.call(Symbol(1))
Object.prototype.toString.call(function () {})
Object.prototype.toString.call({name: 'Jerry'})
Object.prototype.toString.call([1, 2, 3, 4])
Object.prototype.toString.call(null)
Object.prototype.toString.call(undefined)
image
2,instanceof
能检测array、function、object类型
instanceof用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上。简单说就是instanceof是用来判断 A 是否为 B 的实例,表达式:A(object) instanceof B(constructor)
1 instanceof Number
'str' instanceof String
true instanceof Boolean
[1,2,3] instanceof Array
function () {} instanceof Function
{} instanceof Object
image
instanceof 的缺点:
是否处于原型链上的判断方法不严谨
instanceof 方法判断的是是否处于原型链上,而不是是不是处于原型链最后一位,所以会出现以下情况:
var arr = [1, 2, 3]
arr instanceof Array // true
arr instanceof Object // true
function fn() {}
fn instanceof Function // true
fn instanceof Object // true
因为所有原型链的尽头都是Object
3, Array.isArray()
用于判断对象是否为数组
Array.isArray()是ES5推出的,不支持ES6~8,使用时应考虑兼容
if (typeof Array.isArray !== "function") {
Array.isArray = function (obj) {
return Object.prototype.toString.call(obj) == "[Object Array]"
}
}
网友评论