一、深拷贝与浅拷贝
深拷贝与浅拷贝概念:如果A复制了B,当改变A时,B也跟着改变,则是浅拷贝,B不变,则是深拷贝,深拷贝和浅拷贝一般都是针对于object的引用数据类型来说的,像基本数据类型:var a = ‘1’,var b = a,虽然是改变b的值不影响a的值,是因为a,b都开辟了自己独立的内存,和深浅拷贝并没有关系
引用类型的数据存储关系与深浅拷贝的原理:
解决深浅拷贝的方法:
浅拷贝:赋值,遍历都是可以实现浅拷贝
深拷贝的两种方法:深层遍历,JSON.parse()和JSON.stringfy()
var obj1 = {
a: '1',
b: {
c: [1],
d: '2'
},
c: [1]
}
// 深拷贝方法1:
function deepClone(newObj, oldObj) {
var obj = oldObj || {}
for (i in newObj) {
if (typeof(newObj[i]) === 'object') {
obj[i] = newObj[i].constructor === Array ? [] : {},
// 传入obj[i],防止每次递归调用时都会重新定义obj
deepClone(newObj[i], obj[i])
} else {
obj[i] = newObj[i]
}
}
return obj
}
var objcopy = deepClone(obj1)
// 验证
objcopy.b.d = '你好啊'
console.log('objcopy', objcopy)
console.log('obj1', obj1)
// 深拷贝方法二:obj——string——obj
var objjson = JSON.parse(JSON.stringify(obj1))
objjson.b.d = '我是json'
console.log('objjson', objjson)
二、for循环的优化
// 1.代码优化,2,算法优化,如for循环求和和算法求和,算法求和要快
// 如下代码:找出两个相加等于11的索引
var arr = [1,2,3,4,5,6]
var str = '——'
for (var i = 0, len = arr.length; i < len; i++) {
var num = 11 - arr[i]
if (arr.indexOf(num) !== -1) {
str = str + i + '——'
}
}
console.log(str)
三、装箱与拆箱
在js运算时,会对数据类型做相应的转换,内部的实现大致过程如下:
// 内置对象string,number,boolean
// 装箱:基本数据类型转换为引用数据类型
// var num = new Number(123)
//拆箱:引用数据类型转换为值类型
// num.valueOf()
// 面试题
console.log([]+[]) // '' ,
// 过程:判断数组为非原始类型,用[].valueof() 得到[],在[].toString(),得到''
console.log([]+{}) // [object,object]
// 过程:[] 得到'',{}.valueof().toString()得到[object object]
console.log({}+[]) // [object,object]或者0,有的浏览器把{}当成代码块,只执行+[],为0