JS检测数组

梳理数组相干的学问点

检测数组

  • 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)雷同的效果。

    原文作者:mingo
    原文地址: https://segmentfault.com/a/1190000015733301
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