博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何准确判断一个对象是数组
阅读量:4130 次
发布时间:2019-05-25

本文共 2153 字,大约阅读时间需要 7 分钟。

答案: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]);  // trueArray.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"]

结果:

转载地址:http://sjuvi.baihongyu.com/

你可能感兴趣的文章
linux fork函数浅析
查看>>
javaWeb基础01-html
查看>>
javaWeb基础02-CSS
查看>>
javaWeb基础03-JavaScript
查看>>
javaWeb基础04-JQuery
查看>>
javaWeb基础05-mysql
查看>>
javaWeb基础07-jdbc
查看>>
Android Studio:Android Studio 打包流程
查看>>
开发工具:Eclipse关联Android系统源码的2种方法
查看>>
Android UI:PopupWindow基本学习
查看>>
Android基础:Android 按2次back键程序才退出
查看>>
Android基础:Android布局中gravity和layout_gravity的区别
查看>>
Android Studio Logcat的使用
查看>>
Android中级:recyclerView的使用
查看>>
Android Design:原生TabLayout+viewpaper+fragment实现滑动效果
查看>>
第三方开源库:SlidingMenu-Master实现侧拉效果
查看>>
Android基础:startActivityForResult+onActivityResult+setResult
查看>>
异常:The selected device is incompatible
查看>>
第三方SDK:RongCloud IMKit实现简单的单人会话
查看>>
Android基础:button imageview
查看>>