一、js中判断数据类型的方法
js的七种数据类型:number、string、boolean、undefined、object、null、symbol和函数类型function。
方法一:typeof ,无法检验出数组、对象或null
typeof 2 // number
typeof null // object
typeof {} // object
typeof [] // object
typeof (function(){}) // function
typeof undefined // undefined
typeof '222' // string
typeof true // boolean
方法二:instanceof ,只能用来判断数组和对象,不能判断string和boolean类型,数组也属于对象。
var o = {'name':'lee'};
var a = ['reg','blue'];
console.log(o instanceof Object);// true
console.log(a instanceof Array);// true
console.log(o instanceof Array);// false
由于数组也属于对象,不能区分是数组还是对象,改进:封装一个方法判断数组和对象
var o = {'name':'lee'};
var a = ['reg','blue'];
var getDataType = function(o){
if(o instanceof Array){
return 'Array'
}else if( o instanceof Object ){
return 'Object';
}else{
return 'param is no object type';
}
};
console.log(getDataType(o));//Object。
console.log(getDataType(a));//Array。
方法三:constructor方法
var o = {'name':'lee'};
var a = ['reg','blue'];
console.log(o.constructor == Object);//true
console.log(a.constructor == Array);//true
方法四:toString()判断string和boolean类型
var o = {'name':'lee'};
var a = ['reg','blue'];
function c(name,age){
this.name = name;
this.age = age;
}
var c = new c('kingw','27');
console.log(Object.prototype.toString.call(a));//[object Array]
console.log(Object.prototype.toString.call(o));//[Object Object]
console.log(Object.prototype.toString.call(c));//[Object Object]
二、特殊值的相等于严格相等比较
(function(){
console.log(null==undefined) // 输出:true
console.log(null===undefined) // 输出:false
console.log(null===null) // 输出:true
console.log(undefined===undefined) // 输出:true
console.log(NaN==undefined) // 输出:false
console.log(NaN==null) // 输出:false
console.log(NaN==NaN) // 输出:false
console.log(NaN===NaN) // 输出:false
})()
三、字符串相等(==),严格相等(===)运算符
在进行相等(==)运算比较时,如果一边是字符,一边是数字,会先将字符串转换成数字再进行比较;
严格相等(===)则不会进行类型转换,会比较类型是否相等;注NaN与任何值比较时都是false。
四、字符串大小的比较,大于(>), 小于(<)运算符
javascript字符串在进行大于(小于)比较时,会根据第一个不同的字符的ascii值码进行比较,当数字(number)与字符串(string)进行比较大小时,会强制的将数字(number)转换成字符串(string)然后再进行比较。
五、JS判断一个变量是否是数组类型
参考博客:https://blog.csdn.net/lee_magnum/article/details/11555981
1、instanceof操作符
instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。
obj instanceof Object; //true 实例obj在不在Object构造函数中
var arr = [1,2,3,1];
alert(arr instanceof Array); // true
2、对象的constructor属性
var arr = [1,2,3,1];
alert(arr.constructor === Array); // true
第2种和第3种方法貌似无懈可击,但是实际上还是有些漏洞的,当你在多个frame中来回穿梭的时候,这两种方法就亚历山大了。由于每个iframe都有一套自己的执行环境,跨frame实例化的对象彼此是不共享原型链的,因此导致上述检测代码失效!
3、Object.prototype.toString (用来区分null和array类型)
function isArrayFn (o) {
return Object.prototype.toString.call(o) === '[object Array]';
}
var arr = [1,2,3,1];
alert(isArrayFn(arr));// true
call改变toString的this引用为待检测的对象,返回此对象的字符串表示,然后对比此字符串是否是'[object Array]',以判断其是否是Array的实例。
4.Array.isArray()
ECMAScript5将Array.isArray()正式引入JavaScript,目的就是准确地检测一个值是否为数组。IE9+、 Firefox 4+、Safari 5+、Opera 10.5+和Chrome都实现了这个方法。但是在IE8之前的版本是不支持的。
var arr = [1,2,3,1];
var arr2 = [{ abac : 1, abc : 2 }];
function isArrayFn(value){
if (typeof Array.isArray === "function") {
return Array.isArray(value);
}else{
return Object.prototype.toString.call(value) === "[object Array]";
}
}
alert(isArrayFn(arr));// true
alert(isArrayFn(arr2));// true