이 글에서는 JavaScript에서 객체를 병합하고 복제하는 방법을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
기본 값과 참조 값(객체)은 복사하려고 할 때 매우 다르게 동작합니다.
기본 값
변수 name
에는 이와 관련된 기본 값(숫자, 문자열, 부울, 정의되지 않음 및 null)이 있다고 가정합니다. 이 변수 name
을 다른 변수 name2
에 복사하면 원래 변수에 대한 수정 사항은 원래 값이므로 두 번째 변수에는 영향을 미치지 않습니다. name
具有一个与之关联的原始值(number,string,boolean,undefined 和null)。 如果我们将此变量 name
复制到另一个变量name2
,则原始变量的任何修改都不会影响到第二个变量,因为它们是原始值。
let name="前端小智"; let name2= name; console.log (name, name2); // 前端小智, 前端小智 name="王大冶"; console.log (name,name2); // 王大冶 前端小智
引用值
但是,如果我们对引用类型的值进行相同的操作,则我们对一个变量所做的任何更改也将反映在另一个变量中,因为两个变量都指向同一对象。
数组
要拷贝数组,slice()
方法用于创建数组的新副本。 可以独立修改此副本,而不会影响原始数组。
如果未传递任何参数,则它会精确复制数组,但数字也可以作为参数传递。 如果仅传递一个数字,它将确定我们要从其进行复制的索引的值,而如果传递两个数字,则将标记开始和结束。
// 示例1 const names = ['前端小智', '王大冶', '小力']; const names2 = names; console.log(names, names2); // ["前端小智", "王大冶", "小力"] // ["前端小智", "王大冶", "小力"] // 示例2 names2[2] = '前端小力'; console.log(names, names2); // ["前端小智", "王大冶", "前端小力"] // ["前端小智", "王大冶", "前端小力"] // 示例3 const name2 = names.slice(); names[2] = '我是隔壁老智'; console.log(name2, names2) // ["前端小智", "王大冶", "前端小力"] // ["前端小智", "王大冶", "我是隔壁老智"]
对象
当引用值是一个对象时,也会发生同样的情况,对其属性之一的任何修改都会影响这两个变量。 若要克隆对象,请使用 Object.assign()
方法,该方法会将一个或多个源对象的所有可枚举属性的值复制到目标对象,但是此方法仅对对象的一个浅拷贝。
// 示例1 const names = { name: '前端小智', surname: '隔壁老智' } const names2 = names; console.log(names, names2) // 打印结果是一模一样的 // 示例2 names2.surname ='隔壁老王'; console.log(names, names2) // {name: "前端小智", surname: "隔壁老王"} // {name: "前端小智", surname: "隔壁老王"} // 示例3 const names3 = Object.assign({}, names); names3.surname = '隔壁老色P'; console.log(names, names3) // {name: "前端小智", surname: "隔壁老王"} // {name: "前端小智", surname: "隔壁老色P"}
要对对象进行深拷贝,需要使用其他方法。
正如我们所说,Object.assign()
方法只是一个浅拷贝(即,当我们的对象没有其他对象作为属性时)才有效。 在这些情况下,必须对对象进行深拷贝。
与浅拷贝不同,深拷贝以递归方式复制每个子对象,直到所有涉及的对象都被复制为止。
我们可以使用什么方法复制对象的深层副本?
JSON.parse(JSON.stringify(obj))
此方法使用JSON.stringify()
将对象转换为字符串,然后再用JSON.parse()
将其转换回对象。 此方法对简单对象有效,但如果对象属性是函数时无效。
const names = { name: '前端小智', surname: '隔壁老智', social: { wx: '大迁世界', url: 'www.lsp.com' } } const names2 = JSON.parse(JSON.stringify(names)); names2.social.url = 'www.baidu.com'; console.log(names, names2); /** { name: "前端小智" social: {wx: "大迁世界", url: "www.lsp.com"} surname: "隔壁老智" } */ /** { name: "前端小智" social: {wx: "大迁世界", url: "www.baidu.com"} surname: "隔壁老智" } */
深度拷贝
另一种非常有趣和优雅的对象深度复制方法是使用递归函数。
我们创建了一个deepClone(object)
函数,将想要克隆的对象作为参数传递给它。在函数内部,将创建一个局部变量克隆,这是一个空对象,其中将从起始对象克隆的每个属性都将添加到该对象中。
具体思路:
- 如果该属性不是对象,则将其简单地克隆并添加到新的克隆对象中。
- 如果属性是对象,则再次执行
deepClone(value)
function deepClone(object) { var clone = {}; for (var key in object) { var value = object[key]; if (typeof(value) !== 'object') { clone[key] = value; } else { clone[key]=deepClone(value); } } return clone; } deepClone({value1:1,value2:{value3:2}}); //{value1:1,value2:{value3:2}} deepClone({value1:1,value2:{value3:{value3b:3}}}); //{value1:1,value2:{value3:{value3b:3}}}
그러나 참조 유형 값으로 동일한 작업을 수행하면 두 변수가 모두 동일한 개체를 가리키므로 한 변수에 대한 모든 변경 사항이 다른 변수에도 반영됩니다.Arrays
배열을 복사하려면 slice()
메서드를 사용하여 배열의 새 복사본을 만듭니다. 이 사본은 원본 배열에 영향을 주지 않고 독립적으로 수정될 수 있습니다. 인수가 전달되지 않으면 배열의 정확한 복사본이 만들어지지만 숫자도 인수로 전달될 수 있습니다. 하나의 숫자만 전달되면 복사하려는 인덱스의 값을 결정하고, 두 개의 숫자가 전달되면 시작과 끝을 표시합니다.
Object.sign()
메서드를 사용하십시오. 그러나 이 방법은 객체 A에만 적용됩니다. . 🎜rrreee🎜객체의 전체 복사본을 만들려면 다른 방법을 사용해야 합니다. 🎜🎜우리가 말했듯이 Object.sign()
메서드는 얕은 복사본(즉, 객체에 속성으로 다른 객체가 없는 경우)으로만 작동합니다. 이러한 경우 개체의 전체 복사본을 만들어야 합니다. 🎜🎜얕은 복사와 달리 전체 복사는 관련된 모든 개체가 복사될 때까지 각 하위 개체를 반복적으로 복사합니다. 🎜🎜객체의 전체 복사본을 만들려면 어떤 방법을 사용할 수 있나요? 🎜🎜🎜JSON.parse(JSON.stringify(obj))🎜🎜🎜이 메서드는 JSON.stringify()
를 사용하여 개체를 문자열로 변환한 다음 JSON.parse( )
다시 개체로 변환합니다. 이 방법은 단순한 객체에는 작동하지만 객체 속성이 함수인 경우에는 작동하지 않습니다. 🎜rrreee🎜🎜Deep Copy🎜🎜🎜객체를 깊은 복사하는 또 다른 매우 흥미롭고 우아한 방법은 재귀 함수를 사용하는 것입니다. 🎜🎜 deepClone(object)
함수를 생성하고 복제하려는 객체를 매개변수로 전달합니다. 함수 내부에는 시작 개체에서 복제될 모든 속성이 추가되는 빈 개체인 로컬 변수 clone이 생성됩니다. 🎜🎜구체적인 아이디어: 🎜- 속성이 개체가 아닌 경우 간단히 복제하여 새로 복제된 개체에 추가하세요. 🎜
- 속성이 객체인 경우
deepClone(value)
함수를 다시 실행하고 속성(이 경우 객체)의 값을 매개변수로 전달하고 동일한 과정을 반복합니다. 🎜🎜rrreee🎜🎜영어 원본 주소: https://www.ma-o.org/en/programming/javascript/the-javascript-asign-method-to-merge-and-clone-objects🎜🎜저자: Luigi Nori 🎜🎜번역자: 프론트엔드 Xiaozhi🎜🎜🎜더 많은 프로그래밍 관련 지식을 보려면 🎜프로그래밍 비디오🎜를 방문하세요! ! 🎜
위 내용은 한 기사에서 JavaScript로 개체를 병합하고 복제하는 방법을 알아보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

