引用類型與對(duì)象拷貝

基本類型允跑、引用類型

  • 基本類型(字符串王凑、數(shù)值搪柑、布爾值、null 和 undefined):指的是保存在棧內(nèi)存中的簡(jiǎn)單數(shù)據(jù)段
  • 引用類型(對(duì)象索烹、數(shù)組工碾、函數(shù)、正則):指的是那些保存在堆內(nèi)存中的對(duì)象百姓,變量中保存的實(shí)際上只是一個(gè)指針渊额,這個(gè)指針執(zhí)行內(nèi)存中的另一個(gè)位置,由該位置保存對(duì)象

練習(xí)一

var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);
console.log(obj1 = obj2);
console.log(obj1 == obj2);
// -----------------------//
/*
得到的結(jié)果為
// false
// {a: 1, b: 2}
// true
分析如下:
聲明了兩個(gè)對(duì)象垒拢,屬性和屬性值皆相同旬迹,但 obj1 和 obj2 是兩個(gè)不同的對(duì)象
var obj1 = {a: 1, b: 2} // 假設(shè)內(nèi)存地址為 0x0000
var obj2 = {a: 1, b: 2} // 假設(shè)內(nèi)存地址為 0x0088
console.log(obj1 == obj2) // 二者指向的不是同一個(gè)對(duì)象(地址)邀杏,為 false
console.log(obj1 = obj2) // 賦值操作待秃,使得 obj1 指針指向的地址變?yōu)?0x0088
console.log(obj1 == obj2) // 二者指向同一個(gè)對(duì)象(地址),為 true
*/

練習(xí)二

var a = 1
var b = 2
var c = {name: '饑人谷', age: 2}
var d = [a, b, c]

var aa = a // 1
var bb = b // 2
var cc = c // {name: '饑人谷', age: 2}
var dd = d // [1, 2, {name: '饑人谷', age: 2}]

a = 11
b = 22
c.name = 'hello' 
d[2]['age'] = 3

console.log(aa)
console.log(bb)
console.log(cc)
console.log(dd)
//--------------//
/*
結(jié)果如下
// 1
// 2
// {name: 'hello', age: 3}
// [1, 2, {name: 'hello', age: 3}]
分析如下:
a少漆、b 都為基本類型中的number尸疆,對(duì) aa椿猎、bb 賦值之后,aa寿弱、bb 也為基本類型的 number犯眠,無論對(duì) a、b 如何修改症革,都不會(huì)影響 aa筐咧、bb 的值,
而對(duì)象 c 是引用類型噪矛,標(biāo)識(shí)符 c 的指針指向 {name: '饑人谷', age: 2} 在內(nèi)存中所在的地址嗜浮,對(duì) cc 賦值操作,cc 也指向同一個(gè)地址摩疑,對(duì) c 進(jìn)行修改,實(shí)際上是對(duì) {name: '饑人谷', age: 2} 進(jìn)行修改畏铆,凡是引用了這一對(duì)象的標(biāo)識(shí)符都會(huì)受其影響雷袋,所以 cc、dd 中的 name 和 age 分別變?yōu)?'hello' 和 3
*/

練習(xí)三

var a = 1
var c = {name: 'jirengu', age: 2}

function f1(n){
  ++n // 前增量
}
function f2(obj){
  ++obj.age
}
f1(a)
f2(c)
f1(c.age)
console.log(a)
console.log(c)
//----------------//
/*
結(jié)果如下:
// 1
// {name: 'jirengu', age: 3}
分析如下:
a 為基本類型的number辞居,
執(zhí)行 f1(a) 不會(huì)影響全局作用域下的 a楷怒,所以 a 仍然為 1
c 為引用類型的對(duì)象,
執(zhí)行 f2(c) 時(shí)瓦灶,c 作為參數(shù)傳遞進(jìn)入 f2鸠删,實(shí)則 f2 的參數(shù) obj = c,obj 指向?qū)ο?{name: 'jirengu', age: 2}贼陶,f2 內(nèi)部對(duì) obj.age自增1刃泡,會(huì)影響到所引用的對(duì)象巧娱,對(duì)象變?yōu)?{name: 'jiregu', age: 3}
執(zhí)行 f1(c.age) 時(shí),f1 內(nèi)部的 n 實(shí)際上獲得了 age 的屬性值 2烘贴,之后同第一步禁添,n 自增1,但 age 的屬性值不受影響桨踪,仍為 3
*/

練習(xí)四 過濾數(shù)組老翘,在原數(shù)組上操作

var arr = [3, 1, 0, -1, -3, 2, -5]
function filter(arr){
  for(let i = 0; i < arr.length; i++){
    if(arr[i]<0 || arr[i] == 0){
      arr.splice(i, i); // 若不是正數(shù),刪除
      i--; // 抵消 i++ 的自增1 效果锻离,下一輪循環(huán)仍從該位開始
    }
  }
  return arr;
}
filter(arr)
console.log(arr) // [3, 1, 2]

練習(xí)五 過濾數(shù)組铺峭,不在原數(shù)組上操作

