建站教程

建站教程

Products

当前位置:首页 > 建站教程 >

Javascript中判断数组的正确姿势(js判断一个对象是否是数组的方法)

GG网络技术分享 2025-03-18 16:13 0


Javascript中判断数组的正确姿势

51RGB

在 Javascript 中,如何判断一个变量是否是数组?

最好的方式是用 ES5 提供的 Array.isArray 方法(毕竟原生的才是最屌的):

但是鉴于低版本 IE 不支持 ES5,如需兼容,需要想想别的办法。

typeof?

我们都知道,数组是特殊的对象,所以数组的 typeof 结果也是 object,而因为 的结果也是 object,所以如需用 typeof 运算符来判断数组,需要这么写:

instanceof?

来回忆下 instanceof 运算符的使用方式。a instanceof b,如果返回 true,表示 a 是 b 的一个实例。那么如果 a instanceof Array 返回 true,是不是就说明 a 是 数组类型呢?跟 instanceof 师出同门的还有 constructor,是否同样可以判断呢?

答案是否定的,需要注意嵌套 frame 的情况。

index.htm 代码:

a.htm 代码:

我们看到 index.htm 代码中,变量 a 确实是一个数组,但是 a instanceof Array 的结果却是 false。

这是因为每个 frame 都有一套自己的执行环境,跨 frame 实例化的对象彼此不共享原型链。如果打印 a instanceof window.frames[0].Array,那么结果就是 true 了。

特性嗅探?

也不靠谱,万一某个对象正好有值为 sort 的 key 呢?

正确的姿势是使用 Object.prototype.toString 判断:

事实上,这也是一些类库进行数组(甚至其他类型)判断的主流方式。

比如在 jQuery 中进行数组判断的相关代码(PS:摘自 jQuery 1.10.1,最近版本的 jQuery 只保留了 Array.isArray(),没有对不支持 ES5 的浏览器做兼容):

代码很清晰,如支持原生的 Array.isArray,则直接判断,不支持的话调用 toString 进行判断。同时可以看到很多其他类型变量的判断也是基于 toString 方法。当然这里说的 toString 均是 Object 原型链上的 toString 方法。

Object.prototype.toString 为何能返回这样类型的字符串?

ECMA-262:

上面的规范定义了 Object.prototype.toString 的行为:首先,取得对象的一个内部属性[[Class]],然后依据这个属性,返回一个类似于 “[object Array]” 的字符串作为结果([[]]用来表示语言内部用到的、外部不可直接访问的属性,称为 “内部属性”)。利用这个方法,再配合 call,我们可以取得任何对象的内部属性 [[Class]],然后把类型检测转化为字符串比较,以达到我们的目的。还是先来看看在 ECMA 标准中 Array 的描述吧:

所以 Javascript 中判断数组的函数可以这样写:

Read More:

  • Javascript数组类型检测:编写更强壮的isArray函数

  • JavaScript:Object.prototype.toString方法的原理

作者:韩子迟

网址:http://www.cnblogs.com/zichi/p/5103842.html

想认识志同道合的朋友一起学习web

加入我们的学习QQ群 190166743

丰富的学习资源,周一到周四免费直播公开课

每天直播公开课在线视频和下载

你可能感兴趣的精彩内容

微信:UI设计自学平台加关注

长按关注:《UI设计自学平台》

↓↓↓

js判断一个对象是否是数组的方法

很多朋友在使用JavaScript时不知道js判断一个对象是否是数组的方法,今天小编举例为大家分析一下。

1、typeof操作符

实例:

// 数值

typeof 37 === \'number\';

// 字符串

typeof \'\' === \'string\';

// 布尔值

typeof true === \'boolean\';

// Symbols

typeof Symbol() === \'symbol\';

// Undefined

typeof undefined === \'undefined\';

// 对象

typeof {a: 1} === \'object\';

typeof [1, 2, 4] === \'object\';

// 下面的例子令人迷惑,非常危险,没有用处。避免使用它们。

typeof new Boolean(true) === \'object\';

typeof new Number(1) === \'object\';

typeof new String(\'abc\') === \'object\';

// 函数

typeof function() {} === \'function\';

从上面的实例我们可以看出,利用typeof除了array和null判断为object外,其他的都可以正常判断。

2、instanceof操作符 和 对象的constructor 属性

这个操作符和JavaScript中面向对象有点关系,了解这个就先得了解JavaScript中的面向对象。因为这个操作符是检测对象的原型链是否指向构造函数的prototype对象的。

实例:

js判断一个对象是否是数组的方法 (https://www.wpmee.com/) javascript教程 第1张

3、使用 Object.prototype.toString 来判断是否是数

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

Object.prototype.toString.call( function(){} ) === \'[object Function]\' // true

4、使用 原型链 来完成判断这里使用call来使 toString 中 this 指向 obj。进而完成判断

[].__proto__ === Array.prototype // true

var fun = function(){}

fun.__proto__ === Function.prototype // true

5、Array.isArray()

Array.isArray([])  // true

ECMAScript5将Array.isArray()正式引入JavaScript,目的就是准确地检测一个值是否为数组。IE9+、 Firefox 4+、Safari 5+、Opera 10.5+和Chrome都实现了这个方法。但是在IE8之前的版本是不支持的。

以上就是js判断一个对象是否是数组的方法。

标签: 直播

提交需求或反馈

Demand feedback