7.數(shù)組的擴展

回到目錄

擴展運算符

擴展運算符(spread)是三個點(...)

console.log(...[1, 2, 3]); // 1 2 3

function add (x,y,z) {
    return x+y+z
}
add([...[1,2,3]) // 6

作用

  1. 復(fù)制數(shù)組
const a1 = [1, 2];
const a2 = a1;

a2[0] = 2;
a1; // [2, 2]

上面代碼中,a2 并不是 a1 的克隆斜做,而是指向同一份數(shù)據(jù)的另一個指針趁尼。修改 a2,會直接導(dǎo)致 a1 的變化催蝗。

const a1 = [1, 2];
// 寫法一
const a2 = [...a1];
// 寫法二
const [...a2] = a1;
  1. 合并數(shù)組
let arr1 = [1, 2];
let arr2 = [2, 3];
let arr3 = [...arr1, ...arr2]; // [1 ,2 ,2, 3]

本質(zhì)上(...) 會調(diào)用數(shù)組的 Iterator ,所以只要存在 Iterator 的數(shù)據(jù)都可以被擴展

let arr1 = [...5]; // Uncaught TypeError: number 5 is not iterable (cannot read property Symbol(Symbol.iterator))

數(shù)字 5 不能被擴展的原因是 cannot read property Symbol(Symbol.iterator),所以如果我們給他定義了這個方法育特,那么就可以被擴展了

Number.prototype[Symbol.iterator] = function() {
  let i = 0;
  let num = this.valueOf();
  return {
    next: () => {
      return i < num ? { value: 2 * i++ } : { done: true };
    }
  };
};

console.log([...6]); // [0, 2, 4, 6, 8, 10]

當(dāng)然這種方式在平時工作中慎用丙号,不然會讓人覺得莫名其妙

所有可以 Iterator 的數(shù)據(jù)都可以被擴展成數(shù)組

Array api

type 作用
Array.from(Array, cb, this) 將類數(shù)組和可遍歷的對象轉(zhuǎn)為真正的數(shù)組
Array.of() 將一組值,轉(zhuǎn)換為數(shù)組缰冤。
// 還是用上面的例子
Number.prototype[Symbol.iterator] = function() {
  let i = 0;
  let num = this.valueOf();
  return {
    next: () => {
      return i < num ? { value: 2 * i++ } : { done: true };
    }
  };
};
[...6]; // [0, 2, 4, 6, 8, 10]
Array.from(6); // [0, 2, 4, 6, 8, 10]
for (let v of 6) {
  console.log(6);
}
// 0 2 4 6 8 10

Array.from(6, v => v + 10); // [10, 12, 14, 16, 18, 20]
Array.from(
  6,
  function(v) {
    return this.valueOf() + v;
  },
  6
);
Array.of(1, 2); // [1, 2]

數(shù)組實例的 API

type 作用 返回值 是否修改原數(shù)組
copyWithin(target, start = 0, end = this.length) 在當(dāng)前數(shù)組內(nèi)部犬缨,將指定位置的成員復(fù)制到其他位置(會覆蓋原有成員),然后返回當(dāng)前數(shù)組棉浸。也就是說怀薛,使用這個方法,會修改當(dāng)前數(shù)組迷郑。 target(必需):從該位置開始替換數(shù)據(jù)枝恋。如果為負值,表示倒數(shù)嗡害。start(可選):從該位置開始讀取數(shù)據(jù)焚碌,默認為 0。如果為負值霸妹,表示倒數(shù)十电。end(可選):到該位置前停止讀取數(shù)據(jù),默認等于數(shù)組長度。如果為負值摆出,表示倒數(shù)朗徊。 新的數(shù)組
find((value, index, arr)=>{}, this ) 用于找出第一個符合條件的數(shù)組成員 返回找到的數(shù)組成員 , 沒找到就返回 undefined
findIndex((value, index, arr)=>{}, this ) 用于找出第一個符合條件的數(shù)組成員 返回第一個符合條件的數(shù)組成員的位置偎漫,如果所有成員都不符合條件爷恳,則返回-1
fill(value, startIndex, endIndex) 使用給定值,填充一個數(shù)組象踊。value (可選):填充值温亲。startIndex (可選):開始填充的位置。endIndex (可選):結(jié)束填充的位置杯矩。 注意栈虚,如果填充的類型為對象,那么被賦值的是同一個內(nèi)存地址的對象史隆,而不是深拷貝對象魂务。 填充后的新數(shù)組
includes(value,index) 表示某個數(shù)組是否包含給定的值,用來替代 indexOf 返回布爾值,true/false
flat(n=1) 用來給數(shù)組降維。n 表示降低的維數(shù)泌射,n 也可以是 Infinity 粘姜,表示無論有多少維,都降成一維 返回降維后的數(shù)組
flatMap((value,index,array) => {},n) 等同于先對數(shù)組執(zhí)行 map() ,然后再執(zhí)行 flat() 返回新的數(shù)組
entries() 對鍵值對的遍歷 遍歷器對象
keys() 對鍵名的遍歷 遍歷器對象
values() 對鍵值的遍歷 遍歷器對象

例子

// 將3號位復(fù)制到0號位
[1, 2, 3, 4, 5].copyWithin(0, 3, 4)
// [4, 2, 3, 4, 5]

// -2相當(dāng)于3號位熔酷,-1相當(dāng)于4號位
[1, 2, 3, 4, 5].copyWithin(0, -2, -1)
// [4, 2, 3, 4, 5]

// 將3號位復(fù)制到0號位
[].copyWithin.call({length: 5, 3: 1}, 0, 3)
// {0: 1, 3: 1, length: 5}

// 將2號位到數(shù)組結(jié)束孤紧,復(fù)制到0號位
let i32a = new Int32Array([1, 2, 3, 4, 5]);
i32a.copyWithin(0, 2);
// Int32Array [3, 4, 5, 4, 5]

// 對于沒有部署 TypedArray 的 copyWithin 方法的平臺
// 需要采用下面的寫法
[].copyWithin.call(new Int32Array([1, 2, 3, 4, 5]), 0, 3, 4);
// Int32Array [4, 2, 3, 4, 5]
[1, 4, -5, 10].find(n => n < 0);
// -5

[1, 5, 10, 15].find(function(value, index, arr) {
  return value > 9;
}); // 10

[1, 5, 10, 15].findIndex(function(value, index, arr) {
  return value > 9;
}); // 2

function f(v) {
  return v > this.age;
}
let person = { name: "John", age: 20 };
[10, 12, 26, 15].find(f, person); // 26

// 另外,這兩個方法都可以發(fā)現(xiàn)NaN拒秘,彌補了數(shù)組的indexOf方法的不足号显。
[NaN]
  .indexOf(NaN)
  // -1

  [NaN].findIndex(y => Object.is(NaN, y));
// 0
["a", "b", "c"].fill(7);
// [7, 7, 7]

new Array(3).fill(7);
// [7, 7, 7]

["a", "b", "c"].fill(7, 1, 2);
// ['a', 7, 'c']

let arr = new Array(3).fill({ name: "Mike" });
arr[0].name = "Ben";
arr;
// [{name: "Ben"}, {name: "Ben"}, {name: "Ben"}]

let arr = new Array(3).fill([]);
arr[0].push(5);
arr;
// [[5], [5], [5]]

數(shù)組的空位

ES5

type api
跳過空位 forEach(), filter(), reduce(), every() 和 some()
跳過空位,但會保留這個值 map()
視為 undefined join()和 toString()

ES6

明確將空位處理成 undefined躺酒,這句話的意思就是es6 之后的遍歷方法 都會把空位處理成 undefined
回到目錄

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末押蚤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子羹应,更是在濱河造成了極大的恐慌活喊,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件量愧,死亡現(xiàn)場離奇詭異,居然都是意外死亡帅矗,警方通過查閱死者的電腦和手機偎肃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浑此,“玉大人累颂,你說我怎么就攤上這事。” “怎么了紊馏?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵料饥,是天一觀的道長。 經(jīng)常有香客問我朱监,道長岸啡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任赫编,我火速辦了婚禮巡蘸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘擂送。我一直安慰自己悦荒,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布嘹吨。 她就那樣靜靜地躺著搬味,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蟀拷。 梳的紋絲不亂的頭發(fā)上碰纬,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機與錄音匹厘,去河邊找鬼嘀趟。 笑死,一個胖子當(dāng)著我的面吹牛愈诚,可吹牛的內(nèi)容都是我干的她按。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼炕柔,長吁一口氣:“原來是場噩夢啊……” “哼酌泰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起匕累,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤陵刹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后欢嘿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衰琐,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年炼蹦,在試婚紗的時候發(fā)現(xiàn)自己被綠了羡宙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡掐隐,死狀恐怖狗热,靈堂內(nèi)的尸體忽然破棺而出钞馁,到底是詐尸還是另有隱情,我是刑警寧澤匿刮,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布僧凰,位于F島的核電站,受9級特大地震影響熟丸,放射性物質(zhì)發(fā)生泄漏训措。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一虑啤、第九天 我趴在偏房一處隱蔽的房頂上張望隙弛。 院中可真熱鬧,春花似錦狞山、人聲如沸全闷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽总珠。三九已至,卻和暖如春勘纯,著一層夾襖步出監(jiān)牢的瞬間局服,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工驳遵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留淫奔,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓堤结,卻偏偏與公主長得像唆迁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子竞穷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容