js数据类型类型
一,JS数据类型
基本数据类型:String, Number ,Boolean,undefined,null,symbol。(5种)
引用数据类型:Object
1,检测数据类型
typeof(操作符),可以检测String ,Number ,Boolean,undefined,symbol
var s = 'abc' var n = 123 var b = true var u var sy= Symbol('1') console.log(typeof(s)) //string console.log(typeof(n)) //number console.log(typeof(b)) //boolean console.log(typeof(u)) //undefined console.log(typeof(sy)) // symbol
但是无法在检测null和引用数据类型时用处不大
var nu = null var obj = new Object() console.log(typeof(nu)) // object console.log(typeof(obj)) // object
所以ECMAScript,提供了 instanceof 操作符,用来检测引用数据类型
var arr = [1,2,3] var obj = new Object() console.log(arr instanceof Array) console.log(arr instanceof Object)
特殊的number:NaN----非数值
- NaN和任何数据计算都返回NaN
- NaN不等于NaN
- isNaN()会将接受的参数尝试转换为数值再做判断是否为NaN
2,基本数据类型和引用数据类型的区别
首先,解释一下栈和堆的区别,栈(stack)为自动分配的空间,大小固定,它由系统自动释放;堆(heap)则是动态分配的内存,大小也不一定自动释放;
1.变量保存内存位置不同:
- 基本数据类型:大小固定,存放在栈中
- 引用数据类型:大小不固定,如果存放在栈中会影响变量操作的速度,故存放在堆中,栈中存储的变量是引用查找堆中引用地址(指针),地址大小是固定的,所以存储在栈中对于变量操作的性能无任何影响
2.访问变量的机制不同:
- 基本数据类型:直接访问
- 引用数据类型:js不允许直接操作存放在堆中的对象,操作引用类型的对象,实际上是操作该引用类型存放在栈中的地址。(这种说法是不严密的,复制该对象的时候,操作的是对象的引用,为该对象添加属性时操作的是实际的对象)
3.复制变量时不同:
- 基本数据类型:将该变量的值赋值给新的变量,两个变量完全独立
- 引用数据类型:只是将该变量栈中对象的地址赋值给新的变量,这两个变量都指向堆中相同的引用对象。
4.参数传递不同:
- 基本数据类型:被传递的变量会被复制给函数的局部变量,二者相互独立
- 引用数据类型:被传递的变量的地址复制给函数的局部变量,二者相互影响。