国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

javascript之深淺拷貝

LMou / 3280人閱讀

摘要:為何寫最近在研究深淺拷貝,找了很多資料,感覺不是很滿意,所以自己就整理了一份。深拷貝如果給放到新的內(nèi)存中,將的各個(gè)屬性都復(fù)制到新內(nèi)存里,就是深拷貝。安全的值是指能夠呈現(xiàn)為有效格式的值。參考文檔冴羽的專題之深淺拷貝深拷貝與淺拷貝的實(shí)現(xiàn)

為何寫:

最近在研究深淺拷貝,找了很多資料,感覺不是很滿意,所以自己就整理了一份。廢話不多說,我們來一起復(fù)習(xí)一下吧,也希望留下您寶貴意見。

何為深淺拷貝?
深拷貝和淺拷貝是只針對(duì)Object和Array這樣的復(fù)雜類型的

1.淺拷貝:

我們先來看2個(gè)栗子:

let a = {
 name: "azi"
}
let b = a;
b.name = "zhangsan";
console.log(a.name);  // zhangsan
console.log(b.name); // zhangsan
let a = ["hello","world"]
let b = a;
b[1]= "azi";
console.log(a);  // ["hello", "azi"]
console.log(b); // ["hello", "azi"]

從栗子中可以看出:

a和b指向同一塊內(nèi)存,所以修改其中任意的值,另一個(gè)值都會(huì)隨之變化,這就是淺拷貝。

2.深拷貝:

如果給b放到新的內(nèi)存中,將a的各個(gè)屬性都復(fù)制到新內(nèi)存里,就是深拷貝。

換句話說,也就是b的屬性改變時(shí),a的屬性不會(huì)跟著變化。

常用的實(shí)現(xiàn)方法有哪些?

1.淺拷貝:

數(shù)組:

Array.slice()、  Array.concat()、 ...

對(duì)象:

Object.assign()、 ...

栗子:

// concat concat方法不會(huì)改變this或任何作為參數(shù)提供的數(shù)組,而是返回一個(gè)淺拷貝,它包含與原始數(shù)組相結(jié)合的相同元素的副本

let arr = ["old", 1, true, null, undefined];
let new_arr1 = arr.concat();
new_arr1[0] = "new";
console.log(arr) // ["old", 1, true, null, undefined]
console.log(new_arr1) // ["new", 1, true, null, undefined]

// slice slice()方法返回一個(gè)從開始到結(jié)束(不包括結(jié)束)選擇的數(shù)組的一部分淺拷貝到一個(gè)新數(shù)組對(duì)象

let new_arr2 = arr.slice();
new_arr2[0] = "new";
console.log(arr) // ["old", 1, true, null, undefined]
console.log(new_arr2) // ["new", 1, true, null, undefined]

// ... 擴(kuò)展運(yùn)算符 復(fù)制數(shù)組時(shí)候, 拓展語句只會(huì)進(jìn)行淺復(fù)制, 因此如下所示, 它并不適合復(fù)制多維數(shù)組 (與Object.assign() 相同

let new_arr3 = [...arr];
new_arr3[0] = "new";
console.log(arr) // ["old", 1, true, null, undefined]
console.log(new_arr3) // ["new", 1, true, null, undefined]
// Object.assign() Object.assign方法只會(huì)拷貝源對(duì)象自身的并且可枚舉的屬性到目標(biāo)對(duì)象

let obj1 = {a:0, b:{c:0}};
let obj2 = Object.assign({},obj1);
obj2.b.c =2 ;
obj2.a =2 ;
console.log(obj1); // {a:0,b:{c:2}}
console.log(obj2); // {a:2,b:{c:2}}

// ...
let obj3 = {...obj1};
obj3.b.c =3 ;
obj3.a =3 ;
console.log(obj1); // {a:0,b:{c:3}}
console.log(obj3); // {a:3,b:{c:3}}

2.深拷貝:

JSON.parse( JSON.stringify(arr) )

在使用JSON.stringify() 需要注意一下幾點(diǎn):

1.JSON.stringify(..) 在將 JSON 對(duì)象序列化為字符串時(shí)和 toString() 的效果基本相同,只不過序列化的結(jié) 果總是字符串:

JSON.stringify( 42 ); // "42"
JSON.stringify( "42" ); // ""42""(含有雙引號(hào)的字符串)
JSON.stringify( null ); // "null"
JSON.stringify( true ); // "true"

2.所有安全的 JSON 值(JSON-safe)都可以使用 JSON.stringify(..) 字符串化。安全的 JSON 值是指能夠呈現(xiàn)為有效 JSON 格式的值。
3.undefined、function、symbol (ES6+)和包含循環(huán)引用(對(duì)象之間相互引用,形成一個(gè)無限循環(huán))的對(duì)象都不符合 JSON結(jié)構(gòu)標(biāo)準(zhǔn),支持 JSON 的語言無法處理它們
4.JSON.stringify(..) 在對(duì)象中遇到 undefined、function 和 symbol 時(shí)會(huì)自動(dòng)將其忽略,在
數(shù)組中則會(huì)返回 null(以保證單元位置不變)。
例如:

 JSON.stringify( undefined ); // undefined
 JSON.stringify( function(){} );  // undefined
 JSON.stringify([1,undefined,function(){},4]); // "[1,null,null,4]"
 JSON.stringify({ a:2, b:function(){} }) // "{"a":2}"

