js数组类型检测

本文详细解析了在JavaScript中判断一个变量是否为数组的四种方法:通过constructor、instanceof、Array.isArray和toSting.call。文章还探讨了这些方法在不同场景下的适用性和局限性,并提供了一个小技巧来验证call方法的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文  http://www.cnblogs.com/Aralic/p/4470643.html

判断一个变量类型是不是数组

这里分为四种情况分析:
  1. 通过constructor

    [].constructor === Array; //true

    这种方法比较坑,不推荐,因为constructor是可以自己修改的。

  2. 通过instanceof

    [] instanceof Array; //true

    犀牛书给出的解释是在页面中含多个窗体或者iframe,那么会产生很多执行环境,一个iframe下的数组不是另一个窗体下构造函数的实例。那么如果出现这种极端条件,instanceof也不推荐使用。

  3. 通过Array.isArray

    在新版浏览器,IE9+都已经实现了原生方法

    Array.isArray([1,2]); //true

  4. 通过toSting

    Object.prototype.toString.call([]) === '[object Array]'

    在一些博客和犀牛书给出的都是这种方法。因为之前对call语法,toString方法的疑惑,导致我只能死记硬背这句代码。最近在回顾继承有关知识,学到了call方法,这段代码意思是对[]调用Object对象原型下的toString方法,不同于数组原型下的toString的方法,之所以疑惑,因为数组下的toString是把一个数组转成字符串。为了屏蔽掉call方法的干扰。

    我做了一个小处理

    Array.prototype.toString = Object.prototype.toString;
    [].toString(); // "[object Array]"

    验证出来了call的作用方法,同时也得出Array原型重写了toString方法(原型链关系推出来的)紧接着,去 MDN查阅Object原型的toString方法,看看这究竟是什么鬼?原来这个返回对象类型字符串。同时像时间对象,正则对象,数学对象等等都能返回出来。

    var toString = Object.prototype.toString;
    
    toString.call(new Date); // [object Date]
    toString.call(new String); // [object String]
    toString.call(Math); // [object Math]
    
    //Since JavaScript 1.8.5
    toString.call(undefined); // [object Undefined]
    toString.call(null); // [object Null]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值