(一)javascript的数据类型
1.基本数据类型:Undefined,Null,Boolean,Number,String,Symbol
2.引用数据类型:Object(通常包含数组,对象,函数)
(二)基本数据类型的特点
1.值不可变
var name = 'tiger'
name.toUpperCase() //"TIGER"
name // "tiger"
2.存放在栈区
3.值的比较
var a = 1
var b = true
a == b // true
a===b // false
(三)引用数据类型的特点
1.值可变
var obj={name:'tiger'}
obj.name = 'cat'
obj.name // "cat"
引用类型拥有属性和方法,并且是可以动态改变的
2.同时保存在栈内存中和堆内存中
当解释器在寻找引用的值的时候,会检索栈中的地址,取得地址后再从堆中访问实体
3.比较是引用的比较
var obj_a={name:'tiger'}
var obj_b = obj_a
obj_b.name === obj_a.name // true
(四)检测数据类型的方法:typeof,instanceof,constructor,Object.prototype.toString
1.typeof:能够准确的判断除开Null的其它基本数据类型,但是对于引用数据类型都会返回object
2.instanceof:
(1)对于基本数据类型,不能进行准确判断
(2)在类的原型继承中,结果也不一定准确。
(3)如果用于判断Null和Undefined,会直接报错,因为浏览器将这两个类保护起来的。
var age = null
age instanceof Null
VM1839:1 Uncaught ReferenceError: Null is not defined
3.constructor:
(1)null和undefined是无效对象,因为没有constructor
(2)函数的constructor是不稳定的,因为在类的原型进行重写的时候,很有可能将之前的constructor进行覆盖。
4.Object.prototype.toString:是最准确的常用方式
toString:本意是转为字符串的操作,但是不仅仅可以转换为字符串,对于Object上的toString()会返回当前方法执行的主体所属类的详细信息。
"[object Object]"
//第一个表示当前实体的对象数据类型,固定返回
//第二个表示:this所属类的object
Object.prototype.toString.call('') //"[object String]"
Object.prototype.toString.call(1) //"[object Number]"
Object.prototype.toString.call(true) // "[object Boolean]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(new Function) //"[object Function]"
Object.prototype.toString.call(new Date) //"[object Date]"
Object.prototype.toString.call(new RegExp) //"[object RegExp]"
Object.prototype.toString.call([]) //"[object Array]"
Object.prototype.toString.call(new Error) //"[object Error]"
Object.prototype.toString.call(document) //"[object HTMLDocument]"
Object.prototype.toString.call(window) //"[object Window]"