亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

Javascript中Array.prototype.map()詳解

2024-05-06 16:10:01
字體:
來源:轉載
供稿:網友
map 方法會給原數組中的每個元素都按順序調用一次 callback 函數。callback 每次執行后的返回值組合起來形成一個新數組。 callback 函數只會在有值的索引上被調用;那些從來沒被賦過值或者使用 delete 刪除的索引則不會被調用。
 
 

在我們日常開發中,操作和轉換數組是一件很常見的操作,下面我們來看一個實例:

 

復制代碼代碼如下:

var desColors = [],
    srcColors = [
        {r: 255, g: 255, b: 255 }, // White
        {r: 128, g: 128, b: 128 }, // Gray
        {r: 0,   g: 0,   b: 0   }  // Black
    ];

 

for (var i = 0, ilen = srcColors.length; i < ilen; i++) {
    var color = srcColors[i],
        format = function(color) {
            return Math.round(color / 2);
        };

    desColors.push( {
        r: format(color.r),
        g: format(color.g),
        b: format(color.b)
    });
}

// Outputs:
// [
//    {r: 128, g: 128, b: 128 },
//    {r: 64,  g: 64,  b: 64  },
//    {r: 0,   g: 0,   b: 0   }
// ];
console.log(desColors);


 

從上例可以看出,所有的操作重復率都比較高,如何來優化呢,幸運的是Ecmascript 5給我們提供了一個map方法,我們可以利用它來優化上例:

 

復制代碼代碼如下:

var srcColors = [
        {r: 255, g: 255, b: 255 }, // White
        {r: 128, g: 128, b: 128 }, // Gray
        {r: 0,   g: 0,   b: 0   }  // Black
    ],
    desColors = srcColors.map(function(val) {
        var format = function(color) {
            return Math.round(color/2);
        };
        return {
            r: format(val.r),
            g: format(val.g),
            b: format(val.b)
        }
    });
// Outputs:
// [
//    {r: 128, g: 128, b: 128 },
//    {r: 64,  g: 64,  b: 64  },
//    {r: 0,   g: 0,   b: 0   }
// ];
console.log(desColors);

 

從上例看以看出,我們使用map替換掉了for循環部分,從而只需要關心每個元素自身的實現邏輯。關于map方法詳情請戳這里。

1.map基本定義:
array.map(callback[, thisArg]);

map 方法會給原數組中的每個元素都按順序調用一次 callback 函數。callback 每次執行后的返回值組合起來形成一個新數組。 callback 函數只會在有值的索引上被調用;那些從來沒被賦過值或者使用 delete 刪除的索引則不會被調用。

callback 函數會被自動傳入三個參數:數組元素,元素索引,原數組本身。

如果 thisArg 參數有值,則每次 callback 函數被調用的時候,this 都會指向 thisArg 參數上的這個對象。如果省略了 thisArg 參數,或者賦值為 null 或 undefined,則 this 指向全局對象 。

map 不修改調用它的原數組本身(當然可以在 callback 執行時改變原數組)。

當一個數組運行 map 方法時,數組的長度在調用第一次 callback 方法之前就已經確定。在 map 方法整個運行過程中,不管 callback 函數中的操作給原數組是添加還是刪除了元素。map 方法都不會知道,如果數組元素增加,則新增加的元素不會被 map 遍歷到,如果數組元素減少,則 map 方法還會認為原數組的長度沒變,從而導致數組訪問越界。如果數組中的元素被改變或刪除,則他們被傳入 callback 的值是 map 方法遍歷到他們那一刻時的值。

2.map實例:

 

復制代碼代碼如下:

//實例一:字符串上調用map方法
var result = Array.prototype.map.call("Hello world", function(x, index, arr) {
    //String {0: "H", 1: "e", 2: "l", 3: "l", 4: "o", 5: " ", 6: "w", 7: "o", 8: "r", 9: "l", 10: "d", length: 11}
    console.log(arr);
    return x.charCodeAt(0);
});
//Outputs: [72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100] 
console.log(result);

 

