国产另类ts人妖一区二区_欧美肥老太做爰视频_快穿高h肉_国产欧美综合在线

當(dāng)前位置: 首頁(yè) / 技術(shù)干貨 / 正文
好程序員web前端培訓(xùn)分享JavaScript相關(guān)知識(shí)

2020-07-22

web前端培訓(xùn)

  好程序員web前端培訓(xùn)分享JavaScript相關(guān)知識(shí),今天跟大家分享的是關(guān)于JavaScript相關(guān)知識(shí)。正在從事web前端工作的小伙伴們來(lái)一起看看吧,希望能夠?qū)Υ蠹矣兴鶐椭?/p>

好程序員

  (一)JS中基本類型和引用類型

  JavaScript的變量中包含兩種類型的值:基本類型值和引用類型值,在內(nèi)存中的表現(xiàn)形式在于:前者是存儲(chǔ)在棧中的一些簡(jiǎn)單的數(shù)據(jù)段,后者則是保存在堆內(nèi)存中的一個(gè)對(duì)象。

  •基本類型值

  在JavaScript中基本數(shù)據(jù)類型有String,Number,Undefined,Null,Boolean,在ES6中,又定義了一種新的基本數(shù)據(jù)類型Symbol,所以一共有6種。

  基本類型是按值訪問(wèn)的,從一個(gè)變量復(fù)制基本類型的值到另一個(gè)變量后,這兩個(gè)變量的值是完全獨(dú)立的,即使一個(gè)變量改變了也不會(huì)影響到第二個(gè)變量。

  let str1 = '你好';

  let str2 = str1;

  str2 = 'hello word'console.log(str2);//'hello word'

  console.log(str1); //'你好'

  •引用類型值

  引用類型值是引用類型的實(shí)例,它是保存在堆內(nèi)存中的一個(gè)對(duì)象,引用類型是一種數(shù)據(jù)結(jié)構(gòu),最常用的是Object,Array,Function類型,此外還有Date,RegExp,Error等。

  在ES6中提供了Set,Map2種新的數(shù)據(jù)結(jié)構(gòu)。

  (二)JS中如何復(fù)制引用類型的

  •基本類型和引用類型賦值的差異化

  舉個(gè)例子:在下面代碼中,只修改了obj1中的name屬性,卻同時(shí)改變了ob1和obj2中的name屬性。

  let obj1 = {'name': '小明'};

  let obj2 = obj1;obj2.name = '小蘭';

  console.log(obj1); // {'name': '小明'}

  console.log(obj2); // {'name': '小明'}

  當(dāng)變量復(fù)制引用類型值的時(shí)候,同樣和基本類型值一樣會(huì)將變量的值復(fù)制到新變量上,不同的是對(duì)于變量的值,它是一個(gè)指針,指向存儲(chǔ)在堆內(nèi)存中的對(duì)象。

  因?yàn)椋贘S中,堆內(nèi)存中的對(duì)象無(wú)法直接訪問(wèn),必須要訪問(wèn)這個(gè)對(duì)象在堆內(nèi)存中的地址,然后再按照這個(gè)地址去獲得這個(gè)對(duì)象中的值。

  (三)淺拷貝

  在JS中,如果屬性是基本類型,拷貝的就是基本類型的值;如果屬性是引用類型,拷貝的就是內(nèi)存地址;所以如果其中一個(gè)對(duì)象改變了這個(gè)地址,就會(huì)影響到另一個(gè)對(duì)象。

  下面是JavaScript提供的淺拷貝方法:

  Object.assign

  ES6中拷貝對(duì)象的方法,接受的diyi個(gè)參數(shù)是拷貝的目標(biāo),剩下的參數(shù)是拷貝的源對(duì)象;

  語(yǔ)法:Object.assign(target, ...sources)

  let p = { 'name': 'hello word',};

  let copyP = {};

  Object.assign(copyP, p);

  console.log(copyP);console.log(p);

  Object.assign是一個(gè)淺拷貝,它只是在根屬性(對(duì)象的diyi層級(jí))創(chuàng)建了一個(gè)新的對(duì)象,但是如果屬性的值是對(duì)象的話,只會(huì)拷貝一份相同的內(nèi)存地址。

  擴(kuò)展運(yùn)算符

  利用擴(kuò)展運(yùn)算符可以在構(gòu)造字面量對(duì)象時(shí),進(jìn)行克隆或者屬性拷貝。語(yǔ)法如下:

  let cloneObj = { ...obj };

  let obj = {'name': '星期一', 'college': ['星期二','星期三','星期四']}let obj2 = {...obj};

  obj.name='不休息';//{'name': '不休息', 'college': ['星期二','星期三','星期四']}console.log(obj);//{'name': '星期一', 'college': ['星期二','星期三','星期四']}

  console.log(obj2);

  obj.college.push('Go');//{'name': '不休息', 'college': ['星期二','星期三','星期四']}

  console.log(obj); //{'name': '不休息', 'college': ['星期二','星期三','星期四']}

  console.log(obj2);

  擴(kuò)展運(yùn)算符和Object.assign()存在同樣的問(wèn)題,對(duì)于值是對(duì)象的屬性無(wú)法完全拷貝成兩個(gè)不同對(duì)象;

  但是如果屬性都是基本類型的值的話,使用擴(kuò)展運(yùn)算符更加簡(jiǎn)潔。

  (四)深拷貝

  淺拷貝只在根屬性上在堆內(nèi)存中創(chuàng)建了一個(gè)新的的對(duì)象,復(fù)制了基本類型的值,但是復(fù)雜數(shù)據(jù)類型也就是對(duì)象則是拷貝相同的地址。

  而深拷貝則是將一個(gè)對(duì)象從內(nèi)存中完整的拷貝一份出來(lái),從堆內(nèi)存中開辟一個(gè)新的區(qū)域存放新對(duì)象,且修改新對(duì)象不會(huì)影響原對(duì)象。

  JSON.stringify

  JSON.stringify()是目前開發(fā)過(guò)程中最常用的深拷貝方式,原理是把一個(gè)對(duì)象序列化成為一個(gè)JSON字符串,將對(duì)象的內(nèi)容轉(zhuǎn)換成字符串的形式再保存在內(nèi)存中,再用JSON.parse()反序列化將JSON字符串變成一個(gè)新的對(duì)象。

  舉個(gè)例子:

  let obj = { name: '少帥', age: 18, friends: ['阿大', '阿二'], goodF: { name: '水果', age: 19, address: '上海', pets: [{name: '西瓜'}, {name: '蘋果'}]}, bir: new Date()};

  let newObj = JSON.parse(JSON.stringify(obj));

  obj.goodF.pets[0].name = '桔子';

  console.log(newObj);console.log(obj);

  使用JSON.stringify實(shí)現(xiàn)深拷貝有幾點(diǎn)要注意:

  1)拷貝的對(duì)象的值中如果有函數(shù),undefined,symbol,經(jīng)過(guò)JSON.stringify()序列化后的JSON字符串中這個(gè)鍵值對(duì)會(huì)消失;

  2) 無(wú)法拷貝不可枚舉的屬性,無(wú)法拷貝對(duì)象的原型鏈

  3)拷貝Date引用類型會(huì)變成字符串

  4)拷貝RegExp引用類型會(huì)變成空對(duì)象

  5) 對(duì)象中含有NaN、Infinity和-Infinity,則序列化的結(jié)果會(huì)變成null

  遞歸實(shí)現(xiàn)深拷貝

  具體實(shí)現(xiàn)如下:

  /** * 輔助函數(shù), 判定是否是對(duì)象 * @param obj * @returns {boolean} */

  function isObj(obj) { return obj instanceof Object;}

  /** * 深拷貝fromObj面的所有屬性/值, 到toObj對(duì)象里面 * @param fromObj 拷貝對(duì)象 * @param toObj 目標(biāo)對(duì)象 */

  function deepCopyObj2NewObj(fromObj, toObj) {

  for (let key in fromObj) {

  if(fromObj.hasOwnProperty(key)){

  let fromValue = fromObj[key]; // 如果是值類型,那么就直接拷貝賦值

  if (!isObj(fromValue)) {

  toObj[key] = fromValue;

  } else { // 如果是引用類型,那么就再調(diào)用一次這個(gè)方法, // 去內(nèi)部拷貝這個(gè)對(duì)象的所有屬性 // fromValue是什么類型, 創(chuàng)建一個(gè)該類型的空對(duì)象

  let tmpObj = new fromValue.constructor;

  // console.log(tmpObj); // debugger;

  deepCopyObj2NewObj(fromValue, tmpObj);

  toObj[key] = tmpObj;

  }

  }

  }}

  (五)總結(jié)

  1)在日常開發(fā)中一般并不需要拷貝很多特殊的引用類型,深拷貝對(duì)象使用JSON.stringify是最直接和簡(jiǎn)單的方法。

  2)實(shí)現(xiàn)一個(gè)完整的深拷貝是非常復(fù)雜的,需要考慮到很多邊界情況。對(duì)于特殊的引用類型有拷貝需求的話,建議借助第三方完整的庫(kù),例如lodash.js。

  免責(zé)聲明:本文圖片及文字信息均由小編轉(zhuǎn)載自網(wǎng)絡(luò),旨在分享提供閱讀,版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系我們進(jìn)行刪除。

