Array.prototype.with()
åºçº¿
广æ³å¯ç¨
èª 2023å¹´7æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
Array å®ä¾ç with() æ¹æ³æ¯ä½¿ç¨æ¹æ¬å·è¡¨ç¤ºæ³ä¿®æ¹æå®ç´¢å¼å¼çå¤å¶æ¹æ³çæ¬ãå®ä¼è¿åä¸ä¸ªæ°æ°ç»ï¼å
¶æå®ç´¢å¼å¤çå¼ä¼è¢«æ°å¼æ¿æ¢ã
è¯æ³
arrayInstance.with(index, value)
åæ°
index-
è¦ä¿®æ¹çæ°ç»ç´¢å¼ï¼ä» 0 å¼å§ï¼ï¼å°ä¼è½¬æ¢ä¸ºæ´æ°ã
- è´æ°ç´¢å¼ä¼ä»æ°ç»æ«å°¾å¼å§è®¡æ°ââå³å½
index < 0æ¶ï¼ä¼ä½¿ç¨index + array.lengthã - 妿è§èååçç´¢å¼è¶
åºæ°ç»è¾¹çï¼ä¼æåº
RangeErrorã
- è´æ°ç´¢å¼ä¼ä»æ°ç»æ«å°¾å¼å§è®¡æ°ââå³å½
value-
è¦åé ç»æå®ç´¢å¼çä»»ä½å¼ã
è¿åå¼
ä¸ä¸ªå
¨æ°çæ°ç»ï¼å
¶ä¸ index ç´¢å¼å¤çå
ç´ è¢«æ¿æ¢ä¸º valueã
å¼å¸¸
RangeError-
index > array.lengthæindex < -array.lengthæ¶æåºã
æè¿°
with() éè¿è¿åä¸ä¸ªæå®ç´¢å¼å¤çå¼è¢«æ°å¼æ¿æ¢çæ°æ°ç»ï¼æ¥æ¹åæ°ç»ä¸æå®ç´¢å¼å¤çå¼ãåæ°ç»ä¸ä¼è¢«ä¿®æ¹ï¼è¿ä½¿å¾ä½ å¯ä»¥ä»¥é¾å¼è°ç¨æ°ç»æ¹æ³çæ¹å¼æ¥å¯¹æ°ç»è¿è¡æä½ã
éè¿ç»å使ç¨with() å at() 彿°ï¼å¯åå«å°åå
¥åè¯»åæ°ç»ï¼ç´¢å¼ä½¿ç¨æ£æ°è´æ°åå¯ã
with() æ¹æ³æ°¸è¿ä¸ä¼äº§çç¨çæ°ç»ãå¦æåæ°ç»æ¯ç¨ççï¼æ°æ°ç»å¯¹åºç空ç½ç´¢å¼ä½ç½®ä¼æ¿æ¢ä¸º undefinedã
with() æ¹æ³æ¯éç¨çãå®åªææ this å¼å
·æ length 屿§åæ´æ°é®å±æ§ã
示ä¾
>å建ä¸ä¸ªæ°çæ°ç»ï¼æ¹åå ¶ä¸ä¸ä¸ªå ç´
const arr = [1, 2, 3, 4, 5];
console.log(arr.with(2, 6)); // [1, 2, 6, 4, 5]
console.log(arr); // [1, 2, 3, 4, 5]
æ°ç»æ¹æ³çé¾å¼è°ç¨
ä½¿ç¨ with() æ¹æ³ï¼ä½ å¯ä»¥å¨æ´æ°ä¸ä¸ªæ°ç»å
ç´ åç»§ç»è°ç¨å
¶ä»çæ°ç»æ¹æ³ã
const arr = [1, 2, 3, 4, 5];
console.log(arr.with(2, 6).map((x) => x ** 2)); // [1, 4, 36, 16, 25]
å¨ç¨çæ°ç»ä¸ä½¿ç¨ with()
with() æ¹æ³æ»ä¼å建ä¸ä¸ªå¯éæ°ç»ã
const arr = [1, , 3, 4, , 6];
console.log(arr.with(0, 2)); // [2, undefined, 3, 4, undefined, 6]
å¨éæ°ç»å¯¹è±¡ä¸è°ç¨ with()
with() æ¹æ³å建并è¿åä¸ä¸ªæ°æ°ç»ãå®è¯»å this ç length 屿§ï¼ç¶å访é®å
¶é®æ¯å°äº length çéè´æ´æ°çæ¯ä¸ªå±æ§ãå½ this çæ¯ä¸ªå±æ§è¢«è®¿é®åï¼ç´¢å¼çäºè¯¥å±æ§çé®çæ°ç»å
ç´ è¢«è®¾ç½®ä¸ºè¯¥å±æ§çå¼ãæåï¼å° index çæ°ç»å¼è®¾ç½®ä¸º valueã
const arrayLike = {
length: 3,
unrelated: "foo",
0: 5,
2: 4,
3: 3, // ç±äº length 屿§çå¼ä¸º 3ï¼with() ä¼å¿½ç¥è¯¥å¼
};
console.log(Array.prototype.with.call(arrayLike, 0, 1));
// [ 1, undefined, 4 ]
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-array.prototype.with> |