[TOC]
>[success] # 使用不具名參數
~~~
在使用'js函數'時,'ES5'可以不寫'形參',在函數中用'arguments'數組就可以獲取到'實參','ES6'中形參上
需要寫一個參數'...keys'的方式,這樣寫所有傳遞的'實參'都會成數組的形式。
~~~
<br/>
>[success] ## ES5 和 ES6不具名參數對比
~~~
let b = []
let c = { d: 2 }
function test (){
console.log(arguments)
}
test('a',b,c)
// 等同于
let test = (...keys) => {
console.log(keys)
}
test('a',b,c)
需要'注意'的點,如果函數的形參不止'...keys'一個,并且'...keys'在第一個參數后面,那么'keys'
會把從第二個參數開始后續的所有'實參'生成一個'keys數組',例子如下:
function test(a, ...keys) {
console.log(keys)
}
test(1, 2, 3, 4) // [2, 3, 4]
~~~
<br/>
>[success] ## ES5 中的不定參數(arguments)
~~~
'ES5'中可以使用'arguments'參數數組,來獲取'所有參數'
~~~
~~~
function pick(object) {
let result = Object.create(null)
// 從第二個參數開始處理(數組下標1)
for (let i = 1, len = arguments.length; i < len; i++) {
result[arguments[i]] = object[arguments[i]]
}
return result
}
let book = {
title: "Understanding ES6",
author: "Nicholas C. Zakas",
year: 2015
}
let bookData = pick(book, "author", "year")
console.log(book) // 原始對象會有__proto__屬性
console.log(bookData) // pick方法會返回一個純凈的對象(無__proto__屬性)
console.log(bookData.author); // "Nicholas C. Zakas"
console.log(bookData.year); // 2015
~~~
<br/>
>[success] ## ES6剩余(不定)參數(...keys)
~~~
下面的'keys'是一個包含所有在'object'之后的參數的'剩余參數'(這與包含所有參數的'arguments'不同,
后者會連第一個參數都包含在內)。這意味著你可以對'keys'從 頭到尾進行迭代,而不需要有所顧慮,在
'function'中可以使用'arguments'參數也可以使用'剩余參數'
~~~
~~~
function pick(object, ...keys) {
let result = Object.create(null);
for (let i = 0, len = keys.length; i < len; i++) { // 這里i = 0,因為...keys會把object參數后的所有參數作為一個數組
result[keys[i]] = object[keys[i]]
}
return result;
}
~~~
<br/>
>[success] ### 剩余參數的限制條件
~~~
'剩余參數'有'2'點限制條件:
1. 一個函數只能有一個'剩余參數',并且它必須被'放在參數的最后',下面的列子瀏覽器報錯:Uncaught SyntaxError:
Rest parameter must be last formal parameter,翻譯過來就是未捕獲的SyntaxError:'剩余參數'必須是
'最后一個參數'
function test(a, ...keys, b) {
console.log(a)
console.log(keys)
console.log(b)
}
test()
2. '剩余參數'不能在對象的'setter'屬性中使用,因為setter屬性只允許使用'單個參數'
let object = {
// 語法錯誤:不能在 setter 中使用剩余參數
set name(...value) {
// 一些操作
}
}
object.name = [1,2,3,4,5]
~~~
- Javascript基礎篇
- Array數組
- 數組插入值
- filter()
- forEach()
- push()
- pop()
- unshift()
- shift()
- valueOf()
- 面向對象思想
- Javascript 面向對象編程(一):封裝
- Javascript面向對象編程(二):構造函數的繼承
- Javascript面向對象編程(三):非構造函數的繼承
- 解構
- 數組的解構賦值
- 對象的解構賦值
- 函數參數解構
- 字符串的解構賦值
- 數值和布爾值的解構賦值
- 圓括號問題
- 字符串.
- split()
- charAt()
- charCodeAt()
- concat()
- indexOf()
- lastIndexOf()
- match()
- replace()
- includes()
- 初識遞歸
- 渲染ul-li樹形結構
- 異步函數解決方案
- 1. callback回調函數
- 2. ES6 - Promise
- JavaScript高級程序設計(書)
- 在html中使用JavaScript
- script標簽的位置
- 延遲腳本
- 異步腳本
- <noscript>元素
- 基本概念
- 嚴格模式
- 變量詳解
- 數據類型
- typeof操作符
- undefined類型
- Null類型
- Boolean類型
- Number類型
- 深入了解ES6(書)
- var 、let 、 const
- 字符串與正則表達式
- 字符串
- 正則表達式
- 函數
- 函數形參默認值
- 使用不具名參數
- 函數構造器的增強能力
- 擴展運算符
- name屬性
- 明確函數的多重用途
- 塊級函數
- 箭頭函數
- 尾調用優化
- 擴展的對象功能
- 對象類別
- 對象字面量語法的擴展
- ES6對象新增方法
- 重復的對象屬性
- 自有屬性的枚舉順序
- 更強大的原型
- 解構:更方便的數據訪問
- 為什么要用解構?
- 對象解構
- 數組解構
- 混合解構
- 參數解構
- Symbol與Symbol屬性
- 創建Symbol
- Symbol的使用方法
- Symbol全局私有屬性
- Symbol與類型強制轉換
- Symbol屬性檢索
- Symbol的一些構造方法
- Set集合與Map集合
- Set集合
- Weak Set集合(弱引用Set集合)
- Map集合
- JS標準內置對象
- Object 構造函數及屬性
- Object 構造方法
- Symbol 內建對象類的函數及屬性
- Set 構造函數及屬性
- Weak Set 構造函數及屬性
- JS雜項
- 類數組對象
- Class類的理解和使用