<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 20:10:08
        文檔

        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 引擎不保證對象的遍歷順序。當把數組作為普通對象遍歷時同樣不保證遍歷出的索引順序。

        1. 會遍歷出對象原型鏈上的值。

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

        1. 運行效率低下。

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

        PS:你可能是想找 for_of

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

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

        1. 會使某些特定值轉換為 null

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

        1. 會丟失值為 undefined 的鍵值對

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

        1. 會將 Date 對象轉換為字符串

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

        1. 運行效率低下。

        作為原生函數,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

        補:forEach 與 break

        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; // 不要勿吞異常。。
        }

        惡心的一B對不對。還有其他方法,比如用 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 遍歷數組有三點問題
        推薦度:
        標簽: 操作 使用 注意
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 男男gay做爽爽的视频免费| 亚洲精品tv久久久久久久久| 亚洲春色另类小说| 久久久久国产精品免费看| 中文字幕人成人乱码亚洲电影| 亚洲精品乱码久久久久蜜桃| 高清国语自产拍免费视频国产| 亚洲AV无码一区二区三区牛牛| 最近最好的中文字幕2019免费| 亚洲一区二区三区91| 亚洲第一成年免费网站| 亚洲五月综合缴情婷婷| 女人与禽交视频免费看| 亚洲AV无码专区国产乱码不卡| 国产男女猛烈无遮挡免费视频 | 国产成人免费ā片在线观看| 亚洲AV噜噜一区二区三区| 国产成人免费A在线视频| 美女裸体无遮挡免费视频网站| 少妇亚洲免费精品| 国产特黄特色的大片观看免费视频 | 久久久久国色AV免费看图片| 最新国产精品亚洲| 免费一级做a爰片久久毛片潮喷| 曰批免费视频播放在线看片二| 亚洲午夜爱爱香蕉片| 午夜精品射精入后重之免费观看| 中文字幕亚洲综合久久2| 无人影院手机版在线观看免费| 午夜亚洲国产理论片二级港台二级| 免费A级毛片无码A∨男男| 一区二区三区在线免费观看视频 | 在线观看午夜亚洲一区| 久久一区二区三区免费播放| 亚洲a级片在线观看| 国产男女性潮高清免费网站| 国产在线观a免费观看| 亚洲一区二区三区高清| 日本19禁啪啪无遮挡免费动图| jizz免费在线观看| 亚洲中文久久精品无码1|