對(duì)包含循環(huán)引用的對(duì)象執(zhí)行 JSON.stringify(..) 會(huì)出錯(cuò)。

當(dāng)然也可以用JQ的extend 函數(shù)的實(shí)現(xiàn),這里就不具體說了。

參考文檔:
冴羽的JavaScript專題之深淺拷貝
Alloyteam深拷貝與淺拷貝的實(shí)現(xiàn)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/107139.html

相關(guān)文章

  • JavaScript專題深淺拷貝

    摘要:專題系列第六篇,講解深淺拷貝的技巧和以及實(shí)現(xiàn)深淺拷貝的思路前言拷貝也是面試經(jīng)典吶數(shù)組的淺拷貝如果是數(shù)組,我們可以利用數(shù)組的一些方法比如返回一個(gè)新數(shù)組的特性來實(shí)現(xiàn)拷貝。所以我們可以看出使用和是一種淺拷貝。 JavaScript 專題系列第六篇,講解深淺拷貝的技巧和以及實(shí)現(xiàn)深淺拷貝的思路 前言 拷貝也是面試經(jīng)典吶! 數(shù)組的淺拷貝 如果是數(shù)組,我們可以利用數(shù)組的一些方法比如:slice、co...

    RancherLabs 評(píng)論0 收藏0
  • 深入理解 Javascript JS的深淺拷貝

    摘要:動(dòng)手實(shí)現(xiàn)深拷貝利遞歸來實(shí)現(xiàn)對(duì)對(duì)象或數(shù)組的深拷貝。遞歸思路對(duì)屬性中所有引用類型的值進(jìn)行遍歷,直到是基本類型值為止。深拷貝只對(duì)對(duì)象自有屬性進(jìn)行拷貝測(cè)試數(shù)據(jù)拷貝方式其實(shí)也是一種繼承的方式,當(dāng)然繼承還是有其他方法的感謝支持 深淺拷貝 基本類型 & 引用類型 ECMAScript中的數(shù)據(jù)類型可分為兩種: 基本類型:undefined,null,Boolean,String,Number,Symb...

    Tikitoo 評(píng)論0 收藏0
  • 深入理解JS深淺拷貝

    摘要:深拷貝相比于淺拷貝速度較慢并且花銷較大。所以在賦值完成后,在棧內(nèi)存就有兩個(gè)指針指向堆內(nèi)存同一個(gè)數(shù)據(jù)。結(jié)果如下擴(kuò)展運(yùn)算符只能對(duì)一層進(jìn)行深拷貝如果拷貝的層數(shù)超過了一層的話,那么就會(huì)進(jìn)行淺拷貝那么我們可以看到和展開原算符對(duì)于深淺拷貝的結(jié)果是一樣。 JS中數(shù)據(jù)類型 基本數(shù)據(jù)類型: undefined、null、Boolean、Number、String和Symbol(ES6) 引用數(shù)據(jù)類型:...

    JackJiang 評(píng)論0 收藏0
  • JavaScript專題系列文章

    摘要:專題系列共計(jì)篇,主要研究日常開發(fā)中一些功能點(diǎn)的實(shí)現(xiàn),比如防抖節(jié)流去重類型判斷拷貝最值扁平柯里遞歸亂序排序等,特點(diǎn)是研究專題之函數(shù)組合專題系列第十六篇,講解函數(shù)組合,并且使用柯里化和函數(shù)組合實(shí)現(xiàn)模式需求我們需要寫一個(gè)函數(shù),輸入,返回。 JavaScript 專題之從零實(shí)現(xiàn) jQuery 的 extend JavaScritp 專題系列第七篇,講解如何從零實(shí)現(xiàn)一個(gè) jQuery 的 ext...

    Maxiye 評(píng)論0 收藏0
  • JS專題深淺拷貝

    摘要:在之前的文章專題之?dāng)?shù)據(jù)類型和類型檢測(cè)中我有講過,中的數(shù)據(jù)類型分為兩種,基本數(shù)據(jù)類型和引用數(shù)據(jù)類型,基本數(shù)據(jù)類型是保存在棧的數(shù)據(jù)結(jié)構(gòu)中的是按值訪問,所以不存在深淺拷貝問題。 前言 在開發(fā)過程中,偶爾會(huì)遇到這種場(chǎng)景,拿到一個(gè)數(shù)據(jù)后,你打算對(duì)它進(jìn)行處理,但是你又希望拷貝一份副本出來,方便數(shù)據(jù)對(duì)比和以后恢復(fù)數(shù)據(jù)。 那么這就涉及到了 JS 中對(duì)數(shù)據(jù)的深淺拷貝問題,所謂深淺拷貝,淺拷貝的意思就是,...

    ASCH 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

LMou

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<