[js高手之路] es6系列教程 - 不定參數與展開運算符(...)


三個點(...)在es6中,有兩個含義:

  • 用在形參中, 表示傳遞給他的參數集合, 類似於arguments, 叫不定參數. 語法格式:  在形參面前加三個點( ... )
  • 用在數組前面,可以把數組的值全部打散,展開,叫展開運算符. 語法格式:  在數組面前加三個點( ... )

求不定參數的和,以前可以用arguments來做,現在可以用不定參數來做,如下:

 1         function add( ...values ){
 2             console.log( values ); // [10, 20, 30]
 3             let sum = 0;
 4             for( let i = 0, len = values.length; i < len; i++ ){
 5                 sum += values[i];
 6             }
 7             return sum;
 8         }
 9         var res = add( 10, 20, 30 );
10         console.log( res ); //60
1         function add( ...keys, last ) { //報錯,不定參數只能放在最后面
2 
3         }
1         // function add( ...key1, ...key2 ){ //報錯,一個函數不能出現多個不定參數
2 
3         // }

篩選拷貝對象的屬性,之前我們是這樣子做的:

 1         function pick( src ){
 2             let target = Object.create( null );//創建一個空對象,跟new Object不同
 3             for( let i = 1, len = arguments.length; i < len; i++ ){
 4                 target[arguments[i]] = src[arguments[i]];
 5             }
 6             return target;
 7         }
 8         let user = {
 9             name : 'ghostwu',
10             age : 22,
11             sex : 'man',
12         };
13         var obj = pick( user, 'name', 'age' ); //拷貝user對象的name和age屬性
14         console.log( obj ); //{name: "ghostwu", age: 22}

這樣做沒有什么問題,讀取屬性我們始終要記得從1開始, 因為arguments對象的索引0 被 src這個參數占據了. 用不定參數修改如下:

 1         function pick( src, ...keys ){
 2             console.log( keys ); //['name','age'];
 3             let target = Object.create( null );
 4             for( let i = 0, len = keys.length; i < len; i++ ){
 5                 target[keys[i]] = src[keys[i]];
 6             }
 7             return target;
 8         }
 9 
10         let user = {
11             name : 'ghostwu',
12             age : 22,
13             sex : 'man',
14         };
15 
16         var obj = pick( user, 'name', 'age' );
17         console.log( obj );

以上方式,更符合數組操作習慣, 拿來就用,不要老是記着從1開始

不定參數與arguments類似,當初設計的目的就是為了取代arguments,那不定參數會不會影響arguments呢?

1         function show( ...keys ){
2             console.log( keys.length ); //3
3             console.log( arguments.length ); //3
4             keys[0] = 1000;
5             console.log( keys[0], keys[1], keys[2] ); // 1000,20,30
6             console.log( arguments[0], arguments[1], arguments[2] ); //10,20,30
7         }
8         show( 10, 20, 30 );

不定參數修改之后,arguments並不會受到影響

展開運算符:

1         let a = 10, b = 20;
2         console.log( Math.max( a, b ) ); //20
1         let arr = [ 1, 3, 0, -1, 20, 100 ];
2         console.log( Math.max( arr ) );//NaN, max不能接收數組參數

我們可以借助apply的語法,把數組傳遞進去

1 let arr = [ 1, 3, 0, -1, 20, 100 ];
2 console.log( Math.max.apply( Math, arr ) );//100

有了展開運算符之后,更簡單

1         let arr = [ 1, 3, 0, -1, 20, 100 ];
2         console.log( Math.max( ...arr ) ); //100 ...: 把數組展開
3         console.log( Math.max( ...arr, 1000 ) ); //1000

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM