众所周知,js中的数据类型分为两种:原始类型(基本数据类型)和对象类型(引用数据类型)
string、number、boolean、undefined、symbol都为基本数据类型,判断他们类型的方法用typeof 即可。
其中,Symbol为ES6 引入的一种新的原始数据类型,表示独一无二的值,可以保证不会与其他属性名产生冲突。
但是object、function、array,null情况比较复杂,如果使用typeof都会返回object。因此,引用类型的数据需要用到其他方法。
这里插一句,null和undefined的差别:
null类型只有一个特殊的值,那就是null,从逻辑的角度看,null类型表示一个空对象指针,应用场景就是,如果定义的变量是用来存放对象,那么最好将该对象初始化为null,而不是其他值。这样以来,我们就可以通过判断一个对象是否等于null来区分该对象是否是一个对象的引用。
if(obj != null){//do something}
undefined类型的值只有一个 为undefined,其实它是null派生出来的,因此,当我们在某些操作下他们就是相等的:
console.log(undefined == null);//true
console.log(undefined === null);//false
但是在开发中,并不提倡将一个变量显示的声明为undefined,因为在未使用var声明变量的时候就会对其赋值为undefeated,这个就可以用来判断该值是否声明过。
好了,咱们回到判断数据类型这个点。
当我们需要判断复杂的数据类型时,就需要另一个方法,Object.prototype.toString().
举个栗子就很好理解了:
var arr = [ 1,2,3 ];
arr.toString();//"1,2,3";
//通过call指定arr数组为Object.prototype对象中的toString方法的上下文
Object.prototype.toString.call(arr); //"[object Array]"
Object.prototype中的toString方法是确实被继承下来了,但是很多东西总不会一层不变,作为儿子的数组重写了toString方法,所以直接调用数组对象上面的toString方法调用到的实际是重写后的方法,并不是Object.prototype中的toString方法。
精确判断对象的类型
JavaScript 中一切都是对象,任何都不例外,对所有值类型应用 Object.prototype.toString.call() 方法结果如下:
console.log(Object.prototype.toString.call(123)); //[object Number]
console.log(Object.prototype.toString.call('123')); //[object String]
console.log(Object.prototype.toString.call(undefined)); //[object Undefined]
console.log(Object.prototype.toString.call(true)); //[object Boolean]
console.log(Object.prototype.toString.call({})); //[object Object]
console.log(Object.prototype.toString.call([])); //[object Array]
console.log(Object.prototype.toString.call(function(){})); //[object Function]
console.log(Object.prototype.toString.call(null)); //[[object Null]]
文中包含转载内容,https://www.cnblogs.com/bq-med/p/8796836.html
侵权可删。