梳理数组相干的学问点
检测数组
- 1.instanceof
if (value instanceof Array) {
//对数组实行某项操纵
}
实用于网页中中有一个全局实行环境,当页面中存在多个框架时,就是存在多个全局实行环境,从一个框架向另一个框架通报数组,该数组与另一个框架原生建立的数组具有差别的组织函数,该状况下此种检测体式格局不实用。
- 2.Array.isArray() 要领
if (Array.isArray(value)) {
//对数组实行某些操纵
}
es5新增的要领,不是一切浏览器都实用。
- 3.Object.prototype.toString.call()
实用于一切环境,只支撑原生的对象,Object的toString()要领不能检测非原生组织函数的组织函数名。
推断基础范例:
Object.prototype.toString.call(null); // "[object Null]"
Object.prototype.toString.call(undefined); // "[object Undefined]"
Object.prototype.toString.call(“abc”);// "[object String]"
Object.prototype.toString.call(123);// "[object Number]"
Object.prototype.toString.call(true);// "[object Boolean]"
推断原生援用范例
var value = []
console.log(Object.prototype.toString.call(value))//"[Object Array]"
function fn(){
console.log("test");
}
Object.prototype.toString.call(fn);// "[object Function]"
var date = new Date();
Object.prototype.toString.call(date); // "[object Date]"
var arr = [1,2,3];
Object.prototype.toString.call(arr); // "[object Array]"
var reg = /[hbc]at/gi;
Object.prototype.toString.call(reg); // "[object RegExp]"
function Person(name, age) {
this.name = name;
this.age = age;
}
var person = new Person("Rose", 18);
Object.prototype.toString.call(arr); //”[object Object]”
该状况为自定义组织函数,返回的效果并非person是Person的实例。能够用instanceof推断。
console.log(person instanceof Person); // true
那为何不直接用obj.toString()呢?
toString要领的用法:toString要领返回反应这个对象的字符串。
console.log("jerry".toString());//jerry
console.log((1).toString());//1
console.log([1,2].toString());//1,2
console.log(new Date().toString());//Wed Dec 21 2016 20:35:48 GMT+0800 (中国标准时间)
console.log(function(){}.toString());//function (){}
console.log(null.toString());//error
console.log(undefined.toString());//error
一样是检测对象obj挪用toString要领,obj.toString()的效果和Object.prototype.toString.call(obj)的效果不一样,这是为何?
这是由于toString为Object的原型要领,而Array ,function等范例作为Object的实例,都重写了toString要领。差别的对象范例挪用toString要领时,依据原型链的学问,挪用的是对应的重写以后的toString要领(function范例返回内容为函数体的字符串,Array范例返回元素构成的字符串…..),而不会去挪用Object上原型toString要领(返回对象的详细范例),所以采纳obj.toString()不能获得其对象范例,只能将obj转换为字符串范例;因而,在想要获得对象的详细范例时,应当挪用Object上原型toString要领。
我们能够考证一下,将数组的toString要领删除,看看会是什么效果:
var arr=[1,2,3];
console.log(Array.prototype.hasOwnProperty("toString"));//true
console.log(arr.toString());//1,2,3
delete Array.prototype.toString;//delete操纵符能够删除实例属性
console.log(Array.prototype.hasOwnProperty("toString"));//false
console.log(arr.toString());//"[object Array]"
删除了Array的toString要领后,一样再采纳arr.toString()要领挪用时,不再有屏障Object原型要领的实例要领,因而沿着原型链,arr末了挪用了Object的toString要领,返回了和Object.prototype.toString.call(arr)雷同的效果。