最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js?中以?...?為前綴的幾種用法詳解

 更新時間:2022年09月29日 10:08:49   作者:亦黑迷失  
這篇文章主要為大家介紹了js?中以?...?為前綴的幾種用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

ES6 開始,js 新增了剩余參數(shù)語法、展開語法等,它們有個共同之處就是都以 ... 這么個符號為前綴,好像很多地方都可以用到,但實際上又不是同一回事,容易讓初學(xué)者暈頭轉(zhuǎn)向。本篇就對目前筆者已知的 3 種關(guān)于 ... 用法的總結(jié)歸納。

用法一:函數(shù)的剩余參數(shù)(Rest parameters)

定義函數(shù)的時候,形參當(dāng)中,最后一個參數(shù)(theArgs)如果以 ... 作為前綴,那么 theArgs 就會變?yōu)橐粋€數(shù)組,調(diào)用該函數(shù)時,如果傳入的實參數(shù)量大于等于定義函數(shù)時形參的數(shù)量,比如下面的例 1.1,形參定義了 3 個,卻傳入了 5 個實參,那么從 3 開始(包括),之后的實參都會被放入到 theArgs 中:

// 例 1.1
function fn(a, b, ...theArgs) {
  console.log(theArgs)
}
fn(1, 2, 3, 4, 5) // [ 3, 4, 5 ]

請注意,...theArgs 必須作為最后一個形參,不然會報語法錯誤:“SyntaxError: Rest parameter must be last formal parameter”。 除箭頭函數(shù)外,函數(shù)內(nèi)都有個 arguments 可以用來獲取傳遞給函數(shù)的參數(shù)。那么它和剩余參數(shù)有什么區(qū)別呢?

  • 剩余參數(shù),比如例 1.1 中的 theArgs 是個真數(shù)組,可以直接使用數(shù)組的方法,而 arguments 是一個類數(shù)組(array-like)對象,想要運用數(shù)組方法還得轉(zhuǎn)成數(shù)組;
  • 剩余參數(shù)只包含那些沒有對應(yīng)形參的實參,比如例 1.1 中的 3、4 和 5,而 arguments 包含了傳給函數(shù)的所有實參。
  • arguments 可以通過 callee 屬性獲取當(dāng)前 arguments 所在的函數(shù)。

其實 arguments 是早期的規(guī)范中為了方便獲取傳入函數(shù)的參數(shù)而存在的,ES6 之后,我們應(yīng)當(dāng)盡量使用剩余參數(shù)這種語法而不是 arguments。

用法二:展開語法(Spread syntax)

展開語法又可以在 3 個地方使用:

1)調(diào)用函數(shù)時

剩余參數(shù)是在函數(shù)定義時形參里使用的,展開語法的用處之一則是在函數(shù)調(diào)用時,傳入的實參里使用。具體說就是將數(shù)組表達式或者 string 在語法層面展開作為實參傳給函數(shù)。比如有如下代碼:

// 例 2.1
const arr = [1, 2, 3]
const string = 'Jay'
function fn(a, b, c) {
  console.log(a, b, c)
}

fn 接收 3 個參數(shù),如果我們想把數(shù)組 arr 中的每個元素傳給 fn,在 ES6 之前可以利用 apply 實現(xiàn):

// 例 2.1.1
fn.apply(null, arr) // 1 2 3

有了展開語法,則可以直接將作為參數(shù)的數(shù)組 arr 展開,這樣可以提高代碼的可讀性 :

// 例 2.1.2
fn(...arr) // 1 2 3

展開語法還可以將字符串展開:

// 例 2.1.3
fn(...string) // J a y

2)構(gòu)造數(shù)組時

通過字面量方式構(gòu)造數(shù)組時,也可以使用展開語法:

// 例 2.2
const arr1 = [1, 2]
const arr2 = [3, 4, 5]
// 構(gòu)造字面量數(shù)組
const newArr = [...arr1, ...arr2]
console.log(newArr) // [ 1, 2, 3, 4, 5 ]

3)構(gòu)造字面量對象時

除了構(gòu)造數(shù)組,ES2018(ES9) 添加了新的特性使得構(gòu)造對象的時候也可以運用展開語法,被展開的對象表達式將按 key-value 的方式展開 :

// 例 2.3.1
const obj = { name: 'Jay' }
const newObj = { ...obj, age: 40 }
console.log(newObj) // { name: 'Jay', age: 40 }

在構(gòu)造對象字面量時,還可以把數(shù)組也放進去展開,比如在 MDN 上關(guān)于展開語法的說明中有這么個例子:

// 例 2.3.2
const obj1 = { foo: 'bar', x: 42 }
const obj2 = { foo: 'baz', y: 13 }
const merge = (...objects) => ({ ...objects })
const mergedObj = merge(obj1, obj2)
console.log(mergedObj) // { '0': { foo: 'bar', x: 42 }, '1': { foo: 'baz', y: 13 } }

