摘要:?jiǎn)栴}剛才碰到了一個(gè)這樣的問(wèn)題有一個(gè)由對(duì)象組成的數(shù)組,把其中一個(gè)對(duì)象賦值給變量,然后改變了的屬性,對(duì)應(yīng)的原來(lái)數(shù)組中的對(duì)象的屬性也會(huì)隨之改變。
問(wèn)題
剛才碰到了一個(gè)這樣的問(wèn)題:有一個(gè)由對(duì)象組成的數(shù)組,把其中一個(gè)對(duì)象賦值給變量p,然后改變了p的屬性,對(duì)應(yīng)的原來(lái)數(shù)組中的對(duì)象的屬性也會(huì)隨之改變。
var arr = [{x:0, y:0}, {x:0, y:0}] var p = arr[0] p.x = 1 p.y = 2 console.log(arr) // [{x:1, y:2}, {x:0, y:0}]探究
我一開(kāi)始以為這是數(shù)組的什么神奇特性,經(jīng)過(guò)幾番試驗(yàn)發(fā)現(xiàn)只有由對(duì)象組成的數(shù)組有這個(gè)問(wèn)題,隱隱覺(jué)得這是對(duì)象的某個(gè)特性,然后又試了下,果然如此!
var a = {x:0, y:0} var p = a p.x = 1 console.log(a) // {x:1, y:0}
把a賦值給變量p之后,改變p的某個(gè)屬性,a中對(duì)應(yīng)的屬性也會(huì)隨之改變。
原因簡(jiǎn)單地想了一下原因,不知道正確不正確:
var p = a是讓p指向了a所代表的對(duì)象。同理,var a = {x:0, y:0}是讓a指向了{x:0, y:0}這樣一個(gè)對(duì)象。所以實(shí)際上p和a指向的是同一個(gè)對(duì)象,修改其它們中任何一個(gè)都會(huì)使另一個(gè)一同改變。
那有沒(méi)有讓p改變之后a保持不變的辦法呢?
有的!
var a = {x:0, y:0} var p = {} p.x = a.x p.y = a.y
通過(guò)這種方式把a的屬性一一對(duì)應(yīng)地賦值給p,之后對(duì)p做出的任何修改都不會(huì)影響到a。但是這種方法很麻煩,特別是碰到屬性很多的對(duì)象,那么可以寫個(gè)函數(shù)來(lái)完成這個(gè)工作:
function cloneObj(obj) { var newObj = {} for(var prop in obj) { newObj[prop] = obj[prop] } return newObj }
var a = {x:0} var p = cloneObj(a) p.x = 2 console.log(p) // {x:2} console.log(a) // {x:0}
成功了!修改p的屬性之后a的屬性沒(méi)有隨之改變。
后來(lái)網(wǎng)上查了查,發(fā)現(xiàn)js中有深拷貝和淺拷貝這樣的區(qū)分,粗粗看了一遍。但是沒(méi)有更多的實(shí)際使用經(jīng)驗(yàn)所以理解也不是很深刻,如果以后有了更深的見(jiàn)解的話到時(shí)候再來(lái)寫一篇。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/88147.html
showImg(https://segmentfault.com/img/remote/1460000018771037?w=900&h=500); 簡(jiǎn)介 benchmark、基準(zhǔn)測(cè)試、jsPerf 在 優(yōu)雅插入數(shù)組 一文中大家最多的評(píng)論就是 能不能加個(gè)基準(zhǔn)測(cè)試。小二不是不喜歡加基準(zhǔn)測(cè)試而是現(xiàn)在硬件設(shè)備的性能越來(lái)越快了,有時(shí)候一些操作不是性能問(wèn)題的主要原因,當(dāng)然這不是我們不寫出好代碼的理由。 書寫...
摘要:在執(zhí)行如下命令之后如果你的電腦沒(méi)有裝,那么執(zhí)行就會(huì)出現(xiàn)如下的顯示不是內(nèi)部或外部命令,也不是可運(yùn)行的程序或批處理文件。是制作的生成器需要,官網(wǎng)是。使用來(lái)生成網(wǎng)站,如果沒(méi)有安裝的話,需要使用進(jìn)行安裝。解決方法安裝后即可 在terminal執(zhí)行如下命令之后 npm install -g generator-keystone 如果你的電腦沒(méi)有裝yo,那么執(zhí)行 yo keystone 就會(huì)出...
摘要:背景微信退款接口需要使用到證書,我參考微信的官方進(jìn)行,部分代碼如下上面的代碼,在本地調(diào)試的時(shí)候正常跑過(guò),沒(méi)有出現(xiàn)任何異常,但是放到測(cè)試環(huán)境之后便會(huì)出現(xiàn)下面的異常,這三種異常都是從這里拋出來(lái)的。 背景 微信退款接口需要使用到證書,我參考微信的官方Demo進(jìn)行,部分代碼如下: char[] password = config.getMchID().toCharArray(); InputS...
摘要:出現(xiàn)原因在子頁(yè)面關(guān)閉時(shí),會(huì)釋放掉在子頁(yè)面中聲明賦值的對(duì)象。所以在父頁(yè)面所有對(duì)這個(gè)對(duì)象的引用操作都會(huì)產(chǎn)生這個(gè)錯(cuò)誤。然后在父頁(yè)面中使用變成對(duì)象。 在IE瀏覽器中出現(xiàn)的問(wèn)題 1.不能執(zhí)行已釋放 Script 的代碼 1.bug出現(xiàn)背景:在使用iframe標(biāo)簽時(shí),如果子頁(yè)面向父頁(yè)面?zhèn)鬟f在子頁(yè)面創(chuàng)建的對(duì)象(所有對(duì)象,包括數(shù)組,函數(shù),正則等)時(shí),會(huì)出現(xiàn)這個(gè)bug。 2.bug出現(xiàn)原因: 在子頁(yè)面關(guān)...
摘要:后來(lái)?yè)Q了各種系統(tǒng)環(huán)境,包括更改中文支持,依然如故,只有在自己的上是正常的。查看是否有中文字體,一般情況下是不存在的,否則也不會(huì)亂碼。再一次運(yùn)行程序腳本,查看截圖是否包含正常的中文字符。 在centos7環(huán)境下使用chrome-php或wkhtmltoimage截圖時(shí)出現(xiàn)的中文亂碼解決方案 最近做了一個(gè)小項(xiàng)目,要求使用chrome/chromium對(duì)抓取的頁(yè)面進(jìn)行截圖保存并上傳云服務(wù),因...
閱讀 610·2024-11-06 13:38
閱讀 877·2024-09-10 13:19
閱讀 1054·2024-08-22 19:45
閱讀 1402·2021-11-19 09:40
閱讀 2658·2021-11-18 13:14
閱讀 4310·2021-10-09 10:02
閱讀 2351·2021-08-21 14:12
閱讀 1301·2019-08-30 15:54