上例演示了在一個String上使用map方法獲取字符串中每個字符所對應的 ASCII 碼組成的數組。請注意看打印的console.log(arr)打印的結果。

 

復制代碼代碼如下:

//實例二:下面的操作結果是什么?
var result = ["1", "2", "3"].map(parseInt);
//Outputs: [1, NaN, NaN] 
console.log(result);

 

也許你會有疑問,為什么不是[1,2,3]呢?我們知道parseInt方法可接收兩個參數,第一個參數為需要轉換的值,第二個參數為進制數,不了解的可以戳這里。當我們使用map方法的時候,callback函數接收三個參數,而parseInt最多只能接收兩個參數,以至于第三個參數被直接舍棄,與此同時,parseInt把傳過來的索引值當成進制數來使用.從而返回了NaN。看下面的輸出結果:

 

復制代碼代碼如下:

//Ouputs: 1
console.log(parseInt("1", 0));
//Ouputs: 1
console.log(parseInt("1", undefined));
//Ouputs: NaN
console.log(parseInt("2", 1));
//Ouputs: NaN
console.log(parseInt("3", 2));

 

后面兩個很容易理解,但是前兩個為什么返回1呢?為了解釋這個問題,我們看看官方的描述:
If radix is undefined or 0 (or absent), JavaScript assumes the following:
a) If the input string begins with “0x” or “0X”, radix is 16 (hexadecimal) and the remainder of the string is parsed.
b) If the input string begins with “0″, radix is eight (octal) or 10 (decimal). Exactly which radix is chosen is implementation-dependent. ECMAScript 5 specifies that 10 (decimal) is used, but not all browsers support this yet. For this reason always specify a radix when using parseInt.
c) If the input string begins with any other value, the radix is 10 (decimal).
在第三點中當string為其他值時,進制默認為10。

那么我們如何修改才能使上例正常輸出呢?看下例:

 

復制代碼代碼如下:

var result = ["1", "2", "3"].map(function(val) {
    return parseInt(val, 10);
});
//Outputs: [1, 2, 3] 
console.log(result);

 

3.map方法的兼容性:
map方法在IE8及以下瀏覽器不支持,要想兼容老版本的瀏覽器,可以:

a) Don't use map.b) Use something like es5-shim to make older IE's support map.c) Use the _.map method in Underscore or Lodash for an equivalent utility function.

以上就是對map方法的理解,希望對初學者有所幫助,文中不妥之處,還望斧正!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情免费在线| 中文字幕av一区二区| 亚洲第一精品夜夜躁人人爽| 午夜精品理论片| 国产欧美va欧美va香蕉在| 日韩欧美第一页| 日韩精品视频观看| 成人性教育视频在线观看| 精品福利在线视频| 日本国产欧美一区二区三区| 欧美性色视频在线| 亚洲综合中文字幕在线| 国产精品一区二区三区久久久| 97免费视频在线播放| 最近2019中文免费高清视频观看www99| 午夜精品一区二区三区在线播放| 国产精品福利在线| 亚洲嫩模很污视频| 久久久亚洲福利精品午夜| 久久亚洲精品一区二区| 亚洲精品一区久久久久久| 国产精品一区久久久| 亚洲最新中文字幕| 亚洲精品国产精品自产a区红杏吧| 超碰精品一区二区三区乱码| 精品国偷自产在线视频99| 亲爱的老师9免费观看全集电视剧| 亚洲国产欧美一区二区三区久久| 日韩精品免费一线在线观看| 在线观看精品国产视频| 中文字幕免费精品一区| 国产美女搞久久| 亚洲视频专区在线| 国产91成人在在线播放| 精品激情国产视频| 亚洲午夜未删减在线观看| 日韩电影免费观看在线| 日韩av日韩在线观看| 亚洲色无码播放| 国产精品日日摸夜夜添夜夜av| 久久精品国产69国产精品亚洲| 97视频在线播放| 国产精品国产亚洲伊人久久| 性色av一区二区三区| 国产精品美女无圣光视频| 亚洲视频在线观看视频| 亚洲图片欧美日产| 日韩国产精品一区| 一区二区三区国产视频| 欧美日韩一区二区三区在线免费观看| 国产欧美精品一区二区三区-老狼| 亚洲的天堂在线中文字幕| www.亚洲男人天堂| 色视频www在线播放国产成人| 精品久久久久久久大神国产| 国内精品美女av在线播放| 亚洲自拍欧美色图| 亚洲第一页在线| 日韩电影在线观看免费| 欧美国产欧美亚洲国产日韩mv天天看完整| www.日韩欧美| 性夜试看影院91社区| 欧美成在线观看| 在线观看久久久久久| 一区二区在线视频| 51视频国产精品一区二区| 91国语精品自产拍在线观看性色| 色哟哟亚洲精品一区二区| 国产剧情久久久久久| 91久久精品美女高潮| 欧美日韩国产第一页| 国产精品白嫩美女在线观看| 中文字幕免费国产精品| 国语自产精品视频在线看一大j8| 91色在线观看| 亚洲国产91精品在线观看| 另类美女黄大片| 亚洲午夜激情免费视频| 91精品国产自产在线| 91av在线播放视频| 97视频免费在线观看| 97**国产露脸精品国产| 色老头一区二区三区在线观看| 欧美床上激情在线观看| 在线日韩精品视频| 亚洲成人在线视频播放| 丝袜情趣国产精品| 国产精品扒开腿爽爽爽视频| 欧美一级片久久久久久久| 5252色成人免费视频| 国产高清视频一区三区| 欧美日韩亚洲视频| 欧美最近摘花xxxx摘花| 激情懂色av一区av二区av| 一区二区在线视频| 日韩激情片免费| 国产精品一区二区三区在线播放| 亚洲最大成人在线| 日韩av免费在线观看| 久久久久久亚洲精品中文字幕| 欧美日韩黄色大片| 最近2019年中文视频免费在线观看| 国产一区二区三区免费视频| 97成人精品区在线播放| 亚洲图片欧美午夜| 91久久久久久久久久久久久| 久久久免费精品| 97在线看免费观看视频在线观看| 亚洲免费视频一区二区| 亚洲第一免费播放区| 欧美性生交大片免费| 亚洲影院在线看| 国产精品露脸自拍| 国产亚洲精品久久久| 2020久久国产精品| 亚洲肉体裸体xxxx137| 欧美在线不卡区| 久久99国产精品自在自在app| 欧美猛交免费看| 久久久久久国产精品久久| 久久久精品亚洲| 欧美日韩亚洲激情| 日韩电影免费在线观看| 久久99久国产精品黄毛片入口| 精品偷拍一区二区三区在线看| 国产精品电影观看| 久久五月天色综合| 日韩av手机在线观看| 国产精品久久av| 日韩网站免费观看| 这里只有精品在线播放| 国产精品自产拍在线观看中文| 国内精品在线一区| 国产成人免费91av在线| 精品在线欧美视频| 国产精品欧美日韩久久| 日韩中文在线观看| 欧美风情在线观看| 久久久久久国产精品三级玉女聊斋| 亚洲精品成人免费| 国产成人精品一区二区三区| 亚洲精品久久久久| 精品视频久久久| 欧美大人香蕉在线| 97成人精品视频在线观看| 久久久久久尹人网香蕉| 亚洲国产高潮在线观看| 高跟丝袜一区二区三区| 欧美色道久久88综合亚洲精品| 国产精品成熟老女人| 久久伊人免费视频| 欧美一区第一页| 国产视频综合在线| 国产99久久精品一区二区永久免费| 国产主播在线一区| 欧美日韩亚洲激情| 九九热这里只有精品免费看| 国产欧美一区二区三区久久| 青草热久免费精品视频| 91香蕉亚洲精品| 日韩精品在线视频美女| 亚洲色图50p| 91超碰中文字幕久久精品| 欧美日韩亚洲国产一区|