<thead id="dfbrb"><meter id="dfbrb"></meter></thead>

      <video id="dfbrb"></video>

      <ruby id="dfbrb"></ruby><address id="dfbrb"></address>
      <dl id="dfbrb"><progress id="dfbrb"><form id="dfbrb"></form></progress></dl>

        <video id="dfbrb"></video>
          <noframes id="dfbrb">

            <ruby id="dfbrb"></ruby>

                <p id="dfbrb"></p>

                杭州web前端培訓
                達內杭州文教中心

                13732203138

                Web前端工程師要了解的JavaScript相關知識

                • 時間:2020-09-15 17:29
                • 發布:轉載
                • 來源:網絡

                本文為大家分享的是Web前端工程師要了解的JavaScript相關知識,正在從事web前工作的小伙伴們來和小編一起看一看吧,希望本篇文章能夠對大家有所幫助。

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

                JavaScript的變量中包含兩種類型的值:基本類型值 和 引用類型值,在內存中的表現形式在于:前者是存儲在棧中的一些簡單的數據段,后者則是保存在堆內存中的一個對象。

                ?基本類型值

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

                基本類型是按值訪問的,從一個變量復制基本類型的值到另一個變量后,這兩個變量的值是完全獨立的,即使一個變量改變了也不會影響到第二個變量。

                let str1 = '你好';

                let str2 = str1;

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

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

                ?引用類型值

                引用類型值是引用類型的實例,它是保存在堆內存中的一個對象,引用類型是一種數據結構,最常用的是Object,Array,Function類型,此外還有Date,RegExp,Error等。

                在ES6中提供了Set,Map2種新的數據結構。

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

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

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

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

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

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

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

                當變量復制引用類型值的時候,同樣和基本類型值一樣會將變量的值復制到新變量上,不同的是對于變量的值,它是一個指針,指向存儲在堆內存中的對象。

                因為,在JS中,堆內存中的對象無法直接訪問,必須要訪問這個對象在堆內存中的地址,然后再按照這個地址去獲得這個對象中的值。

                (三)淺拷貝

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

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

                Object.assign

                ES6中拷貝對象的方法,接受的第一個參數是拷貝的目標,剩下的參數是拷貝的源對象;

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

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

                let copyP = {};

                Object.assign(copyP, p);

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

                Object.assign是一個淺拷貝,它只是在根屬性(對象的第一層級)創建了一個新的對象,但是如果屬性的值是對象的話,只會拷貝一份相同的內存地址。

                擴展運算符

                利用擴展運算符可以在構造字面量對象時,進行克隆或者屬性拷貝。語法如下:

                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);

                擴展運算符和Object.assign()存在同樣的問題,對于值是對象的屬性無法完全拷貝成兩個不同對象;

                但是如果屬性都是基本類型的值的話,使用擴展運算符更加簡潔。

                (四)深拷貝

                淺拷貝只在根屬性上在堆內存中創建了一個新的的對象,復制了基本類型的值,但是復雜數據類型也就是對象則是拷貝相同的地址。

                而深拷貝則是將一個對象從內存中完整的拷貝一份出來,從堆內存中開辟一個新的區域存放新對象,且修改新對象不會影響原對象。

                JSON.stringify

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

                舉個例子:

                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實現深拷貝有幾點要注意:

                1)拷貝的對象的值中如果有函數,undefined,symbol,經過JSON.stringify()序列化后的JSON字符串中這個鍵值對會消失;

                2) 無法拷貝不可枚舉的屬性,無法拷貝對象的原型鏈

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

                4)拷貝RegExp引用類型會變成空對象

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

                遞歸實現深拷貝

                具體實現如下:

                /** * 輔助函數, 判定是否是對象 * @param obj * @returns {boolean} */

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

                /** * 深拷貝fromObj面的所有屬性/值, 到toObj對象里面 * @param fromObj 拷貝對象 * @param toObj 目標對象 */

                function deepCopyObj2NewObj(fromObj, toObj) {

                for (let key in fromObj) {

                if(fromObj.hasOwnProperty(key)){

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

                if (!isObj(fromValue)) {

                toObj[key] = fromValue;

                } else { // 如果是引用類型,那么就再調用一次這個方法, // 去內部拷貝這個對象的所有屬性 // fromValue是什么類型, 創建一個該類型的空對象

                let tmpObj = new fromValue.constructor;

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

                deepCopyObj2NewObj(fromValue, tmpObj);

                toObj[key] = tmpObj;

                }

                }

                }}

                (五)總結

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

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

                以上就是小編今天為大家分享的關于Web前端工程師要了解的JavaScript相關知識的文章,希望本篇文章能夠對正在從事web前端工作的小伙伴們有所幫助。

                預約申請免費試聽課

                怕錢不夠?就業掙錢后再付學費!    怕學不會?從入學起,達內定制課程!     擔心就業?達內多家實踐企業供你挑選!

                上一篇:19個JavaScript編碼小技巧,干貨速收
                下一篇:開源Web應用的安全測試工具匯總

                Web前端工程師要了解的JavaScript相關知識

                WEB前端開發中標簽的用法和定義匯總

                web開發之CSS后代選擇器解析

                web開發之CSS派生選擇器的詳解

                • 關注微信公眾號

                  回復關鍵字:視頻資料

                  免費領取 達內課程視頻學習資料

                • 視頻學習QQ群

                  添加QQ群:1143617948

                  免費領取達內課程視頻學習資料

                Copyright ? 2018 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

                選擇城市和中心
                江西省

                貴州省

                廣西省

                海南省

                免费精品国产自在自线,欧美老人性杂视频,国产三级漂亮护士和医生,香蕉精品国产高清自在自线