JavaScript의 최신 트렌드에는 Typescript의 Rise, 현대 프레임 워크 및 라이브러리의 인기 및 WebAssembly의 적용이 포함됩니다. 향후 전망은보다 강력한 유형 시스템, 서버 측 JavaScript 개발, 인공 지능 및 기계 학습의 확장, IoT 및 Edge 컴퓨팅의 잠재력을 포함합니다.

JavaScript는 현대 웹 개발의 초석이며 주요 기능에는 이벤트 중심 프로그래밍, 동적 컨텐츠 생성 및 비동기 프로그래밍이 포함됩니다. 1) 이벤트 중심 프로그래밍을 사용하면 사용자 작업에 따라 웹 페이지가 동적으로 변경 될 수 있습니다. 2) 동적 컨텐츠 생성을 사용하면 조건에 따라 페이지 컨텐츠를 조정할 수 있습니다. 3) 비동기 프로그래밍은 사용자 인터페이스가 차단되지 않도록합니다. JavaScript는 웹 상호 작용, 단일 페이지 응용 프로그램 및 서버 측 개발에 널리 사용되며 사용자 경험 및 크로스 플랫폼 개발의 유연성을 크게 향상시킵니다.

Python은 데이터 과학 및 기계 학습에 더 적합한 반면 JavaScript는 프론트 엔드 및 풀 스택 개발에 더 적합합니다. 1. Python은 간결한 구문 및 풍부한 라이브러리 생태계로 유명하며 데이터 분석 및 웹 개발에 적합합니다. 2. JavaScript는 프론트 엔드 개발의 핵심입니다. Node.js는 서버 측 프로그래밍을 지원하며 풀 스택 개발에 적합합니다.

JavaScript는 이미 최신 브라우저에 내장되어 있기 때문에 설치가 필요하지 않습니다. 시작하려면 텍스트 편집기와 브라우저 만 있으면됩니다. 1) 브라우저 환경에서 태그를 통해 HTML 파일을 포함하여 실행하십시오. 2) Node.js 환경에서 Node.js를 다운로드하고 설치 한 후 명령 줄을 통해 JavaScript 파일을 실행하십시오.

쿼츠 타이머를 사용하여 작업을 예약 할 때 미리 쿼츠에서 작업 알림을 보내는 방법 작업의 실행 시간은 CRON 표현식에 의해 설정됩니다. 지금...

JavaScript 프로그래밍에서 JavaScript의 프로토 타입 체인에서 함수 매개 변수를 얻는 방법 프로토 타입 체인의 기능 매개 변수를 이해하고 조작하는 방법은 일반적이고 중요한 작업입니다 ...

WeChat 애플릿 웹 뷰에서 vue.js를 사용하는 동적 스타일 변위 실패가 vue.js를 사용하는 이유를 분석합니다.

동시 링크에 대한 요청을 여러 링크와 순서대로 판단하여 결과를 반환하는 방법은 무엇입니까? 탬퍼 몬키 스크립트에서는 종종 여러 체인을 사용해야합니다 ...


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

SecList
SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

뜨거운 주제



