JavaScript 數組新增 4 個非破壞性方法!

大家好,我是若川。持續組織了8個月源碼共讀活動,感興趣的可以點此加我微信 ruochuan12?參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》?包含20余篇源碼文章。歷史面試系列。另外:目前建有江西|湖南|湖北?籍 前端群,可加我微信進群。

今天聊 JavaScript 的最新提案,這是我 最新技術提案 專欄的第 16 篇文章了,感謝讀者們一如既往的支持!

開門見山,JavaScript 數組即將新增 4 個新的非破壞性方法:

  • .toReversed()

  • .toSorted()

  • .toSpliced()

  • .with()

Change Array by copy 提案

b4e92633c7acfa5e7ff889525bc0eb9c.png

這四個方法來源于新的 Change Array by copy 提案,目前已經處于 stage3階段,意味著基本上不會再有太大變化了,我們即將在各大瀏覽器里看到它們的實現。

提案地址:https://github.com/tc39/proposal-change-array-by-copy

數組的破壞性和非破壞性

為啥這個提案叫 Change Array by copy 呢?字面意思就是從副本里改變數組。

這就要說起數組的破壞性和非破壞性方法了:

有些數組的方法我們在調用的時候不會改變原始的數組,我們稱它們為非破壞性方法,比如我們經常用到的 filter、some、map、find 等方法,斗是不會改變原數組的:

120292c88f83f9d3a489104e1b8be131.png

但是,另外有一些方法是會改變原數組本身的,比如:sort、reverse、splice 等方法。

d7b22a85b31de5ddf937bbd9a88cd3b7.png

可以看到,原數組和排序后得到的新數組是一樣的,說明這個方法改變了原數組。很多時候我們想用這些方法,但是又不想改變原數組,我們可能會先創建一個副本,比如下面這些操作:

const?sorted1?=?array1.slice().sort();
const?sorted2?=?[...array1].sort();
const?sorted3?=?Array.from(array1).sort();

幾個數組的新方法,就是用來解決這樣的問題的。

toSorted()

.toSorted().sort() 的非破壞性版本:

const?array?=?['c',?'o',?'n',?'a',?'r',?'d',?'l',?'i'];
const?result?=?array.toSorted();
console.log(result);?//??['a',?'c',?'d',?'i',?'l',?'n',?'o',?'r']
console.log(array);?//?['c',?'o',?'n',?'a',?'r',?'d',?'l',?'i']

下面是個簡單的 polyfill

if?(!Array.prototype.toSorted)?{Array.prototype.toSorted?=?function?(compareFn)?{return?this.slice().sort(compareFn);};
}

toReversed()

.toReversed().reverse() 的非破壞性版本:

const?array?=?['c',?'o',?'n',?'a',?'r',?'d',?'l',?'i'];
const?result?=?array.toReversed();
console.log(result);?//??['i',?'l',?'d',?'r',?'a',?'n',?'o',?'c']
console.log(array);?//?['c',?'o',?'n',?'a',?'r',?'d',?'l',?'i']

下面是個簡單的 polyfill

if?(!Array.prototype.toReversed)?{Array.prototype.toReversed?=?function?()?{return?this.slice().reverse();};
}

with()

with() 是對數組的某個元素賦值操作的非破壞性版本,比如下面的操作:

array[index]?=?value

如果我們只是想得到一個新數組,又不想改變原數組,可以這樣用:

const?array?=?['c',?'o',?'n',?'a',?'r',?'d',?'l',?'i'];
const?result?=?array.with(0,?'ConardLi')
console.log(result);?//??['ConardLi',?'o',?'n',?'a',?'r',?'d',?'l',?'i'];
console.log(array);?//?['c',?'o',?'n',?'a',?'r',?'d',?'l',?'i']

下面是個簡單的 polyfill

if?(!Array.prototype.with)?{Array.prototype.with?=?function?(index,?value)?{const?copy?=?this.slice();copy[index]?=?value;return?copy;};
}

toSpliced()