var arr = [3, 1, 0, -1, -3, 2, -5]
function filter(arr){
  if(Array.prototype.filter){
    return Array.prototype.filter.call(arr, function(x){
      return x > 0;
    });
  } else {
    var result = [];
    for (let i = 0; i < arr.length; i++) {
      if (arr[i] > 0) {
        result.push(arr[i])
      }
    }
    return result;
  }
}
var arr2 = filter(arr)
console.log(arr2) // [3, 1, 2]
console.log(arr) // [3, 1, 0, -1, -3, 2, -5]

對(duì)象拷貝

參考:javaScript中淺拷貝和深拷貝的實(shí)現(xiàn)

// 淺拷貝
function shallowCopy(oldObj) {
  var newObj = {};
  for (var i in oldObj) {
    if (oldObj.hasOwnProperty(i)) {
      newObj[i] = oldObj[i];
    }
  }
  return newObj;
}

var x = {
  a: 1,
  b: {f: {g: 1}},
  c: [1, 2, 3]
};
var y = shallowCopy(x);
console.log(y.b.f === x.b.f); // true

// Object.assign() 可以把任意多個(gè)的元對(duì)象自身的可枚舉屬性拷貝給目標(biāo)對(duì)象
var x = {
  a: 1,
  b: { f: { g: 1 } },
  c: [1, 2, 3]
};
var y = Object.assign({}, x);
console.log(y.b.f === x.b.f); // true


// 深拷貝
function deepcCopy(oldObj) {
  var newObj = {};
  for (var key in oldObj) {
    if(oldObj.hasOwnProperty(key)) {
      if (typeof oldObj[key] === 'number' || typeof oldObj[key] === 'boolean' || typeof oldObj[key] === 'string' || oldObj[key] === undefined || oldObj[key] === null) {
        newObj[key] = oldObj[key];
      } else {
        newObj[key] = deepCopy(oldObj[key]); // 遞歸調(diào)用,層層遍歷拷貝
      }
    }
  }
  return newObj;
}

// JSON.parse汽纠、JSON.stringify實(shí)現(xiàn)深拷貝
var source = { name: "source", child: { name: "child" } };
var target = JSON.parse(JSON.stringify(source));
target.name = "target"; // 改變 target 的 name 屬性值
console.log(source.name); // source
console.log(target.name); // target
target.child.name = "target child"; // 改變 target 的 child
console.log(source.child.name); // child
console.log(target.child.name); // target child

記住卫键,深拷貝的目的在于,拷貝完成時(shí)疏虫,就“切斷”引用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末永罚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子卧秘,更是在濱河造成了極大的恐慌呢袱,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翅敌,死亡現(xiàn)場(chǎng)離奇詭異羞福,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蚯涮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門治专,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人遭顶,你說我怎么就攤上這事张峰。” “怎么了棒旗?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵喘批,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我铣揉,道長(zhǎng)饶深,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任逛拱,我火速辦了婚禮敌厘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘朽合。我一直安慰自己俱两,他們只是感情好饱狂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锋华,像睡著了一般嗡官。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上毯焕,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天衍腥,我揣著相機(jī)與錄音,去河邊找鬼纳猫。 笑死婆咸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的芜辕。 我是一名探鬼主播尚骄,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼侵续!你這毒婦竟也來了倔丈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤状蜗,失蹤者是張志新(化名)和其女友劉穎需五,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轧坎,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宏邮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缸血。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜜氨。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖捎泻,靈堂內(nèi)的尸體忽然破棺而出飒炎,到底是詐尸還是另有隱情,我是刑警寧澤笆豁,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布厌丑,位于F島的核電站,受9級(jí)特大地震影響渔呵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜砍鸠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一扩氢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧爷辱,春花似錦录豺、人聲如沸朦肘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽媒抠。三九已至,卻和暖如春咏花,著一層夾襖步出監(jiān)牢的瞬間趴生,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國打工昏翰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留苍匆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓棚菊,卻偏偏與公主長(zhǎng)得像浸踩,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子统求,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 基本類型和引用類型# ECMAScript包含兩種不同的數(shù)據(jù)類型:基本類型值和引用類型值; 基本類型值指的是保存在...
    草鞋弟閱讀 497評(píng)論 0 0
  • 引用類型有哪些检碗?非引用類型有哪些 引用類型:Object、Array码邻、Date折剃、RegExp、Function冒滩、M...
    _Dot912閱讀 329評(píng)論 0 3
  • 1.引用類型有哪些微驶?非引用類型有哪些? 引用類型:對(duì)象开睡、數(shù)組因苹、函數(shù)、正則表達(dá)式非引用類型:數(shù)值篇恒、字符串扶檐、布爾值、n...
    BAWScipes閱讀 174評(píng)論 0 0
  • 又一年的中秋節(jié)到了,準(zhǔn)備晚會(huì)的腾么,舉辦征文的奈梳,中秋,這個(gè)中國傳統(tǒng)的節(jié)日一年比一年多一些時(shí)尚解虱∪列耄看著周圍的人一個(gè)個(gè)摩拳擦...
    泥巴老向閱讀 330評(píng)論 0 3
  • 這兩天廈門狂風(fēng)大作,這只怪獸有一個(gè)很有意境的名字——天兔殴泰。昨天我一共做了3個(gè)美好的夢(mèng):夢(mèng)見我回到了小時(shí)候于宙,走在熟悉...
    吊燈下的幽靈馬閱讀 312評(píng)論 0 1