热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深切JavaScript中深拷貝和淺拷貝

深拷貝和淺拷貝題目的實質照樣差別數據範例的存儲體式格局差別,尤其是援用數據範例的特別。現分別對賦值、淺拷貝、深拷貝做深入研究:1.賦值道理:直接將對象指針直接賦值給另一個變量代碼:

深拷貝和淺拷貝題目的實質照樣差別數據範例的存儲體式格局差別,尤其是援用數據範例的特別。
《深切Javascript中深拷貝和淺拷貝》

現分別對賦值、淺拷貝、深拷貝做深入研究:

1.賦值

道理:直接將對象指針直接賦值給另一個變量

代碼

let developer = {
title: 'Frontend',
basic: {
html: '5',
css: '3',
js: 'es6'
},
frameworks: ['React', 'Vue', 'AngularJS'],
summary: function(){
console.log('I am FE developer');
}
};
let newDeveloper = developer;
console.log(newDeveloper);
//基礎範例:轉變原對象
newDeveloper.title = 'Frontend Leader';
console.log(developer.title); // Frontend Leader
//對象:轉變原對象
newDeveloper.basic.http = '2.0';
console.log(developer.basic.http); // 2.0
newDeveloper.basic.js = 'es5';
console.log(developer.basic.js); // es5
//數組:轉變原對象
newDeveloper.frameworks.push('Angular');
console.log(developer.frameworks); // [ 'React', 'Vue', 'AngularJS', 'Angular' ]
//函數:轉變原對象
newDeveloper.summary = function () {
console.log('I like FE development');
};
developer.summary(); // I like FE development

2.淺拷貝

道理:遍歷對象的每一個屬性舉行逐一拷貝

完成體式格局

  • 體式格局1:遍歷並複製
  • 體式格局2:Object.assign()

代碼

let developer = {
title: 'Frontend',
basic: {
html: '5',
css: '3',
js: 'es6'
},
frameworks: ['React', 'Vue', 'AngularJS'],
summary: function(){
console.log('I am FE developer');
}
};
/*
* 體式格局1:逐一複製
*
* */
function cloneInShallow(source) {
let target = {};
for (prop in source){
target[prop] = source[prop];
}
return target
}
let newDeveloper = cloneInShallow(developer);
/*
* 體式格局2:Object.assign()
*
* */
// let newDeveloper = Object.assign({}, developer);
console.log(newDeveloper);
//基礎範例:不轉變原對象
newDeveloper.title = 'Frontend Leader';
console.log(developer.title); // Frontend
// 對象:轉變原對象
newDeveloper.basic.http = '2.0';
console.log(developer.basic.http); // 2.0
newDeveloper.basic.js = 'es5';
console.log(developer.basic.js); // es5
//數組:轉變原對象
newDeveloper.frameworks.push('Angular');
console.log(developer.frameworks); // [ 'React', 'Vue', 'AngularJS', 'Angular' ]
//函數:不轉變原對象
newDeveloper.summary = function () {
console.log('I like FE development');
};
developer.summary(); // I am FE developer

3.深拷貝

道理:運用遞歸,遍歷每一個對象屬性舉行拷貝

完成體式格局

  • 體式格局1: 純手工打造回調函數
  • 體式格局2: JSON.parse(JSON.stringify(obj))
  • 體式格局3: 藉助jQuery
  • 體式格局4: 藉助lodash

代碼

