1.JavaScript中的数据类型
JavaScript的数据类型分为两类:原始类型、引用类型,二者在内存中的存储位置不同。
原始类型
原始类型也叫基本类型。有5种基本类型的数据,分别是:number、string、boolean、null、undefined。在ES6中还新增了Symbol。原始类型存储在内存栈中,也就是说直接存储的变量的值
引用数据
除了6种原始类型外,都是引用类型。主要有:Object、Array、Date、Error、RegExp、Function。在ES6种还新增了Promise、Map。引用类型的值是存储在内存堆中的的。也就是说直接存储的变量的值是一个指向原对象的内存指针。
3.原始数据的检测
检测原始类型时,都可以使用typeof操作符检测。typeof检测后会返回一个表示检测对象类型的字符串
使用typeof进行原始类型检测时,其返回值分别为:
- Number类型返回'number'
- String类型返回'string'
- Boolean类型返回'boolean'
- Undefined类型返回'undefined'
- Null类型返回'null'
- Symbol类型返回'symbol'
局限性:不能具体的细分是数组还是正则,还是对象中的其他值。对于对象数据类型返回都是object
4.引用数据类型的检测
instanceof方法
检测某一个实例是否属于某一个类
具体用法:
- [] instanceof Array; //true
局限性
对于基本数据类型,字面量方式创建的结果和实例创建出来的结果是有区别的,从严格意义山来讲,从实例创建方式出来的结果才是标准的对象数据类型,也是各种基本数据类型类的实例
- 不能用来检测和处理字面量方式创建出来的基本数据类型
- 只要在当前实例的原型链上,就会用其检测出来的结果都是true
- 在类的原型继承中,我们用其检测出来的结果未必准确
constructor:构造函数(不常用)
- 可以处理基本数据类型的检测
局限性:我们可以把类的原型重写,再重写的过程中很可能出现把原来的原型覆盖掉,这时检测就不准确了
Object.prototype.toString.call(val);
最准确的方法。Object.prototype.toString它的作用是返回当前方法的执行主体(方法中的this)所属类的详细信息
具体用法:
- Object.prototype.toString.call([]);//'[object Array]';
- 返回的是一个'[object Array]'。中括号中的第一项永远是一个小写的object。因为从根上来说,任何数据类型都都是一个对象。第二项表示当前要检测的数据,是一个首字母大写的数据类。
- String\Boolean\Array\RegExp\Date\Function原型上的toString()方法都已经对Object中的toString()方法进行了重写,作用是把当前的数据类型转换为字符串的类型。
对象属性检测
检测对象属性时,可以使用in运算符,或者使用对象的实例方法hasOwnProperty()。前者不仅可以检测属性是否属于该对象,还可以检测该对象的原型链中的方法或属性是否属于该对象。而后者只检测该对象的私有属性和方法,不会去判断原型链中的属性和方法。
事例:
for(var key in obj){
if(obj.hasOwnProterty(key)){
//表明属于该对象的私有属性 和方法。
}
}
所以我们一般判断属性是否属于该对象时,使用hasOwnProperty()