好程序員公眾號(hào)

  • · 剖析行業(yè)發(fā)展趨勢(shì)
  • · 匯聚企業(yè)項(xiàng)目源碼

好程序員開班動(dòng)態(tài)

More+
  • HTML5大前端 <高端班>

    開班時(shí)間:2021-04-12(深圳)

    開班盛況

    開班時(shí)間:2021-05-17(北京)

    開班盛況
  • 大數(shù)據(jù)+人工智能 <高端班>

    開班時(shí)間:2021-03-22(杭州)

    開班盛況

    開班時(shí)間:2021-04-26(北京)

    開班盛況
  • JavaEE分布式開發(fā) <高端班>

    開班時(shí)間:2021-05-10(北京)

    開班盛況

    開班時(shí)間:2021-02-22(北京)

    開班盛況
  • Python人工智能+數(shù)據(jù)分析 <高端班>

    開班時(shí)間:2021-07-12(北京)

    預(yù)約報(bào)名

    開班時(shí)間:2020-09-21(上海)

    開班盛況
  • 云計(jì)算開發(fā) <高端班>

    開班時(shí)間:2021-07-12(北京)

    預(yù)約報(bào)名

    開班時(shí)間:2019-07-22(北京)

    開班盛況
IT培訓(xùn)IT培訓(xùn)
在線咨詢
IT培訓(xùn)IT培訓(xùn)
試聽
IT培訓(xùn)IT培訓(xùn)
入學(xué)教程
IT培訓(xùn)IT培訓(xùn)
立即報(bào)名
IT培訓(xùn)

Copyright 2011-2023 北京千鋒互聯(lián)科技有限公司 .All Right 京ICP備12003911號(hào)-5 京公網(wǎng)安備 11010802035720號(hào)