主题
原始值和引用值
原始值
包含:Undefined、Null(空地址)、Boolean、Number、String、Symbol、BigInt
本质:按值访问,操作的是值本身
存储位置:存储在
栈
中
复制值和传递参数都是深拷贝,即原始值和新的值只是值一样,但实际上毫无关系
jsconst s1 = 'kingmusi' let s2 = s1 s2 = 'musi' console.log( s1, s2 ) // kingmusi musi
原始字面量和 new 关键字,行为类似,但本质不一样
jsconst s1 = 'kingmusi' const s2 = new String('kingmusi') console.log( typeof s1 ) // string console.log( typeof s2 ) // object
引用值
- 包含:Object、Array、Function
- 本质:按引用访问,操作的是该对象的引用
- 存储位置:地址(指针)存储在
栈
中,地址(指针)指向的对象存储在堆
内存中
复制值和传递参数都是拷贝地址,所以二者会相互改变
jsconst obj1 = { name: 'kingmusi' } const obj2 = obj1 obj2.name = 'musi' console.log( obj1.name ) // musi
要理解清楚函数参数只是函数的
局部变量
,如果局部变量指向一个新的值或对象,那么二者毫无联系jsfunction setName(obj) { obj.name = 'musi' obj = new Object() obj.name = 'a' } const obj = { name: 'kingmusi' } setName(obj) console.log( obj.name ) // musi
typeof
- 对于
原始类型
来说,除了 null都可以显示正确的类型 - 对于
对象
来说,除了函数都会显示 object
instanceof
- 对于
原始类型
来说,你想直接通过 instanceof来判断类型是不⾏的 - 对于
对象
来说,可以考虑使⽤ instanceof, 因为内部机制是通过原型链来判断的
js
function myinstanceof(left, right){// left: 左边,right:右边
const origin = right.prototype;
let proto = left.__proto__;
while (proto !== null) {
if (proto === origin) return true;
proto = proto.__proto__;
}
return false;
}