对于引用类型变量,栈内存中存放的是该对象的访问地址,在堆内存中为该值分配空间,因为这种值的大小不固定,所以不能把他们保存到栈内存中;但内存地址大小是固定的,所以能够将堆内存地址保存到栈内存中。这样,当查询引用类型的变量时,就先从栈中读取堆内存地址,而后再根据该地址取出对应的值。javascript
引用类型:从一个变量向另外一个新变量复制引用类型的值,其实复制的是指针,最终两个变量最终都指向同一个对象,会影响到原数据java
let arr1 = [1, {'name': 'a'}] let shallowClone = (arr) => { let newArr = [] for (let prop in arr) { if (arr.hasOwnProperty(prop)) { newArr[prop] = arr[prop] } } return newArr } let arr2 = shallowClone(arr1) arr2[0] = 2 arr2[1].name = 'b' console.log(JSON.stringify({arr1})) // {"arr1":[1,{"name":"b"}]} console.log(JSON.stringify({arr2})) // {"arr2":[2,{"name":"b"}]} // 基本数据类型未受到影响、引用数据类型仍是受到影响了 复制代码
let arr1 = [1, {'name': 'a'}] let arr2 = arr1.concat() arr2[0] = 2 arr2[1].name = 'b' console.log(JSON.stringify({arr1})) // {"arr1":[1,{"name":"b"}]} console.log(JSON.stringify({arr2})) // {"arr1":[2,{"name":"b"}]} 复制代码
let arr1 = [1, {'name': 'a'}] let arr2 = arr1.slice() arr2[0] = 2 arr2[1].name = 'b' console.log(JSON.stringify({arr1})) // {"arr1":[1,{"name":"b"}]} console.log(JSON.stringify({arr2})) // {"arr2":[2,{"name":"b"}]} 复制代码
let obj1 = { 'name': 'k', 'msg': { 'age': '10', 'sex': '男' }, } let obj2 = Object.assign({}, obj1) obj2.name = 'kk' obj2.msg.age = '20' console.log(JSON.stringify({obj1})) // {"obj1":{"name":"k","msg":{"age":"20","sex":"男"}}} console.log(JSON.stringify({obj2})) // {"obj2":{"name":"kk","msg":{"age":"20","sex":"男"}}} 复制代码
let arr1 = [1, 2, 3, {'name': 'kk'}] let arr2 = [...arr1] arr2.push(4); arr2[3].name = 'kkk' console.log(JSON.stringify({arr1})) // {"arr1":[1,2,3,{"name":"kkk"}]} console.log(JSON.stringify({arr2})) // {"arr2":[1,2,3,{"name":"kkk"},4]} 复制代码
let arr1 = [1, {'name': 'a'}] // 判断数据类型 let checkType = (data) => { return Object.prototype.toString.call(data).slice(8, -1) } let deepClone = (data) => { let newData, targetType = checkType(data) if (targetType === 'Object') { newData = {} } else if (targetType === 'Array') { newData = [] } else { return data } // 遍历 for (let i in data) { let val = data[i] if (checkType(val) === 'Object' || checkType(val) === 'Array') { newData[i] = deepClone(val) } else { newData[i] = val } } return newData } let arr2 = deepClone(arr1) arr2[0] = 2 arr2[1].name = 'b' console.log(JSON.stringify({arr1})) // {"arr1":[1,{"name":"a"}]} console.log(JSON.stringify({arr2})) // {"arr2":[2,{"name":"b"}]} 复制代码
该方法存在局限性markdown