最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript中引用vs復(fù)制示例詳析

 更新時(shí)間:2018年12月06日 09:49:49   作者:Lastingman  
這篇文章主要給大家介紹了關(guān)于JavaScript中引用vs復(fù)制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

好像一般很少人講到j(luò)s中的引用和復(fù)制,不過(guò)弄清楚這個(gè)概念可以幫助理解很多東西

先講一下很基礎(chǔ)的東西,看看js中幾種數(shù)據(jù)類(lèi)型分別傳的什么

引用:對(duì)象、數(shù)組、函數(shù)

復(fù)制:數(shù)字、布爾

字符串單獨(dú)說(shuō)明,因?yàn)樗奶厥庑?,無(wú)法確定是傳遞引用還是復(fù)制數(shù)值(因?yàn)樽址闹凳菦](méi)法改變的,所以糾結(jié)這個(gè)問(wèn)題也是沒(méi)意義的)但是用于比較的時(shí)候顯然是屬于傳值比較

下面來(lái)一起看看詳細(xì)的介紹吧

首先我們看下面這個(gè)例子:

let age = 18;
let age2 = age;
console.log(age, age2);

我們會(huì)得到以下的值:

18 18

這個(gè)相信大家都能很好理解。

那么如果我們改變 age 的值呢?輸出會(huì)有什么變化?

age = 20;
console.log(age, age2);

我們會(huì)得到:

20 18

看到這里大家就奇怪了,上面的結(jié)果都很正常啊。

但在 JavaScript 中是有例外的,對(duì)于普通數(shù)據(jù)類(lèi)型如 integer,string,boolean 可以通過(guò) = 來(lái)復(fù)制這個(gè)變量,但對(duì)于 array 和 object 數(shù)據(jù)類(lèi)型,= 只能起到引用的效果。

大家可以看下面這個(gè)例子:

let arr = ['wes', 'bob', 'faker'];
let arr2 = arr;
console.log(arr2, arr);
arr[2] = 'dean';
console.log(arr2, arr);

得到的結(jié)果是:

["wes", "bob", "faker"] ["wes", "bob", "faker"]
["wes", "bob", "dean"] ["wes", "bob", "dean"]

我們會(huì)發(fā)現(xiàn)隨著 arr 的改變,arr2 也會(huì)跟著改變。

說(shuō)明 arr2 并沒(méi)有復(fù)制 arr 的值,只是引用了它,它們都指向同一個(gè)內(nèi)存中的值。

object 也是一樣的:

let obj = {
 age: 19,
 name: 'like',
 last: 'jam'
};
let obj2 = obj;
console.log(obj, obj2);
obj.age = 50;
console.log(obj, obj2);

得到的結(jié)果是:

{age: 19, name: "like", last: "jam"} {age: 19, name: "like", last: "jam"}
{age: 50, name: "like", last: "jam"} {age: 50, name: "like", last: "jam"}

那么如何復(fù)制 array 和 object 呢?

復(fù)制 array 的方法:

方法1:

let arr2 = [].concat(arr);

方法2:

let arr2 = arr.slice();

方法3:

let arr2 = Array.from(arr);

方法4:

let arr2 = [...arr];

一般我們比較常用的是方法3和方法4,方法1和方法2比較取巧,但都是可以達(dá)到復(fù)制 array 的目的的。

ps: [...arr] 是 ES6 中的方法。

復(fù)制 object 的方法:

方法1:

let obj2 = Object.assign({}, obj);

方法2:

let obj2 = {...obj};

方法1和方法2都有個(gè)缺點(diǎn),它們只會(huì)復(fù)制對(duì)象的第一層。

看下面這個(gè)例子:

let obj = {
 number: 12,
 name: {
  first: 'bob',
  last: 'evil'
 }
};
let obj2 = Object.assign({}, obj);
obj.number = 50;
console.log(obj, obj2);

我們會(huì)得到下面的結(jié)果:

obj = {
    number: 50,
    name: {
        first: 'bob',
        last: 'evil'
    }
}

obj2 = {
    number: 12,
    name: {
        first: 'bob',
        last: 'evil'
    }
}

但如果我們改變第二層的值:

obj.name.first = 'sam';
console.log(obj, obj2);

obj = {
    number: 50,
    name: {
        first: 'sam',
        last: 'evil'
    }
}

obj2 = {
    number: 12,
    name: {
        first: 'sam',
        last: 'evil'
    }
}

我們發(fā)現(xiàn)對(duì)象第二層依舊是引用的,并沒(méi)有實(shí)現(xiàn)復(fù)制。

那么怎么復(fù)制一個(gè)完整的 object 呢?

最簡(jiǎn)單的方法就是使用第三方函數(shù)庫(kù) lodash ,它提供了 clone 和 deepclone 完全可以滿足日常的需求。

