Skip to content

原始值和引用值

原始值

  • 包含:UndefinedNull(空地址)、BooleanNumberStringSymbolBigInt

  • 本质:按值访问,操作的是值本身

  • 存储位置:存储在

  • 复制值和传递参数都是深拷贝,即原始值和新的值只是值一样,但实际上毫无关系

    js
    const s1 = 'kingmusi'
    let s2 = s1
    s2 = 'musi'
    console.log( s1, s2 ) // kingmusi musi

原始字面量和 new 关键字,行为类似,但本质不一样

js
const s1 = 'kingmusi'
const s2 = new String('kingmusi')
console.log( typeof s1 ) // string
console.log( typeof s2 ) // object

引用值

  • 包含:ObjectArrayFunction
  • 本质:按引用访问,操作的是该对象的引用
  • 存储位置:地址(指针)存储在中,地址(指针)指向的对象存储在内存中

  • 复制值和传递参数都是拷贝地址,所以二者会相互改变

    js
    const obj1 = { name: 'kingmusi' }
    const obj2 = obj1
    obj2.name = 'musi'
    console.log( obj1.name ) // musi

要理解清楚函数参数只是函数的局部变量,如果局部变量指向一个新的值或对象,那么二者毫无联系

js
function setName(obj) {
	obj.name = 'musi'
	obj = new Object()
	obj.name = 'a'
}

const obj = { name: 'kingmusi' }
setName(obj)
console.log( obj.name ) // musi

typeof

  1. 对于原始类型来说,除了 null都可以显示正确的类型
  2. 对于对象来说,除了函数都会显示 object

instanceof

  1. 对于原始类型来说,你想直接通过 instanceof来判断类型是不⾏的
  2. 对于对象来说,可以考虑使⽤ 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;
}