在JavaScript中,原始类型和对象的主要区别是什么?
首先,我们来定义一下什么是原始类型。
JavaScript中的原始类型有
- 字符串
- 数字(Number和BigInt)
- 布尔(真或假)
- 未定义
- 符号值
null 是一个特殊的原始类型。如果你运行 ,你会得到 ,但它实际上是一个原始类型。typeof null 'object'
所有不是原始类型的东西都是一个对象。
函数也是对象。我们可以在函数上设置属性和方法。typeof ,将返回'function' ,但函数构造函数是从对象构造函数派生的。
原始类型和对象的最大区别是
- 原始类型是不可变的,对象只有一个不可变的引用,但它们的值可以随时间变化。
- 原始类型是通过值传递的。对象是通过引用传递的
- 原始类型是通过值来复制的。对象是通过引用来复制的
- 原始类型通过值进行比较。对象通过引用进行比较
如果我们以这种方式复制一个原始类型。
let name = 'Flavio'
let secondName = name
现在我们可以改变name 变量,给它分配一个新的值,但是secondName 仍然持有旧值,因为它是通过值复制的。
name = 'Roger'
secondName //'Flavio'
如果我们有一个对象。
let car = {
color: 'yellow'
}
并且我们把它复制到另一个变量。
let car = {
color: 'yellow'
}
let anotherCar = car
在这种情况下,anotherCar 指向与car 相同的对象。如果你设置
也
将是'blue' 。
同样的方法也适用于向函数传递对象,以及进行比较。
假设我们想将car 与anotherCar 进行比较。
anotherCar === car //true
这是真的,因为两个变量都指向完全相同的对象。
但是如果anotherCar 是一个与car 具有相同属性的对象,那么比较它们会得到一个false 的结果。
let car = {
color: 'yellow'
}
let anotherCar = {
color: 'yellow'
}
anotherCar === car //false