object 的復(fù)制因?yàn)橐紤]到很多因素,我會(huì)另開(kāi)一篇,專(zhuān)門(mén)整理。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 不使用jquery實(shí)現(xiàn)js打字效果示例分享

    不使用jquery實(shí)現(xiàn)js打字效果示例分享

    js打字效果示例js打字效果示例,data-period設(shè)置從打字返回刪字的時(shí)間,data-rotate可加減中英文詞語(yǔ),不用jquery支持
    2014-01-01
  • CSS3 動(dòng)畫(huà)卡頓性能優(yōu)化的完美解決方案

    CSS3 動(dòng)畫(huà)卡頓性能優(yōu)化的完美解決方案

    今天小編就為大家分享一篇關(guān)于css3 動(dòng)畫(huà)卡頓性能優(yōu)化的完美解決方案,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-09-09
  • uniapp?H5遮罩層、彈窗以及蒙層滾動(dòng)穿透/滑動(dòng)穿透解決辦法

    uniapp?H5遮罩層、彈窗以及蒙層滾動(dòng)穿透/滑動(dòng)穿透解決辦法

    最近用uin-app做項(xiàng)目遇到了不少問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于uniapp?H5遮罩層、彈窗以及蒙層滾動(dòng)穿透/滑動(dòng)穿透的解決辦法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • JavaScript 隱式類(lèi)型轉(zhuǎn)換規(guī)則詳解

    JavaScript 隱式類(lèi)型轉(zhuǎn)換規(guī)則詳解

    這篇文章主要為大家介紹了JavaScript 隱式類(lèi)型轉(zhuǎn)換規(guī)則詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2023-05-05
  • 基于JavaScript實(shí)現(xiàn)移動(dòng)端TAB觸屏切換效果

    基于JavaScript實(shí)現(xiàn)移動(dòng)端TAB觸屏切換效果

    我們使用移動(dòng)端時(shí)可以通過(guò)觸屏手勢(shì)左右滑動(dòng)來(lái)切換TAB欄目,如網(wǎng)易新聞等APP欄目切換。我們說(shuō)的TAB一般由導(dǎo)航條和TAB對(duì)應(yīng)的內(nèi)容組成,切換導(dǎo)航條上的標(biāo)簽同時(shí)標(biāo)簽對(duì)應(yīng)的內(nèi)容也會(huì)跟著切換。本文將結(jié)合實(shí)例給大家介紹一個(gè)移動(dòng)端TAB觸屏切換效果。
    2015-10-10
  • IFrame跨域高度自適應(yīng)實(shí)現(xiàn)代碼

    IFrame跨域高度自適應(yīng)實(shí)現(xiàn)代碼

    最近在做項(xiàng)目中,遇到一個(gè)問(wèn)題,就是iframe高度的自適應(yīng)問(wèn)題,以下是解決辦法
    2012-08-08
  • PWA介紹及快速上手搭建一個(gè)PWA應(yīng)用的方法

    PWA介紹及快速上手搭建一個(gè)PWA應(yīng)用的方法

    這篇文章主要介紹了PWA介紹及快速上手搭建一個(gè)PWA應(yīng)用的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • 微信小程序數(shù)據(jù)操作指南之從綁定到更新的操作方法

    微信小程序數(shù)據(jù)操作指南之從綁定到更新的操作方法

    在微信小程序開(kāi)發(fā)中,數(shù)據(jù)操作是不可或缺的一環(huán),文章詳細(xì)介紹了數(shù)據(jù)綁定、更新等方法,并提供示例和注意事項(xiàng),幫助開(kāi)發(fā)者更好地應(yīng)用這些技術(shù),本文給大家介紹微信小程序數(shù)據(jù)操作指南之從綁定到更新,感興趣的朋友跟隨小編一起看看吧
    2024-10-10
  • JavaScript判斷是否是微信瀏覽器

    JavaScript判斷是否是微信瀏覽器

    通過(guò)判斷UA中是否有關(guān)鍵字micromessenger,有的話則是微信內(nèi)置瀏覽器。下面小編給大家分享實(shí)現(xiàn)代碼,代碼簡(jiǎn)單易懂,需要的朋友可以參考下
    2016-06-06
  • 關(guān)于layui表單中按鈕自動(dòng)提交的解決方法

    關(guān)于layui表單中按鈕自動(dòng)提交的解決方法

    今天小編就為大家分享一篇關(guān)于layui表單中按鈕自動(dòng)提交的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-09-09

最新評(píng)論

北京市| 正宁县| 洪洞县| 鹤庆县| 桦川县| 崇州市| 萨迦县| 关岭| 勃利县| 天台县| 阿拉善盟| 德江县| 黎平县| 三原县| 罗平县| 武山县| 襄汾县| 东乡族自治县| 苍梧县| 湘潭市| 佳木斯市| 漠河县| 日喀则市| 盈江县| 集安市| 南木林县| 江西省| 思南县| 吉林省| 凤翔县| 永清县| 江永县| 申扎县| 庄河市| 邹平县| 纳雍县| 关岭| 崇明县| 荣成市| 泾源县| 会宁县|