let developer = {
title: 'Frontend',
basic: {
html: '5',
css: '3',
js: 'es6'
},
frameworks: ['React', 'Vue', 'AngularJS', {node: 'express'}],
summary: function(){
console.log('I am FE developer');
}
};
/*
* 體式格局1: 純手工打造
* */
function cloneInDeep(source) {
if(source && typeof source === 'object'){
let target = {};
for (let prop in source){
let value = source[prop];
if(Array.isArray(value)){
let newArray = [];
value.forEach(function (item, index) {
if(Array.isArray(item) || Object.getPrototypeOf(item) === Object.prototype){
newArray.push(cloneInDeep(item))
}else{
newArray.push(item)
}
});
target[prop] = newArray;
}else if(Object.getPrototypeOf(value) === Object.prototype){
target[prop] = cloneInDeep(value);
}else{
target[prop] = value;
}
}
return target
}else{
throw new Error('source is not object!')
}
}
let newDeveloper = cloneInDeep(developer);
/*
* 體式格局2: JSON.parse(JSON.stringify(obj))
* 弊病:會揚棄對象的constructor
* 實用:可以被json直接示意的數據結構,對象中只包括number、string、boolean、array、扁平對象
* 不實用:含有function、regexp
* */
// let newDeveloper = JSON.parse(JSON.stringify(developer));
/*
* 體式格局3: jQuery
* */
let $ = require('jquery');
// let newDeveloper = $.extend({}, developer);
/*
* 體式格局4: lodash
* */
let _ = require('lodash');
// let newDeveloper = _.cloneDeep(developer);
console.log(newDeveloper);
//基礎範例:不轉變原對象
newDeveloper.title = 'Frontend Leader';
console.log(developer.title); // Frontend
// 對象:不轉變原對象
newDeveloper.basic.http = '2.0';
console.log(developer.basic.http); // undefined
newDeveloper.basic.js = 'es5';
console.log(developer.basic.js); // es6
//數組:不轉變原對象
newDeveloper.frameworks.push('Angular');
console.log(developer.frameworks); // [ 'React', 'Vue', 'AngularJS' , { node: 'express' } ]
newDeveloper.frameworks[3].node = 'koa';
console.log(developer.frameworks); // [ 'React', 'Vue', 'AngularJS' , { node: 'express' } ]
//函數:不轉變原對象
newDeveloper.summary = function () {
console.log('I like FE development');
};
developer.summary(); // I am FE developer

觸及的知識點:

  • 數據範例及存儲機制
  • for…in…遍歷,羅列屬性
  • 遞歸
  • 對象和數組的推斷

推荐阅读
  • 媒介本日再看React纯函数的时刻,看到纯函数历程没有副作用,就是说在纯函数中我们不能转变外部状况.想到了之前看过的函数中传参的观点.数据范例在js中,数据范例分为两类:基础范例值 ... [详细]
  • 一、vue介绍Vue.js是一套构建用户界面(UI)的渐进式JavaScript框架,是一个轻量级MVVM(model-view-viewModel&# ... [详细]
  • React基础篇一 - JSX语法扩展与使用
    本文介绍了React基础篇一中的JSX语法扩展与使用。JSX是一种JavaScript的语法扩展,用于描述React中的用户界面。文章详细介绍了在JSX中使用表达式的方法,并给出了一个示例代码。最后,提到了JSX在编译后会被转化为普通的JavaScript对象。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • 前端微服务二
    为了解决庞大的一整块后端服务带来的变更与扩展方面的限制,出现了微服务架构(Microservices):微服务是面向服务架构(SOA)的一种变体,把应用程序设计成一系列松耦合的细粒 ... [详细]
  • 进修JavaScript的原型笔记
    JavaScript的原型(prototype、__proto__、constructor)组织函数:functionFoo(){};实例对象:letf1newFoo;leto1n ... [详细]
  • 我正在学习网络性能课程,其中共享以下代码:Interestingoperatorconstobjects ... [详细]
  • 十一、构建我们自己的包在本章中,我们将学习如何构建自己的包。编写包可以让我们创建可以在许多应用 ... [详细]
  • 变量和类型用处1.让代码可以重复使用(重用性)2.修改代码方便,灵活(灵活性)document.write(iloveyou)document.wri ... [详细]
  • Lodash中文文档(v3.10.1)–“Collection”要领TranslatedbyPeckZegOriginalDocs:Lodashv3.10.1Docs乞助翻译文档的 ... [详细]
  • 作者|相学长原文|https:github.comwuomzfxblogblobmasterthis.md日常开发中,我们经常用到this。例如用Jquery绑定事件 ... [详细]
  • 本文整理了Java中java.lang.Iterable.iterator()方法的一些代码示例,展示了Iterable.iterator() ... [详细]
  • 本文提供了成为成功软件工程师的7条建议,包括不要低估自己、公司需要你、投资自己等。通过学习新技术、提升编码技能,软件工程师可以获得更好的职业机会和更高的薪水,同时也增强自信。投资自己是取得成功的关键。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • 随着前端技术的发展,越来越多的开发者开始使用react、vue等web框架,但很少有人深入理解这些框架的源码。然而,这些框架底层都是由原生的javascript构建而成。对于初学前端的人来说,可能会认为javascript很容易上手,但实际上只是因为它被高度封装了。与能够使用封装类的人相比,能够理解框架原理的人则处于另一个层面。本文将深入剖析jquery源码,探寻框架底层的原理,帮助读者更好地理解web框架的运行机制。 ... [详细]
author-avatar
妃你莫属L_957
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有