.splice(start, deleteCount, ...items) 方法比其他幾個破壞性方法更復雜點:

  • 它從 start 開始刪除 deleteCount 個元素 ;

  • 然后把 items 插入到被刪除的位置;

  • 最后返回已刪除的元素。

const?array?=?[1,?2,?3,?4,?5,?6];
const?result?=?array.splice(1,?2,?0);
console.log(result);?//??[2,?3]
console.log(array);??//?[1,?0,?4,?5,?6]

.tospliced().splice() 的非破壞性版本,它會返回原數組變更后的版本,因此我們拿不到被刪除的元素:

const?array?=?[1,?2,?3,?4,?5,?6];
const?result?=?array.tospliced(1,?2,?0);
console.log(result);?//??[1,?0,?4,?5,?6]
console.log(array);??//?[1,?2,?3,?4,?5,?6]

下面是個簡單的 polyfill

if?(!Array.prototype.toSpliced)?{Array.prototype.toSpliced?=?function?(start,?deleteCount,?...items)?{const?copy?=?this.slice();copy.splice(start,?deleteCount,?...items);return?copy;};
}

polyfill

提案目前還在 stage3階段,在生產使用最好使用 polyfill

https://github.com/tc39/proposal-change-array-by-copy/blob/main/polyfill.js

b91374bb88d4a7c159806a3db575720c.gif

·················?若川簡介?·················

你好,我是若川,畢業于江西高校。現在是一名前端開發“工程師”。寫有《學習源碼整體架構系列》20余篇,在知乎、掘金收獲超百萬閱讀。
從2014年起,每年都會寫一篇年度總結,已經堅持寫了8年,點擊查看年度總結。
同時,最近組織了源碼共讀活動,幫助3000+前端人學會看源碼。公眾號愿景:幫助5年內前端人走向前列。

dd0e59b0565954e9fd5f49e069f92299.png

掃碼加我微信 ruochuan02、拉你進源碼共讀

今日話題

目前建有江西|湖南|湖北?籍 前端群,想進群的可以加我微信 ruochuan12?進群。分享、收藏、點贊、在看我的文章就是對我最大的支持~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/274728.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274728.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274728.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

自行車改裝電動車怎么樣_電動車聽起來應該是什么樣?

自行車改裝電動車怎么樣The sound of an all-electric car accelerating doesn’t have to sound like a standard combustion engine, It could sound like anything.全電動汽車加速的聲音不必聽起來像是標準的內燃機,它可以聽起來像任何東西。 These were the wor…

C++中的三種繼承public,protected,private(轉)

三種訪問權限 public:可以被任意實體訪問 protected:只允許子類及本類的成員函數訪問 private:只允許本類的成員函數訪問 三種繼承方式 public 繼承 protect 繼承 private 繼承 組合結果 基類中 繼承方式 子類中 public & public繼承 > public public &#xff0…

如何碎片化時間學前端,了解前沿趨勢

我很開心在前端行業認識了一批優秀且樂于分享的朋友,他們的技術分享與職業觀點讓我獲益良多,推薦給大家一起關注。程序員成長指北Node.js 前端工程化 低代碼考拉小姐姐,一個有趣且樂于分享的人!目前就職于某知名外企,負…

谷歌pay破解_Google Pay缺少Google聞名的一件事-UX案例研究

谷歌pay破解Disclaimer: The views expressed in the blog post is purely based on personal experience. It was not influenced by any external factor.When Google launched Tez (now Google Pay) in India during 2017, their primary goal was to design a simple payme…

進階高級前端,這位大前端架構師一定不能錯過

今天給大家介紹一位好朋友:這波能反殺:一位擁有十年工作經驗,對學習方法有獨到理解的資深大前端架構師。一、博客早在 2017 年初,波神在簡書平臺以《前端基礎進階》為名,更新了一系列優質文章,獲得大量認可…

memcached應用策略(轉)

memcached應用策略(轉)(2012-04-05 11:10:02) 轉載▼標簽: memcached 應用策略 it分類: linux_c memcached應用策略memcached 主要的作用是為減輕大訪問量對數據庫的沖擊,所以一般的邏輯是首先從memcached中讀取數據&a…

