typeof
作用:用于判断一个一个表达式,(对象或者原始值),返回一个字符串。
类型 结果
Undefined ------------------ “undefined”
Null ------------------ “object” (历史遗留问题)
Boolean ------------------ “boolean”
Number ------------------ “number”
String ------------------ “string”
Symbol (ECMAScript 6 新增) ------------------ “symbol”
宿主对象(由JS环境提供) ------------------ Implementation-dependent
函数对象 ( [[Call]] 在ECMA-262条款中实现了) ------------------ “function”
任何其他对象 ------------------ “object”
alert(typeof(1));//number
alert(typeof("abc"));//string
alert(typeof(true));//boolean
alert(typeof(m));//undefined
由于typeof只能判断类型,因为typeof遇到null,数组,对象时都会返回object类型,所以当我们要判断一个对象是否是数组时或者判断某个变量是否是某个对象的实例则要选择使用另一个关键语法instanceof,instanceof返回的是一个布尔值
instanceof
作用:instanceof运算符用来判断一个构造函数的prototype属性所指向的对象是否存在另外一个要检测对象的原型链上。
语法:obj instanceof Object; //true 实例 obj 在不在Object构造函数中
var b = '123';
alert(b instanceof String); //false
alert(typeof b); //string
var c = new String("123");
alert(c instanceof String); //true
alert(typeof c); //objec
需要注意的是,instanceof只能用来判断对象和函数,不能用来判断字符串和数字等。
toString()
toString()的作用:
1、toString() : 把对象转成字符串
var arr = [1,2,3];
alert( typeof arr.toString() ); //类型被转为string类型了
alert( arr.toString() ); // '1,2,3'
2、想按照自己的方式将变量转成字符串,但又不行遵守他的规则
3、toString()应用,进位制转换
// 进位制转换
var num = 255;
// 将num转成16进制
alert(num.toString(16) ); //'ff'
4、toString()应用,例一toString()做类型的判断
每一种对象 构造函数 原型上 都有toString() 不同对象调用的toString()都是自己构造函数的原型空间
var arr = [];
alert( Object.prototype.toString.call(arr) == '[object Array]' ); //true
Array.isArray()
ECMAScript5将Array.isArray()正式引入JavaScript,目的就是准确地检测一个值是否为数组。IE9+、 Firefox 4+、Safari 5+、Opera 10.5+和 Chrome都实现了这个方法。但是在IE8之前的版本是不支持的。
在当前窗口引入框架,其实就是引入了window对象,当我们在判断iframe框架里的变量时使用arr instanceof Array 或者arr.constructor === Array,要注意这个Array是当前window对象的Array,而不是iframe里的window.Array,由于每个iframe都有一套自己的执行环境,跨frame实例化的对象彼此是不共享原型链的,因此导致上述检测代码失效所以会返回false.
总结:js里判断变量是数组还是对象的四种方法
(1)、constructor属性
实例对象的原型中有一个属性 constructor 指向 实例的构造函数
这个属性在我们使用js系统或者自己创建的对象的时候,会默认的加上,例如:
//用constructor判断,arr和obj本身没有constructor属性,但它的原型(prototype)上有
var arr = [1,2,3,1];
alert(arr.constructor === Array); // true
(2)、instanceof
instanceof是检测对象的原型链是否指向构造函数的prototype对象的,所以我们也可以用它来判断:
var arr = [1,2,3];
alert(arr instanceof Array); // true
判断数组一般解决方案
function getDataType(obj) {
if(obj === null){
return "null";
}else if(typeof obj === "object"){
if(obj instanceof Array){
return "array";
}else{
return "object";
}
}else{
return typeof obj;
}
}
(3)、toString()应用,例一toString()做类型的判断
每一种对象 构造函数 原型上 都有toString() 不同对象调用的toString()都是自己构造函数的原型空间
var arr = [];
alert( Object.prototype.toString.call(arr) == '[object Array]' ); //true
(4)、判断数组终极解决方案
var arr = [1,2,3];
function isArrayFn(obj){ //封装一个函数
if (typeof Array.isArray === "function") {
return Array.isArray(obj); //浏览器支持则使用isArray()方法
}else{ //否则使用toString方法
return Object.prototype.toString.call(obj) === "[object Array]";
}
}
alert(isArrayFn(arr));// true