在面试时经常会碰到面试官问:什么是深拷贝和浅拷贝,请举例说明?如何区分深拷贝与浅拷贝,简单来说,假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,如果B没变,那就是深拷贝;我们先看两个简单的案例://案例1(深拷贝) var a1 = 1, a2= a1; console.log(a1) //1 console.log(a2) //1 a2 = 2; //修改 a2 console.log(a1) //1 console.log(a2) //2 //案例2(浅拷贝) var o1 = {x: 1, y: 2}, o2...
一、数组浅拷贝 在js中,数组和对象的复制如果使用=号来进行复制,那只是浅拷贝。如下图演示:let arr = [1,2,3]let arr2 = arrarr[1] = 4console.log(arr2)// 输出[1,4,3] 如上,arr的修改,会影响arr2的值,这就是浅拷贝了。这显然在绝大多数情况下,并不是我们所需要的结果,因此,数组以及对象的深拷贝就是javascript的一个基本功了。 二、数组深拷贝 2.1、for 循环实现数组的深拷贝 for循环是非常好用的。如果不知道高级方法,...
运行结果展示: 归纳: 1.concat也能实现深拷贝,但是只能拷贝一层,对于嵌套数组里面的值无法修改2.判断数组的方法 (1)Array.isArray(arr) (2)arr.constructor == Array (注意:两个等号,且没有引号) (3)obj instanceof Array 3.深拷贝和浅拷贝还有其他方法,但是上面的是通用方法
前言 本身在面试博客里只是想整理一下js的类型,突然越联想越感觉这块的知识体量比较大,扩展很多,但网上的很多理解繁杂还不太清晰,故此专门记录一下这几个点。 正文 js中的数据类型基本类型:number ,string,null,Boolen,undefined,symbol 引用类型:object (Array,Function,Date,Regxp在es6中规定都是object类型)两者的区别: 基本类型:可以直接操作的实际存在的数据段。存在在内存的栈中,比较的是值的比较! 引用类...
一些问题 // 赋值1 let obj1 = {a: 1,b: 2 }let obj2 = obj1 obj2.a = 3console.log(obj1) // ? console.log(obj2) // ?// 赋值2 let obj1 = {a: 1,b: 2,c: {q: 6} }let obj2 = obj1 obj2.a = 3 obj2.c.q = 7console.log(obj1) // ? console.log(obj2) // ?// 浅拷贝1 let obj1 = {a: 1,b: 2 } let obj2 = Object.assign({}, obj1) obj2.a = 3console.log(obj1) // ? console.log(obj2) // ?// 浅拷贝2 let obj1 = {a: 1,b: 2,c: {...
深浅拷贝区别 我们都知道JS中有两种数据类型,一种是基本数据类型,一种是引用数据类型,基本数据类型是按值访问的,即在操作基本类型的变量时,是直接修改变量的值,而引用数据类型的值是按引用访问的,什么是按引用访问的呢? JS的引用类型,也叫对象类型,是保存在内存中的,而在JS中又无法直接操作内存中的对象,实际上操作的是对象的引用,因此在引用类型变量在进行复制操作时,并不是对对象值的直接复制,而是将对象的引用复...
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>JS深拷贝的几种方法</title> </head> <body><script src="https://cdn.jsdelivr.net/npm/lodash@4.17.20/lodash.min.js"></script><script>let origin = ['李白','赵云','王昭君','裴擒虎','元歌']/*** 1. Object.assign() 实现深拷贝 --- 个人常用*/// let target = Object.assign(...
JS深拷贝概念并不新鲜,但是真正要真正理解原理还是有点难度的。这也是JS语言精粹之一吧。例子let a = {name: 'demo',age: 18 }; let b = a; b.name = 'demo1'; console.log(a); // 输出 {name: "demo1", age: 18} console.log(b); // 输出 {name: "demo1", age: 18} 因为JS对于对象的赋值使用的是浅拷贝,其中一个实例变量的赋值会影响到所有指向该对象的变量 解决方案粗暴好使的 JSON.parse(JSON.stringify),缺点: 丢失成员函数...
1.Array.from() 2.slice() 3.扩展运算符 4.Object.assign() 5.concat() var oldArr = [1,2,3,[4,5,6],7] // 可以使用以上5中方法进行拷贝,但是都会出现同一个问题,就是对内层数组 // 的拷贝仅仅拷贝了内存地址,并没有给予新的内存地址进行保存 // 比如: var newArr = oldArr.slice() oldArr[0] = 10 console.log(oldArr[0]) // 10 console.log(newArr[0]) // 1oldArr[3][0] = 20 console.log(oldArr[3][0]) // 20 console.log(n...
// 深拷贝和浅拷贝的区别?如何实现? // 深拷贝:拷贝后的结果 更改是不会影响拷贝前的 拷贝前后是没有关系的 // 浅拷贝:改变前的内容,会对拷贝之后的有影响 拷贝前和拷贝后是有关系的// 引用关系的问题 // ...运算符 只能拷贝一层 一层运算的时候是深拷贝,多层对象的时候是浅拷贝 典型的浅拷贝 let obj={name:'jim',address:{x:100,y:100} }let o={...obj}; obj.name='hello'; obj.address.x=200;console.log(obj===...
可拷贝原始类型:Number、Boolean、String、Symbol、BigInt 可拷贝引用类型:Set、Map、Date、RegExp、Function、Array、Objectfunction deepClone(target){//判断是否为对象const isObject = target => {if(target === null){return false;}else {return typeof target === 'object' || typeof target === 'function';}}//获取数据类型const getType = target => {return Object.prototype.toString.call(target).slice(8, -1);}/...