原始值和引用值类型及区别
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
}
}