js判断数组和对象
提⽅案的时候顺便会引申⼀下该⽅法的使⽤。
⼀,instanceOf:(可以判断)
instanceOf运算符⽤来测试⼀个对象在其原型链中是否存在⼀个构造函数的prototype属性。
也可以这样说:instanceof运算符⽤来检测constructor.prototype是否存在于参数object的原型链上。
A instanceOf
B => 表⽰ A是否是B的实例
数组是Array的实例,对象是Object的实例
所以:
1 let arr=[1,2,3];
2 arr instanceof Array //true
3//多说⼀句
4 arr instanceof Object //true  因为Array是Object的⼦
从上⾯可以看出:可以⽤instanceof来区分数组和对象
另外,更重的⼀点是 instanceof 可以在继承关系中⽤来判断⼀个实例是否属于它的⽗类型。
1例如:
2function Foo(){}
3 Foo.prototype = new Aoo();//JavaScript 原型继承
4var foo = new Foo();
5 console.log(foo instanceof Foo)//true
6 console.log(foo instanceof Aoo)//true
7//⼜如:
8 console.log(Object instanceof Object);//true
9 console.log(Function instanceof Function);//true
10 console.log(Number instanceof Number);//false
11 console.log(String instanceof String);//false
12 console.log(Function instanceof Object);//true
13 console.log(Foo instanceof Function);//true
14 console.log(Foo instanceof Foo);//false
⼆,typeOf():(不可以判断)
它返回值是⼀个字符串,该字符串说明运算数的类型
typeof ⼀般只能返回如下⼏个结果:"number"、"string"、"boolean"、"object"、"function" 和 "undefined"。
(1)数字 typeof(x) = "number"
js原型和原型链的理解(2)字符串 typeof(x) = "string"
(3)布尔值 typeof(x) = "boolean"
(4)对象,数组和null  typeof(x) = "object"
(5)函数 typeof(x) = "function"
从(4)可以看出,typeof()故不能⽤来区分数组和对象,不能使⽤
我们可以使⽤ typeof 来获取⼀个变量是否存在,如 if(typeof a!="undefined"){alert("ok")},⽽不要去使⽤ if(a) 因为如果 a 不存在(未声明)则会出错。
三,String.call(arr)(可以判断)(更精准强烈推荐)
它返回[object constructorName]的字符串格式,这⾥的constructorName就是call参数的函数名,内置类型分为null、string、boolean、number、undefined、array、function、object、date、math
利⽤对象的toString可以准确判断是什么类型,call()改变this指向,这⾥是借⽤Object的⽅法,然后有⼈可能会问为什么不直接⽤String ⽽要借⽤Object的⽅法,
看下⾯的例⼦:
1 console.log(String.call("jerry"));//[object String]
2 console.log(String.call(12));//[object Number]
3 console.log(String.call(true));//[object Boolean]
4 console.log(String.call(undefined));//[object Undefined]
5 console.log(String.call(null));//[object Null]
6 console.log(String.call({name: "jerry"}));//[object Object]
7 console.log(String.call(function(){}));//[object Function]
8 console.log(String.call([]));//[object Array]
9 console.log(String.call(new Date));//[object Date]
10 console.log(String.call(/\d/));//[object RegExp]
11 console.log(String.call(new Person));//[object Object]
1//直接⽤toString
2 console.log("jerry".toString());//jerry
3 console.log((1).toString());//1
4 console.log([1,2].toString());//1,2
5 console.log(new Date().toString());//Wed Dec 21 201
6 20:35:48 GMT+0800 (中国标准时间)
6 console.log(function(){}.toString());//function (){}
7 console.String());//error
8 console.String());//error
因为toString为Object原型上的⽅法,⽽Array、Function都是Object的实例,实例重新改写了原型上的to
String⽅法,不同的对象调⽤toString⽅法,调⽤的是改写之后的⽅法(转成各种类型的字符串),⽽不会调⽤Object原型上的toString()⽅法,因此直接调⽤不能判断对象类型。
四,es6的⽅法——Array.isArray() (可以判断)
Array.isArray([]) //true
五,对象的constructor属性(可以判断)
1var arr = [1,2,3,1];
2 console.structor === Array)//true
3var obj = {a:1,b:2};
4 console.structor === Object)//true
努⼒到⽆能为⼒,拼搏到感动⾃⼰。fighting!!!!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。