JS深入基础系列之原始值和引用值类型的区别

1,415 阅读2分钟

原始值和引用值类型及区别


js中的原始值包括了null , undefined , boolean , Number , String

引用值类型则是对象Object.Array,Function,Data,RegExp,Error都是特殊的Object对象

原始值从设计上来说是不可改变的,试想你不可能去改变一个数字本身的含义。所以他们只有值相等的时候才会相等。 String类型特殊一点。他可以看起来像是一个Array(当然他并不是),他的比较方式是先比较长度,在比较每一个位置上的值,只有都相等的时候才算相等。 所以string类型本身自带的所有方法都是不会改变原字符串的

比如

var a = 'bb'
a.toUpperCase()
alert(a) // 'bb'

而引用值————也就是Object对象他是可以修改的。 但有意思的是对象的比较并非是值的比较,只要他们的引用不同,即若是两个变量不是指向的同一个Object对象,他们就永远不相等

例如

console.log([] == []) // false
console.log([] == {}) // false
console.log({} == {}) // false

值得一提的是,如果转化为boolean,那么对象一定是true(即便他是空对象或者是空数组)

所以将对象赋值给一个变量,仅仅是赋值了对象的引用值而不是本身。而这就涉及了深拷贝和浅拷贝的问题。 先给几个简单想得到的数组浅拷贝

var a = [1,2,3]
var b = a.concat()
var c = a.slice()
var d = []
for(let i = 0;i<a.length;a++){
    d[i] = a[i]
}
console.log(b) //[1,2,3]
console.log(b == a) //false

console.log(c) //[1,2,3]
console.log(c == a) //false

console.log(d) //[1,2,3]
console.log(d == a) //false

同样的,如果想要比较对象和数组,就应该比较他们的属性和元素。

//初步的数组比较函数

function equalArrays(a,b){
    if( a.length != b.length){
        return false 
    }
    for(let i=0;i<a.length;i++){
        if(a[i] != b[i]){
            return false
    }
}