å¨ JavaScript ä¸ï¼å¾å¤å å»ºå½æ°é½æ¯æä¼ å ¥ä»»ææ°éçåæ°ã
ä¾å¦ï¼
Math.max(arg1, arg2, ..., argN)ââ è¿ååæ°ä¸çæå¤§å¼ãObject.assign(dest, src1, ..., srcN)ââ 便¬¡å°å±æ§ä»src1..Nå¤å¶å°destã- â¦â¦çã
卿¬ç« ä¸ï¼æä»¬å°å¦ä¹ å¦ä½ç¼åæ¯æä¼ å ¥ä»»ææ°éåæ°ç彿°ï¼ä»¥åå¦ä½å°æ°ç»ä½ä¸ºåæ°ä¼ éç»è¿ç±»å½æ°ã
Rest åæ° ...
å¨ JavaScript ä¸ï¼æ è®ºå½æ°æ¯å¦ä½å®ä¹çï¼ä½ é½å¯ä»¥å¨è°ç¨å®æ¶ä¼ å ¥ä»»ææ°éçåæ°ã
ä¾å¦ï¼
function sum(a, b) {
return a + b;
}
alert( sum(1, 2, 3, 4, 5) );
è½ç¶è¿éè¿ä¸ªå½æ°ä¸ä¼å ä¸ºä¼ å ¥è¿å¤çåæ°èæ¥éã使¯ï¼å½ç¶ï¼åªæåä¸¤ä¸ªåæ°è¢«æ±åäºã
æä»¬å¯ä»¥å¨å½æ°å®ä¹ä¸å£°æä¸ä¸ªæ°ç»æ¥æ¶éåæ°ãè¯æ³æ¯è¿æ ·çï¼...åéåï¼è¿å°ä¼å£°æä¸ä¸ªæ°ç»å¹¶æå®å
¶åç§°ï¼å
¶ä¸åæå©ä½çåæ°ãè¿ä¸ä¸ªç¹çè¯ä¹å°±æ¯âæ¶éå©ä½çåæ°å¹¶åè¿æå®æ°ç»ä¸âã
ä¾å¦ï¼æä»¬éè¦æææç忰齿¾å°æ°ç» args ä¸ï¼
function sumAll(...args) { // æ°ç»å为 args
let sum = 0;
for (let arg of args) sum += arg;
return sum;
}
alert( sumAll(1) ); // 1
alert( sumAll(1, 2) ); // 3
alert( sumAll(1, 2, 3) ); // 6
æä»¬ä¹å¯ä»¥éæ©å°ç¬¬ä¸ä¸ªåæ°è·å为åéï¼å¹¶å°å©ä½çåæ°æ¶éèµ·æ¥ã
ä¸é¢çä¾åæåä¸¤ä¸ªåæ°è·å为åéï¼å¹¶æå©ä½çåæ°æ¶éå° titles æ°ç»ä¸ï¼
function showName(firstName, lastName, ...titles) {
alert( firstName + ' ' + lastName ); // Julius Caesar
// å©ä½çåæ°è¢«æ¾å
¥ titles æ°ç»ä¸
// i.e. titles = ["Consul", "Imperator"]
alert( titles[0] ); // Consul
alert( titles[1] ); // Imperator
alert( titles.length ); // 2
}
showName("Julius", "Caesar", "Consul", "Imperator");
Rest 忰伿¶éå©ä½çææåæ°ï¼å æ¤ä¸é¢è¿ç§ç¨æ³æ²¡ææä¹ï¼å¹¶ä¸ä¼å¯¼è´é误ï¼
function f(arg1, ...rest, arg2) { // arg2 å¨ ...rest åé¢ï¼ï¼
// error
}
...rest å¿
é¡»åå¨åæ°å表æåã
âargumentsâ åé
æä¸ä¸ªå为 arguments çç¹æ®ç±»æ°ç»å¯¹è±¡å¯ä»¥å¨å½æ°ä¸è¢«è®¿é®ï¼è¯¥å¯¹è±¡ä»¥åæ°å¨åæ°å表ä¸çç´¢å¼ä½ä¸ºé®ï¼å卿æåæ°ã
ä¾å¦ï¼
function showName() {
alert( arguments.length );
alert( arguments[0] );
alert( arguments[1] );
// 宿¯å¯éåç
// for(let arg of arguments) alert(arg);
}
// 便¬¡æ¾ç¤ºï¼2ï¼Juliusï¼Caesar
showName("Julius", "Caesar");
// 便¬¡æ¾ç¤ºï¼1ï¼Ilyaï¼undefinedï¼æ²¡æç¬¬äºä¸ªåæ°ï¼
showName("Ilya");
å¨è¿å»ï¼JavaScript ä¸ä¸æ¯æ rest åæ°è¯æ³ï¼èä½¿ç¨ arguments æ¯è·å彿°ææåæ°çå¯ä¸æ¹æ³ãç°å¨å®ä»ç¶ææï¼æä»¬å¯ä»¥å¨ä¸äºè代ç éæ¾å°å®ã
ä½ç¼ºç¹æ¯ï¼å°½ç®¡ arguments æ¯ä¸ä¸ªç±»æ°ç»ï¼ä¹æ¯å¯è¿ä»£å¯¹è±¡ï¼ä½å®ç»ç©¶ä¸æ¯æ°ç»ãå®ä¸æ¯ææ°ç»æ¹æ³ï¼å æ¤æä»¬ä¸è½è°ç¨ arguments.map(...) çæ¹æ³ã
æ¤å¤ï¼å®å§ç»å 嫿æåæ°ï¼æä»¬ä¸è½åä½¿ç¨ rest 忰飿 ·åªæªååæ°çä¸é¨åã
å æ¤ï¼å½æä»¬éè¦è¿äºåè½æ¶ï¼æå¥½ä½¿ç¨ rest åæ°ã
"arguments"妿æä»¬å¨ç®å¤´å½æ°ä¸è®¿é® argumentsï¼è®¿é®å°ç arguments å¹¶ä¸å±äºç®å¤´å½æ°ï¼èæ¯å±äºç®å¤´å½æ°å¤é¨çâæ®éâ彿°ã
举个ä¾åï¼
function f() {
let showArg = () => alert(arguments[0]);
showArg();
}
f(1); // 1
æä»¬å·²ç»ç¥éï¼ç®å¤´å½æ°æ²¡æèªèº«ç thisãç°å¨æä»¬ç¥éäºå®ä»¬ä¹æ²¡æç¹æ®ç arguments 对象ã
Spread è¯æ³
æä»¬ååçå°äºå¦ä½ä»åæ°å表ä¸è·åæ°ç»ã
ææ¶åæä»¬ä¹éè¦åä¸ä¹ç¸åçäºã
ä¾å¦ï¼å å»ºå½æ° Math.max ä¼è¿å忰䏿大çå¼ï¼
alert( Math.max(3, 5, 1) ); // 5
妿æä»¬æä¸ä¸ªæ°ç» [3, 5, 1]ï¼æä»¬è¯¥å¦ä½ç¨å®è°ç¨ Math.max å¢ï¼
ç´æ¥âåæ ·âä¼ å
¥è¿ä¸ªæ°ç»æ¯ä¸ä¼å¥æçï¼å 为 Math.max ææçæ¯å表形å¼çæ°å¼ååæ°ï¼è䏿¯ä¸ä¸ªæ°ç»ï¼
let arr = [3, 5, 1];
alert( Math.max(arr) ); // NaN
毫æ çé®ï¼æä»¬ä¸è½æå¨å°å»ä¸ä¸è®¾ç½®åæ° Math.max(arg[0], arg[1], arg[2])ï¼å 为æä»¬ä¸ç¡®å®è¿å¿æå¤å°ä¸ªãå¨ä»£ç æ§è¡æ¶ï¼åæ°æ°ç»ä¸å¯è½æå¾å¤ä¸ªå
ç´ ï¼ä¹å¯è½ä¸ä¸ªé½æ²¡æãèä¸ï¼è¿æ ·ç代ç ä¹å¾ä¸ä¼é
ã
Spread è¯æ³ å¯ä»¥è§£å³è¿ä¸ªé®é¢ï¼å®çèµ·æ¥å rest åæ°å¾åï¼ä¹ä½¿ç¨ ...ï¼ä½æ¯äºè
çç¨éå®å
¨ç¸åã
å½å¨å½æ°è°ç¨ä¸ä½¿ç¨ ...arr æ¶ï¼å®ä¼æå¯è¿ä»£å¯¹è±¡ arr âå±å¼âå°åæ°å表ä¸ã
以 Math.max 为ä¾ï¼
let arr = [3, 5, 1];
alert( Math.max(...arr) ); // 5ï¼spread è¯æ³ææ°ç»è½¬æ¢ä¸ºåæ°å表ï¼
æä»¬è¿å¯ä»¥éè¿è¿ç§æ¹å¼ä¼ å ¥å¤ä¸ªå¯è¿ä»£å¯¹è±¡ï¼
let arr1 = [1, -2, 3, 4];
let arr2 = [8, 3, -8, 1];
alert( Math.max(...arr1, ...arr2) ); // 8
æä»¬çè³è¿å¯ä»¥å° spread è¯æ³ä¸å¸¸è§å¼ç»å使ç¨ï¼
let arr1 = [1, -2, 3, 4];
let arr2 = [8, 3, -8, 1];
alert( Math.max(1, ...arr1, 2, ...arr2, 25) ); // 25
å¹¶ä¸ï¼æä»¬è¿å¯ä»¥ä½¿ç¨ spread è¯æ³æ¥åå¹¶æ°ç»ï¼
let arr = [3, 5, 1];
let arr2 = [8, 9, 15];
let merged = [0, ...arr, 2, ...arr2];
alert(merged); // 0,3,5,1,2,8,9,15ï¼0ï¼ç¶åæ¯ arrï¼ç¶åæ¯ 2ï¼ç¶åæ¯ arr2ï¼
å¨ä¸é¢ç示ä¾ä¸ï¼æä»¬ä½¿ç¨æ°ç»å±ç¤ºäº spread è¯æ³ï¼å ¶å®æä»¬å¯ä»¥ç¨ spread è¯æ³è¿æ ·æä½ä»»ä½å¯è¿ä»£å¯¹è±¡ã
ä¾å¦ï¼å¨è¿å¿æä»¬ä½¿ç¨ spread è¯æ³å°å符串转æ¢ä¸ºå符æ°ç»ï¼
let str = "Hello";
alert( [...str] ); // H,e,l,l,o
Spread è¯æ³å
é¨ä½¿ç¨äºè¿ä»£å¨æ¥æ¶éå
ç´ ï¼ä¸ for..of çæ¹å¼ç¸åã
å æ¤ï¼å¯¹äºä¸ä¸ªå符串ï¼for..of ä¼é个è¿å该å符串ä¸çå符ï¼...str ä¹åçä¼å¾å° "H","e","l","l","o" è¿æ ·çç»æãéåï¼å符åè¡¨è¢«ä¼ éç»æ°ç»åå§åå¨ [...str]ã
对äºè¿ä¸ªç¹å®ä»»å¡ï¼æä»¬è¿å¯ä»¥ä½¿ç¨ Array.from æ¥å®ç°ï¼å ä¸ºè¯¥æ¹æ³ä¼å°ä¸ä¸ªå¯è¿ä»£å¯¹è±¡ï¼å¦å符串ï¼è½¬æ¢ä¸ºæ°ç»ï¼
let str = "Hello";
// Array.from å°å¯è¿ä»£å¯¹è±¡è½¬æ¢ä¸ºæ°ç»
alert( Array.from(str) ); // H,e,l,l,o
è¿è¡ç»æä¸ [...str] ç¸åã
ä¸è¿ Array.from(obj) å [...obj] åå¨ä¸ä¸ªç»å¾®çå·®å«ï¼
Array.froméç¨äºç±»æ°ç»å¯¹è±¡ä¹éç¨äºå¯è¿ä»£å¯¹è±¡ã- Spread è¯æ³åªéç¨äºå¯è¿ä»£å¯¹è±¡ã
å æ¤ï¼å¯¹äºå°ä¸äºâä¸è¥¿â转æ¢ä¸ºæ°ç»çä»»å¡ï¼Array.from å¾å¾æ´éç¨ã
å¤å¶ array/object
è¿è®°å¾æä»¬ ä¹å讲è¿ç Object.assign() åï¼
ä½¿ç¨ spread è¯æ³ä¹å¯ä»¥ååæ ·çäºæ ï¼è¯æ³¨ï¼ä¹å°±æ¯è¿è¡æµ æ·è´ï¼ã
let arr = [1, 2, 3];
let arrCopy = [...arr]; // å°æ°ç» spread å°åæ°å表ä¸
// ç¶åå°ç»ææ¾å°ä¸ä¸ªæ°æ°ç»
// 两个æ°ç»ä¸çå
容ç¸ååï¼
alert(JSON.stringify(arr) === JSON.stringify(arrCopy)); // true
// 两个æ°ç»ç¸çåï¼
alert(arr === arrCopy); // falseï¼å®ä»¬çå¼ç¨æ¯ä¸åçï¼
// ä¿®æ¹æä»¬åå§çæ°ç»ä¸ä¼ä¿®æ¹å¯æ¬ï¼
arr.push(4);
alert(arr); // 1, 2, 3, 4
alert(arrCopy); // 1, 2, 3
å¹¶ä¸ï¼ä¹å¯ä»¥éè¿ç¸åçæ¹å¼æ¥å¤å¶ä¸ä¸ªå¯¹è±¡ï¼
let obj = { a: 1, b: 2, c: 3 };
let objCopy = { ...obj }; // å°å¯¹è±¡ spread å°åæ°å表ä¸
// ç¶åå°ç»æè¿åå°ä¸ä¸ªæ°å¯¹è±¡
// 两个对象ä¸çå
容ç¸ååï¼
alert(JSON.stringify(obj) === JSON.stringify(objCopy)); // true
// 两个对象ç¸çåï¼
alert(obj === objCopy); // false (not same reference)
// ä¿®æ¹æä»¬åå§ç对象ä¸ä¼ä¿®æ¹å¯æ¬ï¼
obj.d = 4;
alert(JSON.stringify(obj)); // {"a":1,"b":2,"c":3,"d":4}
alert(JSON.stringify(objCopy)); // {"a":1,"b":2,"c":3}
è¿ç§æ¹å¼æ¯ä½¿ç¨ let arrCopy = Object.assign([], arr) å¤å¶æ°ç»ï¼æä½¿ç¨ let objCopy = Object.assign({}, obj) å¤å¶å¯¹è±¡æ¥è¯´æ´ä¸ºç®ä¾¿ãå æ¤ï¼åªè¦æ
åµå
è®¸ï¼æä»¬å¾åäºä½¿ç¨å®ã
æ»ç»
彿们å¨ä»£ç ä¸çå° "..." æ¶ï¼å®è¦ä¹æ¯ rest åæ°ï¼è¦ä¹æ¯ spread è¯æ³ã
æä¸ä¸ªç®åçæ¹æ³å¯ä»¥åºåå®ä»¬ï¼
- è¥
...åºç°å¨å½æ°åæ°å表çæåï¼é£ä¹å®å°±æ¯ rest åæ°ï¼å®ä¼æåæ°å表ä¸å©ä½çåæ°æ¶éå°ä¸ä¸ªæ°ç»ä¸ã - è¥
...åºç°å¨å½æ°è°ç¨æç±»ä¼¼ç表达å¼ä¸ï¼é£å®å°±æ¯ spread è¯æ³ï¼å®ä¼æä¸ä¸ªæ°ç»å±å¼ä¸ºå表ã
使ç¨åºæ¯ï¼
- Rest åæ°ç¨äºåå»ºå¯æ¥åä»»ææ°éåæ°ç彿°ã
- Spread è¯æ³ç¨äºå°æ°ç»ä¼ éç»é常éè¦å«æè®¸å¤åæ°ç彿°ã
æä»¬å¯ä»¥ä½¿ç¨è¿ä¸¤ç§è¯æ³è½»æ¾å°äºç¸è½¬æ¢å表ä¸åæ°æ°ç»ã
æ§å¼ç argumentsï¼ç±»æ°ç»ä¸å¯è¿ä»£ç对象ï¼ä¹ä¾ç¶è½å¤å¸®å©æä»¬è·å彿°è°ç¨ä¸çææåæ°ã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