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

首頁 > 編程 > JavaScript > 正文

Javascript中Array.prototype.map()詳解

2019-11-20 14:00:16
字體:
來源:轉載
供稿:網友

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

復制代碼 代碼如下:

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??聪旅娴妮敵鼋Y果:

復制代碼 代碼如下:

//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
一区二区三区www| 91午夜理伦私人影院| 久久久久国色av免费观看性色| 日韩欧亚中文在线| 国产精品欧美一区二区| 日韩中文第一页| 69av成年福利视频| 亚洲一区二区少妇| 国产97在线亚洲| 国产精品电影网| 国产欧美日韩中文字幕| 1769国产精品| 国产精品免费视频xxxx| 亚洲男人av在线| 亚洲精品国产精品国自产在线| 国产91精品青草社区| 精品人伦一区二区三区蜜桃免费| 免费91麻豆精品国产自产在线观看| 日韩精品久久久久久久玫瑰园| 亚洲精品第一页| 国产精品久久久久7777婷婷| 亚洲第一网站免费视频| 精品国产区一区二区三区在线观看| 综合136福利视频在线| 少妇av一区二区三区| 成人黄色av免费在线观看| 精品亚洲一区二区三区在线播放| 国产精品一区二区三区在线播放| 国产欧美日韩91| 亚洲免费人成在线视频观看| 精品在线欧美视频| 美乳少妇欧美精品| 久久好看免费视频| 久久深夜福利免费观看| 亚洲区在线播放| 国产不卡一区二区在线播放| 欧洲亚洲女同hd| 精品亚洲一区二区三区在线播放| 欧美在线亚洲在线| 久久精品99久久香蕉国产色戒| 中文字幕精品—区二区| 亚洲最新中文字幕| 精品丝袜一区二区三区| 国产精品精品视频一区二区三区| 欧美极品xxxx| 一区二区三区 在线观看视| 亚洲欧洲xxxx| 欧美电影免费观看高清完整| 日韩成人免费视频| 777国产偷窥盗摄精品视频| 亚洲国产精品免费| 国产精品日韩欧美大师| 日韩美女视频免费在线观看| 亚洲欧美日韩久久久久久| 国产在线精品播放| 国产在线视频欧美| 欧美成人激情图片网| 色噜噜国产精品视频一区二区| 中文字幕在线看视频国产欧美| 欧美日韩国产成人高清视频| 最新日韩中文字幕| 欧美裸体xxxx| 欧美性极品xxxx做受| 大量国产精品视频| 国产精品久久色| 国产精品永久免费在线| 日韩视频永久免费观看| 97国产一区二区精品久久呦| 国产亚洲精品高潮| 欧美激情乱人伦一区| 国产精品爱啪在线线免费观看| 欧美成人性生活| 亚洲第一网中文字幕| 欧美日韩国产丝袜美女| 日本高清+成人网在线观看| 国产精品丝袜白浆摸在线| 日韩电影免费在线观看| 国内精品久久久久影院 日本资源| 欧美日韩国产在线播放| 国产成人精品日本亚洲| 国产欧美日韩最新| 日韩免费在线播放| 韩国三级日本三级少妇99| 久久免费视频网| 自拍偷拍免费精品| 欧美性生交xxxxx久久久| 欧美日韩第一页| 亚洲无av在线中文字幕| 日韩电视剧免费观看网站| 亚洲欧美日韩国产中文| 欧美精品一本久久男人的天堂| 欧美野外wwwxxx| 伊人亚洲福利一区二区三区| 日韩av大片在线| 色综合久久88色综合天天看泰| 538国产精品视频一区二区| 日韩高清电影好看的电视剧电影| 欧美丰满少妇xxxx| 91大神在线播放精品| 久久久久久久久久久亚洲| 国模吧一区二区三区| 亚洲欧美国产va在线影院| 亚洲日本中文字幕免费在线不卡| 2018日韩中文字幕| 久久中文字幕视频| 亚洲第一免费播放区| 亚洲精品女av网站| 在线观看亚洲视频| 久久资源免费视频| 亚洲资源在线看| 国产精品福利在线观看网址| 久久99久久99精品免观看粉嫩| 国产精品久久久久久久久久免费| 国产91精品高潮白浆喷水| 亚洲国产精品一区二区久| 欧美黑人又粗大| 97色伦亚洲国产| 久久亚洲欧美日韩精品专区| 亚洲综合自拍一区| 亚洲欧美日韩成人| 国产精品自产拍在线观看| 久久久精品美女| 91人成网站www| 欧美日韩在线视频一区二区| 欧美日韩午夜视频在线观看| 亚洲精品中文字幕av| 日韩欧美aⅴ综合网站发布| 欧美自拍大量在线观看| 亚洲另类图片色| 日韩大陆毛片av| 最近2019中文免费高清视频观看www99| 亚洲一区二区三区777| 亚洲人成在线播放| 亚洲成人av中文字幕| 欧美成人精品影院| 国产欧美 在线欧美| 中文字幕自拍vr一区二区三区| 亚洲精品白浆高清久久久久久| 亚洲tv在线观看| 亚洲视频在线观看视频| 51精品国产黑色丝袜高跟鞋| 欧美久久精品午夜青青大伊人| 亚洲精品免费一区二区三区| 国产欧美日韩视频| 国产日韩欧美影视| 久久久免费高清电视剧观看| 青青草原一区二区| 亚洲免费人成在线视频观看| 日韩欧美在线播放| 国产精品男人的天堂| 国产精品久久久久久av福利软件| 久久综合电影一区| 欧美激情一级精品国产| 国模吧一区二区三区| 97视频免费看| 中文字幕免费国产精品| 日韩中文字幕在线视频播放| 国产精品免费一区二区三区都可以| 亚洲国产精品va在线看黑人| 精品动漫一区二区三区| 日韩av影院在线观看| 欧美亚洲成人xxx| 日韩中文字幕视频在线观看| 欧美激情中文网|