判断数据类型
1、toString()
1 var arr = [1,2,3]; 2 console.log(arr.toString());//1,2,3 3 4 var bo = true; 5 console.log(bo.toString());//true 6 7 var date = new Date(); 8 console.log(date.toString());//Fri Nov 17 2017 15:18:18 GMT+0800 (中国标准时间) 9 10 var m = function(){ 11 return false; 12 } 13 console.log(m.toString());//function (){return false;} 14 15 var num = 123; 16 console.log(num.toString());//123 17 18 var s = "abc"; 19 console.log(s.toString());//abc 20 21 var a={"name":"zhangsan"}; 22 console.log(a.toString());//[object Object] 23 24 console.log(typeof(arr));//object 25 console.log(typeof(null));//object 26 console.log(typeof(a));//object 27 console.log(Object.prototype.toString.call(arr));//[object Array] 28 console.log(Object.prototype.toString.call(null));//[object Null] 29 console.log(Object.prototype.toString.call(a));//[object Object]
通过上面例子我们则可以看到toString()为何能区分数组,null以及对象。typeof对数组,null以及对象判断的结果都是object,所以区分它们三者的一种办法即使用Object的原型上的方法toString
此处加一知识点:call和apply。
call和apply都可以改变this的指向,apply
方法,它接收两个参数,第一个参数就是需要绑定的this
变量,第二个参数是Array
,表示函数本身的参数。call和apply不同的是——apply()
把参数打包成Array
再传入;call()
把参数按顺序传入;
比如调用Math.max(3, 5, 4)
,分别用apply()
和call()
实现如下:
Math.max.apply(null, [3, 5, 4]); // 5 Math.max.call(null, 3, 5, 4); // 5
对普通函数调用,我们通常把this
绑定为null
。
所以Object.prototype.toString.call(arr))是将this指定到这个arr上了。
下面系统说一下判断数据是否为数组的方法:
2、数组的判断
法一:
function isArray(obj){ if(Array.isArray){ return Array.isArray(obj); }else{ return Object.prototype.toString.call(obj)==="[object Array]"; } }
法二:
Array.isArray(obj); //obj是待检测的对象
法三:
- 通过instanceof运算符来判断
注意:instanceof运算符左边是子对象(待测对象),右边是父构造函数(这里是Array),
即:子对象 instanceof 父构造函数
instance: 实例:凡是用new 构造函数()创建出的对象,都称为是构造函数的实例
arr instanceof Array
法四:
- 使用isPrototypeOf()函数
原理:检测一个对象是否是Array的原型(或处于原型链中,不但可检测直接父对象,还可检测整个原型链上的所有父对象)
使用方法: parent.isPrototypeOf(child)来检测parent是否为child的原型;
需注意的是isPrototypeOf()函数实现的功能和instancof运算符非常类似;
Array.prototype.isPrototypeOf(arr) //true表示是数组,false不是数组
法五:
利用构造函数constructor
obj.constructor == Array