js 對象操作 對象原型操作 把一個對象A賦值給另一個對象B 並且對象B 修改 不會影響 A對象

来源:http://www.cnblogs.com/xuanyubk/archive/2017/11/03/7779420.html
-Advertisement-
Play Games

我最近在做一個vue + element-UI + vue-resource + vuex項目的時候,遇到了一個對象的問題。 當我們在項目需要 複製一個對象到另一個對象並且 被覆制的對象不能受複製後的對象的影響。 我先總結下 我們哪些方法可以複製對象 以上的方法中 都可以把一個對象的鍵值賦值給另一個 ...


我最近在做一個vue + element-UI + vue-resource + vuex項目的時候,遇到了一個對象的問題。

當我們在項目需要 複製一個對象到另一個對象並且  被覆制的對象不能受複製後的對象的影響。

我先總結下 我們哪些方法可以複製對象

// 直接賦值

var obj1 = { a: 1 };
var obj2 = obj1;

console.log(obj2); // { a: 1 }

// 通過 Object.assign() 這個屬性來進行複製

var obj = { a: 1 };
var obj2 = Object.assign({}, obj);

console.log(obj2); // { a: 1 }

// 通過 for in 迴圈賦值

var obj1={ a: 1, b: { c: 2 }, c: 0 }
var obj2={}
for( var key in obj1 ){
    obj2[key]=obj[key]
}

console.log(obj2); // { a: 1, b: { c: 2 }, c: 0 }

 以上的方法中 都可以把一個對象的鍵值賦值給另一個對象(但是我們可以測試出來obj2修改他的鍵值,obj1的鍵值也會被修改),

這就跟我家的鑰匙剛開始是一把鑰匙,然後我到配鑰匙的地方配了一把一模一樣的鑰匙,那麼我的這把原來的鑰匙可以開我家的門,拿我家的東西,那麼配的那把鑰匙,也可以打開我家的門,拿走我家的東西。

 其實我們想做的是,我們心買了一個房子,只是房子里的東西擺設跟我原來的房子是一模一樣的,唯獨不一樣的就是,我原來家的鑰匙只能開原來家的門,新家的鑰匙只能開新家的門,雖然兩個房子里的東西是一模一樣的,但是都是沒有實際的關聯關係。那麼這樣我門需要怎麼做呢。

 我們可以先看看下麵的這個方法

// 使用 Object.assign() 方法複製對象
let obj1 = { a: 0 , b: { c: 0}};
  let obj2 = Object.assign({}, obj1);
  console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}}
  
  obj1.a = 1;
  console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}}
  console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}}
  
  obj2.a = 2;
  console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}}
  console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 0}}
  
  obj2.b.c = 3;
  console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 3}}
  console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 3}}

  

  我們可以看到上面 Object.assign() 的這個方法雖然可以複製我第一層的對象值,並且當我obj2修改第一層的數據時,obj1不會受到影響。

  但是我們在修改obj2 里 b 對象里的c的值得時候,這個時候 obj1 里的 b 對象里的 c 的值也發生了改變,這就說明瞭,Object.assign()這個方法不是深層的複製對象,只是讓對象里第一層的數據沒有了關聯性,但是對象內的對象則跟被覆制的對象有著關聯性的。那麼我們其實可以想象,怎麼才能讓他們完全沒有關聯性沒呢。

  字元串類型 和 對象類型 肯定是沒有關聯性的 ,因為它們的類型都不一樣,肯定是沒有可比性和關聯性的。 有了這樣的想法我覺得我們就有辦法決絕這個問題了;

  

