js中的数据类型
原始类型
- Boolean
- Null
- Undefined
- Number
- BigInt
- String
-
引用类型
Object
一般来说,原始类型属于 call by value , 而 object 属于 call by reference
call by value
let x = 1let y = 2let a = xlet b = ya = 'a'b = 'b'console.log(x, y, a, b) // -> 1,2,'a','b'
实际上,当 a = x 的时候,实际上是把 x的值,拷贝给了 a,然后 a 和 x 是独立的,操作互相不会影响
call by reference
let a = [1]let b = ab.push(2)console.log(a, b) // -> [1, 2], [1, 2]
当 a 被声明的时候,js会在内存中建立一个object,然后将 a 指向这个 object
接着 b 被赋值,这时候 a、b都指向同一个object了,因此这时候操作a 或者 b 都会影响他们所指向的 object
call by sharing
function fn (arg) {arg.name = 'buer'}let obj = { name: '2333' }fn(obj)console.log(obj) // -> { name: 'buer' }// call by sharingfunction fn (arg) {arg.name = 'buer'arg = { age: 23 }}let obj = { name: '2333' }fn(obj)console.log(obj) // -> { name: 'buer' }
可能会疑惑下面这一段的结果,可以自己拷贝到浏览器尝试。
函数内部的 arg 与外面的 obj 实际上是共享同一个 object的,所以当你修改这个 obj的属性
但是当你重新赋值一个新的obj,这个时候,内部与外部会指向不同的 object,这个时候,外面的 obj会保留原来的值。
重新赋值会指向新的object,会产生新的指针
**
结论
原始类型属于 call by value,引用类型属于 call by reference,但是 重新赋值会造成 reference 改变!
