<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        分析JavaScript數組操作難點

        來源:懂視網 責編:小采 時間:2020-11-27 22:23:29
        文檔

        分析JavaScript數組操作難點

        分析JavaScript數組操作難點:以下內容是學習JavaScript數組的時候總結的經驗以及需要注意的點。 不要用 for_in 遍歷數組 這是 JavaScript 初學者常見的誤區。for_in 用于遍歷對象中包括原型鏈上的所有可枚舉的(enumerable)的 key,本來不是為遍歷數組而存在。 使用 for_in 遍
        推薦度:
        導讀分析JavaScript數組操作難點:以下內容是學習JavaScript數組的時候總結的經驗以及需要注意的點。 不要用 for_in 遍歷數組 這是 JavaScript 初學者常見的誤區。for_in 用于遍歷對象中包括原型鏈上的所有可枚舉的(enumerable)的 key,本來不是為遍歷數組而存在。 使用 for_in 遍

        以下內容是學習JavaScript數組的時候總結的經驗以及需要注意的點。

        不要用 for_in 遍歷數組

        這是 JavaScript 初學者常見的誤區。for_in 用于遍歷對象中包括原型鏈上的所有可枚舉的(enumerable)的 key,本來不是為遍歷數組而存在。

        使用 for_in 遍歷數組有三點問題:

        1、遍歷順序不固定

        JavaScript 引擎不保證對象的遍歷順序。當把數組作為普通對象遍歷時同樣不保證遍歷出的索引順序。

        2、會遍歷出對象原型鏈上的值。

        如果你改變了數組的原型對象(比如 polyfill)而沒有將其設為 enumerable: false,for_in 會把這些東西遍歷出來。

        3、運行效率低下。

        盡管理論上 JavaScript 使用對象的形式儲存數組,JavaScript 引擎還是會對數組這一非常常用的內置對象特別優化。 https://jsperf.com/for-in-vs-...
        可以看到使用 for_in 遍歷數組要比使用下標遍歷數組慢 50 倍以上

        PS:你可能是想找 for_of

        不要用 JSON.parse(JSON.stringify()) 深拷貝數組

        有人使用 JSON 中深拷貝對象或數組。這雖然在多數情況是個簡單方便的手段,但也可能引發未知 bug,因為:會使某些特定值轉換為 null

        NaN, undefined, Infinity 對于 JSON 中不支持的這些值,會在序列化 JSON 時被轉換為 null,反序列化回來后自然也就是 null

        會丟失值為 undefined 的鍵值對

        JSON 序列化時會忽略值為 undefined 的 key,反序列化回來后自然也就丟失了

        會將 Date 對象轉換為字符串

        JSON 不支持對象類型,對于 JS 中 Date 對象的處理方式為轉換為 ISO8601 格式的字符串。然而反序列化并不會把時間格式的字符串轉化為 Date 對象

        運行效率低下。

        作為原生函數,JSON.stringifyJSON.parse 自身操作 JSON 字符串的速度是很快的。然而為了深拷貝數組把對象序列化成 JSON 再反序列化回來完全沒有必要。

        我花了一些時間寫了一個簡單的深拷貝數組或對象的函數,測試發現運行速度差不多是使用 JSON 中轉的 6 倍左右,順便還支持了 TypedArray、RegExp 的對象的復制

        https://jsperf.com/deep-clone...

        不要用 arr.find 代替 arr.some

        Array.prototype.find 是 ES2015 中新增的數組查找函數,與 Array.prototype.some 有相似之處,但不能替代后者。

        Array.prototype.find 返回第一個符合條件的值,直接拿這個值做 if 判斷是否存在,如果這個符合條件的值恰好是 0 怎么辦?

        arr.find 是找到數組中的值后對其進一步處理,一般用于對象數組的情況;arr.some 才是檢查存在性;兩者不可混用。

        不要用 arr.map 代替 arr.forEach

        也是一個 JavaScript 初學者常常犯的錯誤,他們往往并沒有分清 Array.prototype.mapArray.prototype.forEach 的實際含義。

        map 中文叫做 映射,它通過將某個序列依次執行某個函數導出另一個新的序列。這個函數通常是不含副作用的,更不會修改原始的數組(所謂純函數)。

        forEach 就沒有那么多說法,它就是簡單的把數組中所有項都用某個函數處理一遍。由于 forEach 沒有返回值(返回 undefined),所以它的回調函數通常是包含副作用的,否則這個 forEach 寫了毫無意義。

        確實 mapforEach 更加強大,但是 map 會創建一個新的數組,占用內存。如果你不用 map 的返回值,那你就應當使用 forEach

        補:心得補充

        ES6 以前,遍歷數組主要就是兩種方法:手寫循環用下標迭代,使用 Array.prototype.forEach。前者萬能,效率最高,可就是寫起來比較繁瑣——它不能直接獲取到數組中的值。

        筆者個人是喜歡后者的:可以直接獲取到迭代的下標和值,而且函數式風格(注意 FP 注重的是不可變數據結構,forEach 天生為副作用存在,所以只有 FP 的形而沒有神)寫起來爽快無比。但是!不知各位同學注意過沒有:forEach 一旦開始就停不下來了。。

        forEach 接受一個回調函數,你可以提前 return,相當于手寫循環中的 continue。但是你不能 break——因為回調函數中沒有循環讓你去 break

        [1, 2, 3, 4, 5].forEach(x => {
         console.log(x);
         if (x === 3) {
         break; // SyntaxError: Illegal break statement
         }
        });

        解決方案還是有的。其他函數式編程語言例如 scala 就遇到了類似問題,它提供了一個函數
        break,作用是拋出一個異常。

        我們可以仿照這樣的做法,來實現 arr.forEachbreak

        try {
         [1, 2, 3, 4, 5].forEach(x => {
         console.log(x);
         if (x === 3) {
         throw 'break';
         }
         });
        } catch (e) {
         if (e !== 'break') throw e; // 不要勿吞異常。。
        }

        還有其他方法,比如用 Array.prototype.some 代替 Array.prototype.forEach

        考慮 Array.prototype.some 的特性,當 some 找到一個符合條件的值(回調函數返回 true)時會立即終止循環,利用這樣的特性可以模擬 break

        [1, 2, 3, 4, 5].some(x => {
         console.log(x);
         if (x === 3) {
         return true; // break
         }
         // return undefined; 相當于 false
        });

        some 的返回值被忽略掉了,它已經脫離了判斷數組中是否有元素符合給出的條件這一原始的含義。

        在 ES6 前,筆者主要使用該法(其實因為 Babel 代碼膨脹的緣故,現在也偶爾使用),ES6 不一樣了,我們有了 for...of。for...of 是真正的循環,可以 break

        for (const x of [1, 2, 3, 4, 5]) {
         console.log(x);
         if (x === 3) {
         break;
         }
        }

        但是有個問題,for...of 似乎拿不到循環的下標。其實 JavaScript 語言制定者想到了這個問題,可以如下解決:

        for (const [index, value] of [1, 2, 3, 4, 5].entries()) {
         console.log(`arr[${index}] = ${value}`);
        }
        

        Array.prototype.entries

        for...offorEach 的性能測試:https://jsperf.com/array-fore... Chrome 中 for...of 要快一些哦😯

        如果有更多建議歡迎留言指出

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        分析JavaScript數組操作難點

        分析JavaScript數組操作難點:以下內容是學習JavaScript數組的時候總結的經驗以及需要注意的點。 不要用 for_in 遍歷數組 這是 JavaScript 初學者常見的誤區。for_in 用于遍歷對象中包括原型鏈上的所有可枚舉的(enumerable)的 key,本來不是為遍歷數組而存在。 使用 for_in 遍
        推薦度:
        標簽: 操作 js javascript
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 99爱在线精品免费观看| 国产精彩免费视频| 97国产免费全部免费观看| 国产亚洲美女精品久久久久狼| 亚洲色无码一区二区三区| 亚洲av无码成h人动漫无遮挡| 亚洲人成在线播放网站岛国| 亚洲免费黄色网址| 美女视频黄频a免费观看| 免费久久人人爽人人爽av| 三年片在线观看免费观看高清电影 | 日本XXX黄区免费看| 亚洲国产午夜中文字幕精品黄网站| 亚洲va在线va天堂va888www| 亚洲aⅴ无码专区在线观看 | 国产亚洲精品国看不卡| 亚洲一级视频在线观看| 久久毛片免费看一区二区三区| 真人做A免费观看| 亚洲七久久之综合七久久| www免费黄色网| 麻豆国产VA免费精品高清在线| 亚洲欧洲精品成人久久曰影片| 久久久精品国产亚洲成人满18免费网站| 亚洲人成无码网站| 日本在线看片免费人成视频1000| 啊灬啊灬别停啊灬用力啊免费看| 亚洲免费观看在线视频| 欧洲精品免费一区二区三区| h视频免费高清在线观看| 亚洲男人天堂2017| 好爽…又高潮了免费毛片| 亚洲欧洲日本国产| 国产白丝无码免费视频| 亚洲免费视频一区二区三区| 国产成人精品无码免费看| 亚洲精品无码高潮喷水A片软| 亚洲性猛交XXXX| 无人在线观看免费高清视频| 特级aa**毛片免费观看| 77777_亚洲午夜久久多人|