// 這個最簡單暴力的處理 兩個對象的關聯性的問題

  obj1 = { a: 0 , b: { c: 0}};
  let obj3 = JSON.parse(JSON.stringify(obj1));
  obj1.a = 4;
  obj1.b.c = 4;
  console.log(JSON.stringify(obj3)); // { a: 0, b: { c: 0}}

  上面的代碼已經可以體現出來我們剛纔的一個假設,我們先把obj1 轉成了字元串類型, 這樣他就失去了對象的屬性和一切的特性,然後我們再把它轉成一個對象類型,這樣我們心生成的對象是通過字元串轉換過來的,已經是一個新的對象,然後再賦值給obj2 ,這樣就相當於,我把我原來家的佈置等東西,用設計稿的方式展現出來,然後我們又買了一個新家,按著原來的設計方式重構了出來,這樣兩個房子的內飾是一模一樣的,但是門的鑰匙不一樣,這樣就失去了以前的關聯性。

以上的方法可以封裝成方法方便使用

var function cloneObjectFn (obj){ // 對象複製
    return JSON.parse(JSON.stringify(obj))
}

var obj1={a:2,b{c:0}}
var obj2=cloneObjectFn(obj1)
console.log(obj2)    // {a:2,b{c:0}}

  

第一次寫博客,寫的不好的地方希望各位不要噴(*^__^*)

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天在使用滑鼠事件時,用錯了mouseout,於是做個測試總結。 結論: mouseenter:當滑鼠移入某元素時觸發。 mouseleave:當滑鼠移出某元素時觸發。 mouseover:當滑鼠移入某元素時觸發,移入和移出其子元素時也會觸發。 mouseout:當滑鼠移出某元素時觸發,移入和移出其 ...
  • 面試中經常考到面向對象的一些知識,在這記錄一下,如有不對歡迎指正,願在前端的道路上共勉! 一、原型 1.什麼是原型: 簡單說就像css的class一樣,是公用的,給DOM元素加個class名就可以公用樣式,那麼原型就相當於css裡面的class,都可以用。 在構造函數創建出來的時候,系統會預設的幫構 ...
  • (web前端學習交流群:328058344 禁止閑聊,非喜勿進!) 顏色 桃紅~紛紅 顏色 紫 顏色 褐~橘~米白 顏色 金~黃 顏色 ~黃 綠 顏色 藍 顏色 黑~灰~白 顏色 ...
  • 轉自st.gg 為什麼用 $scope.user = $scope.master; $scope.master 會跟著 $scope.user 改變?angular.copy 和 = 號賦值有什麼區別呢?新手還沒有搞懂,請教各位了。 你可以這麼來理解: 記憶體里有一段地址儲存了 { firstName ...
  • 前段時間不是很忙,剛好公司需要開發一個微信小程式,於是我就入坑了(此坑還是有點深滴,請備好乾糧)。 我是一名iOS開發工程師,個人覺得入門開發小程式的話,需要基本的web前端知識,比如說:代碼的書寫格式,規範,標簽以及樣式的使用等,但作為一門如此新的開發語言,它也有自己的獨特之處,就像我們的swif ...
  • 轉自CSDN: 工作有問題上CSDN上轉轉. $apply()和$digest()在AngularJS中是兩個核心概念,但是有時候它們又讓人困惑。而為了瞭解AngularJS的工作方式,首先需要瞭解$apply()和$digest()是如何工作的。這篇文章旨在解釋$apply()和$digest() ...
  • Vue 2.5 發佈了:15篇前端熱文回看 2017-11-02 前端大全 (點擊上方公眾號,可快速關註) 本文精選了「前端大全」2017 年 10 月的 15 篇熱門文章。其中有職場分享、技術分享和技術資源。 註:以下文章,點擊標題即可閱讀 《Vue 2.5 發佈了》 我們很高興宣佈 Vue 2. ...
  • 為了方便演示,我已經把一個靜態DEMO部署到github,傳送門 關於項目訪問,因為讀取遠程json數據,直接用瀏覽器打開有安全限制.請將項目放到tomcat啟動訪問或者直接用idea/webstorm打開項目直接右鍵打開,如下圖所示: 完整代碼單獨放到了github:https://github. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...