# 数据类型

JS中变量没有类型,只有有类型,变量的类型取决于其内存储的值的类型

第一:考察基础,语言类型的掌握

# 基本类型

  • number

  • string

  • boolean

  • null

    `typeof null`返回`object`,语言本身的`bug`。
    但`null`是基本类型
    
  • undefined

  • symbol(ES6中新增)

# 对象类型

  • Function
  • Array
  • Date
  • RegExp
  • Error
  • String
  • Number
  • Boolean

# 当我们把值赋值给一个变量时发生了什么?

第二:考察数据类型存储方式的掌握

# 值为基本类型

基本类型的值存在

var num1 = 1; 发生了什么?

  • LHS查询num1,没找到
  • 在栈中开辟一个空间存储num1
  • num1值设为1

var num2 = num1; 发生了什么?

  • LHS查询num2,没找到
  • 在栈中开辟一个空间存储num2
  • RHS找到num1的值为1
  • num2的值设置为1

var num2 = 2; 发生了什么?

  • LHS查询num2,找到
  • num2的值设置为2(因为是值引用,不会影响num1)

图示
图示

demo

// 基本类型,修改复制的值不会影响旧值
var num1 = 1;
var num2 = num1;
num2 = 2;

console.log(num1); // 1
console.log(num2); // 2

# 值为对象类型

对象类型的值存储在中,然后在中存储堆的位置信息

var obj1 = { num1: 1 }; 发生了什么?

  • LHS查询obj1,没找到
  • 在栈中开辟一个空间存储obj1
  • 中开辟空间存储 { num1: 1 },地址为0x123
  • obj1值设为0x123

var obj2 = obj1; 发生了什么?

  • LHS查询obj2,没找到
  • 在栈中开辟一个空间存储obj2
  • RHS找到obj1的值为0x123
  • obj2的值设置为0x123

obj2.num2 = 2; 发生了什么?

  • LHS查询obj2,找到堆的地址0x123
  • 根据地址0x123找到对象中num2为空,在对象中创建num2
  • num2的值设置为2
  • 因为是根据地址修改的对象,所以所有指向这个地址的变量的都会发生变化

图示
图示

demo:

// 对象类型,修改复制的值会影响旧值
var obj1 = {
  num1: 1
};

var obj2 = obj1;
obj2.num2 = 2;

console.log(obj2.num2); // 2
console.log(obj1.num2); // 2

tips: 函数的参数如果是对象类型也是地址引用

如果觉得内容对你有帮助,请点个关注,你们的鼓励是我持续更新下去的动力,比心。

如需转载请注明出处,感恩。

更多内容可先关注GitHub (opens new window)