乍看上去迷迷糊糊的,可能的難點在于第 4 行代碼的理解,它定義了一個函數(shù) const merge = (...objects) => ({ ...objects }, 其中=> 左邊的 ...objects 為函數(shù)的剩余參數(shù)語法,所以 objects 就是一個由 obj1 和 obj2 這兩個對象組成的數(shù)組:[ { foo: 'bar', x: 42 }, { foo: 'baz', y: 13 } ];=>右邊的 ...objects 用到的是展開語法,用于構(gòu)造字面量對象,只不過因為 objects 是個數(shù)組,所以展開數(shù)組得到的對象的 key 為數(shù)組的下標(biāo),即 { ...objects } 得到的對象為:{ '0': { foo: 'bar', x: 42 }, '1': { foo: 'baz', y: 13 } }

注意

在調(diào)用函數(shù)或構(gòu)造數(shù)組時使用展開語法只能用于可迭代對象,比如不能在構(gòu)造數(shù)組時把一個對象放進去使用展開語法。

展開語法其實是一種淺拷貝

在 MDN 文檔還能看到這么一句話:

實際上, 展開語法和 Object.assign() 行為一致, 執(zhí)行的都是淺拷貝(只遍歷一層)。

也就是說類似下面的例 2.4:

// 例 2.4
const obj = {
  a: 'a',
  b: {
    c: 'd'
  }
}
const newObj = { ...obj }
newObj.b.c = '我變了'
console.log(obj.b.c) // 我變了

我們改變通過展開語法得到的 newObj 的深層屬性 newObj.b.c = '我變了' 時,會導(dǎo)致 obj.b.c 的值一同被修改。原因可以通過畫內(nèi)存表現(xiàn)圖說明:

const newObj = { ...obj } 生成的 newObj,只是把堆內(nèi)存中 obj 指向的地址為 0x100 這個對象整個復(fù)制了一份,生成了地址為 0x300 的新對象(注意這個新對象里,b 的值是一個內(nèi)存地址),然后讓 newObj 指向它。如果我們更改了 newObj 的 a 屬性或 b 屬性的值,當(dāng)然不會影響到 obj 對象,但是如果我們改變的是 newObj.b.c,就會找到 0x200 這個對象并修改,自然會影響到 obj 對象。

用法三:解構(gòu)數(shù)組時

在對數(shù)組進行解構(gòu)賦值時,我們可以使用剩余模式,將剩余數(shù)組賦值給一個變量,效果上類似于函數(shù)的剩余參數(shù)。比如下面例 3.1 中的 c

// 例 3.1
const arr = [1, 2, 3, 4, 5]
const [a, b, ...c] = arr
console.log(c) // [ 3, 4, 5 ]

以上就是js 中以 ... 為前綴的幾種用法詳解的詳細內(nèi)容,更多關(guān)于js ... 前綴用法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JSON+JavaScript處理JSON的簡單例子

    JSON+JavaScript處理JSON的簡單例子

    JSON+JavaScript處理JSON的簡單例子,需要的朋友可以參考一下
    2013-03-03
  • Bootstrap每天必學(xué)之標(biāo)簽頁(Tab)插件

    Bootstrap每天必學(xué)之標(biāo)簽頁(Tab)插件

    Bootstrap每天必學(xué)之標(biāo)簽頁(Tab)插件,通過這個插件您可以把內(nèi)容放置在標(biāo)簽頁或者是膠囊式標(biāo)簽頁甚至是下拉菜單標(biāo)簽頁中,感興趣的小伙伴們可以參考一下
    2016-04-04
  • 詳談for循環(huán)里面的break和continue語句

    詳談for循環(huán)里面的break和continue語句

    下面小編就為大家?guī)硪黄斦刦or循環(huán)里面的break和continue語句。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • JavaScript優(yōu)化以及前段開發(fā)小技巧

    JavaScript優(yōu)化以及前段開發(fā)小技巧

    隨著前端技術(shù)的發(fā)展,前端業(yè)務(wù)越來越繁重,這大大增加了JS代碼量。因此,要提高Web的性能,我們不僅需要關(guān)注頁面加載的時間,還要注重在頁面上操作的響應(yīng)速度。那么,接下來我們討論幾種能夠提高JavaScript效率的方法。
    2017-02-02
  • JavaScript 變量作用域及閉包

    JavaScript 變量作用域及閉包

    作用域JavaScript 的變量作用域是按照函數(shù)劃分的,為了快速的了解它的特性,我們通過實例來進行演示。
    2009-08-08
  • JSON 基本使用教程

    JSON 基本使用教程

    JSON是一種輕量級(Light-Meight)、基于文本的(Text-Based)、可讀的(Human-Readable)格式,這篇文章主要介紹了JSON 基本使用教程,需要的朋友可以參考下
    2023-02-02
  • 早該知道的7個JavaScript技巧

    早該知道的7個JavaScript技巧

    這篇文章對js編寫等方便詳細的說明了幾個技巧,方便大家提高效率,學(xué)習(xí)簡易化書寫代碼
    2013-03-03
  • 一文帶你搞懂Electron如何優(yōu)雅的進行進程間通訊

    一文帶你搞懂Electron如何優(yōu)雅的進行進程間通訊

    這篇文章主要為大家詳細介紹了Electron是如何優(yōu)雅的進行進程間通訊的,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • 微信小程序封裝的HTTP請求示例【附升級版】

    微信小程序封裝的HTTP請求示例【附升級版】

    這篇文章主要介紹了微信小程序封裝的HTTP請求,結(jié)合實例形式分析了微信小程序封裝基于wx.request方法的http請求相關(guān)操作與使用技巧,并附帶升級版示例供大家參考,需要的朋友可以參考下
    2019-05-05
  • Javascript的&&和||的另類用法

    Javascript的&&和||的另類用法

    這篇文章主要介紹了Javascript的&&和||的另類用法,需要的朋友可以參考下
    2014-07-07

最新評論

滕州市| 呼伦贝尔市| 宁河县| 保靖县| 延寿县| 苏尼特左旗| 新丰县| 图木舒克市| 宣武区| 沙湾县| 澳门| 社旗县| 囊谦县| 灵山县| 八宿县| 宁乡县| 长沙县| 高平市| 扶绥县| 昌宁县| 泰州市| 会理县| 尖扎县| 安溪县| 霍山县| 隆林| 登封市| 江西省| 吴桥县| 麻江县| 万载县| 黔东| 江都市| 夹江县| 蒙城县| 恩平市| 盐津县| 黔南| 辉南县| 华安县| 荥阳市|