Array.prototype.copyWithin()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since 2015å¹´9æ.
Array 實é«ç copyWithin() æ¹æ³æå°é£åä¸çé¨åå
ç´ é²è¡æ·ºè¤è£½ï¼ä¸¦å°å
¶æ¾ç½®æ¼é£åå
§çå¦ä¸åä½ç½®ï¼åæè¿å該é£åï¼ä½ä¸æ¹è®å
¶é·åº¦ã
å試ä¸ä¸
const array1 = ["a", "b", "c", "d", "e"];
// å°ç´¢å¼ 3 çå
ç´ è¤è£½å°ç´¢å¼ 0
console.log(array1.copyWithin(0, 3, 4));
// é æè¼¸åºï¼Array ["d", "b", "c", "d", "e"]
// å°ç´¢å¼ 3 å°çµå°¾çææå
ç´ è¤è£½å°ç´¢å¼ 1
console.log(array1.copyWithin(1, 3));
// é æè¼¸åºï¼Array ["d", "d", "e", "d", "e"]
èªæ³
copyWithin(target, start)
copyWithin(target, start, end)
忏
target-
è¦è¤è£½åºåè³ç以é¶çºåºåºçç´¢å¼ï¼æè½æçºæ´æ¸ãéå°æå°
startä½ç½®çå ç´ å°è¢«è¤è£½è³targetï¼èstartåendä¹éçææå ç´ æä¾åºè¤è£½è³å¾çºç´¢å¼ã- è² æ¸ç´¢å¼æå¾é£åæ«å°¾éå§è¨ç® â è¥
-array.length <= target < 0ï¼å使ç¨target + array.lengthã - è¥
target < -array.lengthï¼å使ç¨0ã - è¥
target >= array.lengthï¼å䏿è¤è£½ä»»ä½å §å®¹ã - è¥
target卿£è¦åå¾ä½æ¼startä¹å¾ï¼ååªæè¤è£½è³array.lengthçµå°¾ï¼æå¥è©±èªªï¼copyWithin()䏿æ´å±é£åï¼ã
- è² æ¸ç´¢å¼æå¾é£åæ«å°¾éå§è¨ç® â è¥
start-
è¦éå§è¤è£½å ç´ ç以é¶çºåºåºçç´¢å¼ï¼æè½æçºæ´æ¸ã
- è² æ¸ç´¢å¼æå¾é£åæ«å°¾éå§è¨ç® â è¥
-array.length <= start < 0ï¼å使ç¨start + array.lengthã - è¥
start < -array.lengthï¼å使ç¨0ã - è¥
start >= array.lengthï¼å䏿è¤è£½ä»»ä½å §å®¹ã
- è² æ¸ç´¢å¼æå¾é£åæ«å°¾éå§è¨ç® â è¥
end鏿æ§-
è¦çµæè¤è£½å ç´ ç以é¶çºåºåºçç´¢å¼ï¼æè½æçºæ´æ¸ã
copyWithin()æè¤è£½è³endä¹åçå ç´ ï¼ä½ä¸å å«endã- è² æ¸ç´¢å¼æå¾é£åæ«å°¾éå§è¨ç® â è¥
-array.length <= end < 0ï¼å使ç¨end + array.lengthã - è¥
end < -array.lengthï¼å使ç¨0ã - è¥
end >= array.lengthæendæªæä¾æçºundefinedï¼å使ç¨array.lengthï¼ä½¿å ¶è¤è£½è³çµå°¾ã - è¥
endæå°æçä½ç½®å¨startæå°æçä½ç½®ä¹åæç¸åï¼å䏿è¤è£½ä»»ä½å §å®¹ã
- è² æ¸ç´¢å¼æå¾é£åæ«å°¾éå§è¨ç® â è¥
åå³å¼
被修æ¹çé£åã
æè¿°
copyWithin() æ¹æ³é¡ä¼¼æ¼ C å C++ ç memmoveï¼å®æ¯ä¸ç¨®é«æè½çæ¹æ³ï¼å¯ç¨ä¾ç§»å Array çè³æãéå¨ TypedArray æ¹æ³ä¸å°¤å
¶é©ç¨ãè©²æ¹æ³æå°é¸å®çåºå䏿¬¡æ§è¤è£½ä¸¦è²¼ä¸ï¼å³ä½¿è¤è£½ååèè²¼ä¸ååéçï¼è²¼ä¸çåºåä»ç¶æä¿çå·²è¤è£½çå¼ã
ç±æ¼ undefined è½æçºæ´æ¸ææè®çº 0ï¼å æ¤çç¥ start åæ¸çææèå³å
¥ 0 ç¸åï¼éæå°è´æ´åé£å被è¤è£½å°ç®æ¨ä½ç½®ï¼ç¸ç¶æ¼åå³ä½ç§»ï¼ä¸¦è£åªå³éçãéè¤å·¦éçãæ¤è¡çºå¯è½æè®ä½ çç¨å¼ç¢¼è®è
æå°å°æï¼å æ¤å»ºè°é¡¯å¼å³å
¥ 0 ä½çº startã
console.log([1, 2, 3, 4, 5].copyWithin(2));
// [1, 2, 1, 2, 3]ï¼å°ææå
ç´ åå³ç§»å 2 åä½ç½®
copyWithin() æ¹æ³æ¯ä¸åå¯è®ç°æ¹æ³ãå®ä¸ææ¹è® this çé·åº¦ï¼ä½ææ¹è® this çå
§å®¹ï¼ä¸¦å¨å¿
è¦ææ°å¢æåªé¤å±¬æ§ã
copyWithin() æ¹æ³æä¿ç空槽ãå¦æè¢«è¤è£½çå忝ç¨çé£åï¼åç©ºæ§½å°æçæ°ç´¢å¼æè¢«åªé¤ï¼ä¸¦ä»ç¶çºç©ºæ§½ã
copyWithin() æ¹æ³æ¯éç¨çãå®åªè¦æ± this å
·æ length 屬æ§åæ´æ¸éµå±¬æ§ãéç¶å串ä¹é¡ä¼¼é£åï¼ä½æ¤æ¹æ³ä¸é©ç¨æ¼å串ï¼å çºå串æ¯ä¸å¯è®çã
ç¯ä¾
>ä½¿ç¨ copyWithin()
console.log([1, 2, 3, 4, 5].copyWithin(0, 3));
// [4, 5, 3, 4, 5]
console.log([1, 2, 3, 4, 5].copyWithin(0, 3, 4));
// [4, 2, 3, 4, 5]
console.log([1, 2, 3, 4, 5].copyWithin(-2, -3, -1));
// [1, 2, 3, 3, 4]
å¨ç¨çé£åä¸ä½¿ç¨ copyWithin()
copyWithin() æå³æç©ºæ§½ã
console.log([1, , 3].copyWithin(2, 1, 2)); // [1, empty, empty]
å¨éé£åç©ä»¶ä¸èª¿ç¨ copyWithin()
copyWithin() æ¹æ³æè®å this ç length 屬æ§ï¼ä¸¦æä½å
¶ä¸çæ´æ¸ç´¢å¼ã
const arrayLike = {
length: 5,
3: 1,
};
console.log(Array.prototype.copyWithin.call(arrayLike, 0, 3));
// { '0': 1, '3': 1, length: 5 }
console.log(Array.prototype.copyWithin.call(arrayLike, 3, 1));
// { '0': 1, length: 5 }
// 屬æ§ã3ã被åªé¤ï¼å çºè¤è£½ä¾æºæ¯ç©ºæ§½
è¦ç¯
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-array.prototype.copywithin> |