如何准确判断一个对象是数组

答案:Object.prototype.toString.call([]) 返回 "[object Array]"

扩展答案

  • [].slice (能力判断 )

  • [] instanceof Array(类型判断)

  • [].proto === Array.prototype

  • Array.isArray([]) 存在兼容问题

数组也是引用类型,通过 typeof 依然返回 object

 

详细解析:

背景 —— typeof {}和typeof []的结果都是object,对象是对象,数组也是对象,js中万物皆对象,很显然,通过简单的typeof运算符不能判断一个对象是不是数组类型。

alert(typeof {});               // 返回字符串"object" 
alert(typeof []);               // 返回字符串"object " 

在js中一个对象一旦被创建,在内部会携带创建对象的类型名,一旦创建就不能被修改了。那么怎么获取这个对象的类型名呢?

js中提供了,调用对象原型中的toString方法, Object.prototype.toString.call(obj);因为很多对象继承的 toString() 方法被重写了,为了能够调用正确的 toString() 版本,也就是最原始的版本。可以使用 Function.call() 的方法,其中 call 可以这么理解,相当于 obj 去借用这个 Object.prototype.toString();

扩展

2. [] instanceof Array(类型判断)

 typeof 和 instanceof 的区别:

两者都可以用来判断变量,typeof会返回基本类型,而instanceof只会返回一个布尔值。

3. [].proto === Array.prototype

在JS里,万物皆对象。对象具有属性__proto__,称为隐式原型。每个函数实例对象都拥有一个__proto__属性,而这个属性指向了函数的prototype。

4. Array.isArray([]) 存在兼容问题

Array.isArray([1, 2, 3]);  // true
Array.isArray({foo: 123}); // false

1. [].slice (能力判断 )

slice(start,end)(参数可选)

slice() 方法返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新数组对象。原始数组不会被修改。

原数组:arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];

var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
result = arr.slice(0,-1); // 从索引0开始,到索引最后一个结束,不包括最后索引项
console.log(result);  //输出:(6) ["A", "B", "C", "D", "E", "F"]

结果:

 

var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
result = arr.slice(-1); //最后索引项的获取
console.log(result);  //输出:["G"]

结果:

 

var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
result = arr.slice(0,6); // 从索引0开始,到索引6结束,不包括最后索引项
console.log(result); //输出:(6) ["A", "B", "C", "D", "E", "F"]

结果:

 

var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
result = arr.slice(0,7); //  从索引0开始,到索引6结束,获取全部元素
console.log(result); //输出:(7) ["A", "B", "C", "D", "E", "F", "G"]

结果:

 

var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
result = arr.slice(); // 默认获取全部元素
console.log(result); //输出:(7) ["A", "B", "C", "D", "E", "F", "G"]

结果:

 

var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
result = arr.slice(-2,-1); // 倒序索引6开始,倒数第二个元素
console.log(result); //输出:["F"]

结果:

 

var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
result = arr.slice(-3,-1); // 倒序索引6开始,倒数第3个元素开始,不包括最后一个元素
console.log(result); //输出:(2) ["E", "F"]

结果:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值