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----非数值

  1. NaN和任何数据计算都返回NaN
  2. NaN不等于NaN
  3. isNaN()会将接受的参数尝试转换为数值再做判断是否为NaN

2,基本数据类型和引用数据类型的区别

首先,解释一下栈和堆的区别,栈(stack)为自动分配的空间,大小固定,它由系统自动释放;堆(heap)则是动态分配的内存,大小也不一定自动释放;

1.变量保存内存位置不同:

  • 基本数据类型:大小固定,存放在栈中
  • 引用数据类型:大小不固定,如果存放在栈中会影响变量操作的速度,故存放在堆中,栈中存储的变量是引用查找堆中引用地址(指针),地址大小是固定的,所以存储在栈中对于变量操作的性能无任何影响

2.访问变量的机制不同:

  • 基本数据类型:直接访问
  • 引用数据类型:js不允许直接操作存放在堆中的对象,操作引用类型的对象,实际上是操作该引用类型存放在栈中的地址。(这种说法是不严密的,复制该对象的时候,操作的是对象的引用,为该对象添加属性时操作的是实际的对象)

3.复制变量时不同:

  • 基本数据类型:将该变量的值赋值给新的变量,两个变量完全独立
  • 引用数据类型:只是将该变量栈中对象的地址赋值给新的变量,这两个变量都指向堆中相同的引用对象。

 4.参数传递不同:

  • 基本数据类型:被传递的变量会被复制给函数的局部变量,二者相互独立
  • 引用数据类型:被传递的变量的地址复制给函数的局部变量,二者相互影响。
posted @ 2020-11-19 16:59  乘风破浪的哥哥  阅读(150)  评论(0编辑  收藏  举报