突然討厭做前端,討厭代碼_為什么用戶討厭重新設計

突然討厭做前端,討厭代碼重點 (Top highlight)The core of design thinking is to only design something that will bring value and fill the gap in consumer needs. Right? Why else would one design something that no one asked for? While that may be true to some …

那些年我面過的「六年經驗」的初級工程師

大家好,我是若川。持續組織了8個月源碼共讀活動,感興趣的可以 點此加我微信ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列。另外…

sql反模式分析2

第八章 多列屬性目標:存儲多值屬性 為一個bug設置多個標簽反模式:創建多個列,為bugs創建tag1,tag2,tag3幾個列保存標簽。標簽必須放于其中一個。1.查詢數據,比如搜索這三列,可以使用in語句2.添…

更多信息請關注微信公眾號_為什么我們更多地關注表面異常?

更多信息請關注微信公眾號Don’t you feel lucky to find a single seasoned curly fry in your bunch of plain old boring french fries? Do you remember highlighting important texts of your study materials before the exams? Both situations might seem irrelevant…

eclipse中的漢字極小的解決方案(轉載)

eclipse中的漢字極小的解決方案(轉載) 可能新裝了eclipse后,寫java代碼的時候發現,寫注釋的時候發現,漢字小的可憐,網上搜一下,又是改字體又是設置字體大小,試用后發現都不是針對這個的方法。 無奈在自己摸…

面試官經常問的觀察者模式如何實現~

大家好,我是若川。持續組織了8個月源碼共讀活動,感興趣的可以 點此加我微信ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列。另外…

旅行者 問題_門檻項目:沒有旅行者回到他的原籍城市。

旅行者 問題Sohini Mukherjee| MFA| Spring 2020Sohini Mukherjee | 外交部| 2020年Spring Artivive app to see the full Artivive應用程序可查看完整的#AR experience.#AR體驗。 Prompt:提示: As second semester, first year graduate students, you are at a …

產品經理懂技術=流氓會武術(zz)

最近七年,我都在做互聯網產品,其中前五年分別在創業公司和上市公司里,做別人的產品;近兩年在創業,做自己的產品。 我的體會是:產品經理需要懂技術,創業者尤其需要。但前提是你總覺得有股憋不住的…

技術人的七大必備特質

大家好,我是若川。持續組織了8個月源碼共讀活動,感興趣的可以 點此加我微信ruochuan12 參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。歷史面試系列。另外…

figma下載_在Figma中進行原型制作的技巧和竅門

figma下載自定義過渡和微交互 (Custom transitions and micro-interactions) Yep, I know that there are a lot of useful built-in transition effects in Figma already, but here I want to talk about custom micro-interactions, complicated transitions and show you h…

布局收藏用

http://www.aa25.cn/layout/index.shtml轉載于:https://www.cnblogs.com/OceanChen/archive/2012/07/25/2608882.html

技術日新月異,發展迅速,如何不斷擴展視野

技術日新月異,發展迅速,作為一個與時俱進的互聯網人,需要不斷地學習擴寬視野。今天為大家推薦幾個技術領域中出類拔萃的公眾號,它們的每一篇推文都值得你點開!1葉小釵技術管理 技術轉型 公司治理葉小釵,原騰…

不想當全棧的設計師不是_但我不想成為產品設計師

不想當全棧的設計師不是重點 (Top highlight)I’ve made a huge mistake, I thought to myself, as a realization washed over me in the middle of an interview for a product design role.我對自己想,我犯了一個巨大的錯誤,因為在接受產品設計職務的…

學習 WCF (6)--學習調用WCF服務的各種方法

來自:http://www.cnblogs.com/gaoweipeng/archive/2009/07/26/1528263.html 根據不同的情況,我們可以用不同的方法調用WCF服務,本文簡單總結了一下調用WCF的一些方法(代理類,Ajax...),分享給大家。開發工具調用WCF 這中…