比较值相等
/**
* 判断两个值是否相等 (包括数组和对象)
* 注: 包含函数的对象和数组无法判定 (永为false)
* @param { Any } val1 值1
* @param { Any } val2 值2
* @returns Boolean
*/
function getValueEqual(val1, val2) {
// 如果是原始值或者引用地址相等直接返回true
if (val1 === val2) {
return true
}
// 对象和数组都会进这里
if (typeof val1 === 'object' && val1 !== null) {
if (typeof val2 !== 'object' && val2 !== null) {
return false
}
// 数组情况
if (Array.isArray(val1)) {
if (!Array.isArray(val2)) {
return false
}
if (val1.length !== val2.length) {
return false
}
}
var keyList1 = Object.keys(val1)
var keyList2 = Object.keys(val2)
if (keyList1.length !== keyList2.length) {
return false
}
for (var i = 0; i < keyList1.length; i++) {
var key = keyList1[i];
if (keyList2.indexOf(key) === -1) {
return false
}
if (!getValueEqual(val1[key], val2[key])) {
return false
}
}
return true
} else {
return false
}
}
深度克隆
/**
* 深克隆一个值包括数组和对象
* @param { Any } value
* @returns newValue
*/
function deepClone(value) {
var newVal
if (typeof value === 'object' && value !== null) {
if (Array.isArray(value)) {
newVal = []
} else {
newVal = {}
}
var keyList = Object.keys(value)
for (var i = 0; i < keyList.length; i++) {
var key = keyList[i];
newVal[key] = deepClone(value[key])
}
return newVal
}
return value
}
当然最省事的深度克隆对象还数JSON.parse(JSON.stringify(value))了