js中的数据类型

原始类型

  • Boolean
  • Null
  • Undefined
  • Number
  • BigInt
  • String
  • Symbol

    引用类型

  • Object

    一般来说,原始类型属于 call by value , 而 object 属于 call by reference

call by value

  1. let x = 1
  2. let y = 2
  3. let a = x
  4. let b = y
  5. a = 'a'
  6. b = 'b'
  7. console.log(x, y, a, b) // -> 1,2,'a','b'

实际上,当 a = x 的时候,实际上是把 x的值,拷贝给了 a,然后 a 和 x 是独立的,操作互相不会影响

call by reference

  1. let a = [1]
  2. let b = a
  3. b.push(2)
  4. console.log(a, b) // -> [1, 2], [1, 2]

当 a 被声明的时候,js会在内存中建立一个object,然后将 a 指向这个 object
接着 b 被赋值,这时候 a、b都指向同一个object了,因此这时候操作a 或者 b 都会影响他们所指向的 object

call by sharing

  1. function fn (arg) {
  2. arg.name = 'buer'
  3. }
  4. let obj = { name: '2333' }
  5. fn(obj)
  6. console.log(obj) // -> { name: 'buer' }
  7. // call by sharing
  8. function fn (arg) {
  9. arg.name = 'buer'
  10. arg = { age: 23 }
  11. }
  12. let obj = { name: '2333' }
  13. fn(obj)
  14. console.log(obj) // -> { name: 'buer' }

可能会疑惑下面这一段的结果,可以自己拷贝到浏览器尝试。
函数内部的 arg 与外面的 obj 实际上是共享同一个 object的,所以当你修改这个 obj的属性
但是当你重新赋值一个新的obj,这个时候,内部与外部会指向不同的 object,这个时候,外面的 obj会保留原来的值。
重新赋值会指向新的object,会产生新的指针
**

结论

原始类型属于 call by value,引用类型属于 call by reference,但是 重新赋值会造成 reference 改变!