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 September 2015.
Phương thức copyWithin() của các instance Array sao chép nông một phần của mảng này sang vị trí khác trong cùng mảng đó và trả về mảng này mà không thay đổi độ dài của nó.
Try it
const array = ["a", "b", "c", "d", "e"];
// Copy to index 0 the element at index 3
console.log(array.copyWithin(0, 3, 4));
// Expected output: Array ["d", "b", "c", "d", "e"]
// Copy to index 1 all elements from index 3 to the end
console.log(array.copyWithin(1, 3));
// Expected output: Array ["d", "d", "e", "d", "e"]
Syntax
copyWithin(target, start)
copyWithin(target, start, end)
Parameters
target-
Chỉ số dựa trên 0 để sao chép chuỗi đến, được chuyển đổi thành số nguyên. Đây là vị trí mà phần tử tại
startsẽ được sao chép đến, và tất cả các phần tử giữastartvàendđược sao chép đến các chỉ số tiếp theo.- Chỉ số âm đếm ngược từ cuối mảng — nếu
-array.length <= target < 0, thìtarget + array.lengthđược dùng. - Nếu
target < -array.length, thì0được dùng. - Nếu
target >= array.length, thì không có gì được sao chép. - Nếu
targetnằm saustartsau khi chuẩn hóa, việc sao chép chỉ xảy ra đến cuốiarray.length(nói cách khác,copyWithin()không bao giờ mở rộng mảng).
- Chỉ số âm đếm ngược từ cuối mảng — nếu
start-
Chỉ số dựa trên 0 để bắt đầu sao chép phần tử, được chuyển đổi thành số nguyên.
- Chỉ số âm đếm ngược từ cuối mảng — nếu
-array.length <= start < 0, thìstart + array.lengthđược dùng. - Nếu
start < -array.length, thì0được dùng. - Nếu
start >= array.length, thì không có gì được sao chép.
- Chỉ số âm đếm ngược từ cuối mảng — nếu
endOptional-
Chỉ số dựa trên 0 để kết thúc việc sao chép phần tử, được chuyển đổi thành số nguyên.
copyWithin()sao chép đến nhưng không bao gồmend.- Chỉ số âm đếm ngược từ cuối mảng — nếu
-array.length <= end < 0, thìend + array.lengthđược dùng. - Nếu
end < -array.length, thì0được dùng. - Nếu
end >= array.lengthhoặcendbị bỏ qua hoặc làundefined, thìarray.lengthđược dùng, khiến tất cả các phần tử đến cuối được sao chép. - Nếu
endngụ ý một vị trí trước hoặc tại vị trí màstartngụ ý, thì không có gì được sao chép.
- Chỉ số âm đếm ngược từ cuối mảng — nếu
Return value
Mảng đã được sửa đổi.
Description
Phương thức copyWithin() hoạt động tương tự như memmove trong C và C++, và là một phương thức hiệu năng cao để dịch chuyển dữ liệu của một Array. Điều này đặc biệt áp dụng cho phương thức TypedArray cùng tên. Chuỗi được sao chép và dán như một thao tác; chuỗi được dán sẽ có các giá trị đã sao chép ngay cả khi vùng sao chép và dán chồng lên nhau.
Vì undefined trở thành 0 khi được chuyển đổi thành số nguyên, việc bỏ qua tham số start có cùng tác dụng như truyền 0, là sao chép toàn bộ mảng đến vị trí đích, tương đương với việc dịch phải trong đó phần bên phải bị cắt bỏ và phần bên trái được nhân đôi. Hành vi này có thể gây nhầm lẫn cho người đọc code của bạn, vì vậy bạn nên truyền 0 rõ ràng cho start.
console.log([1, 2, 3, 4, 5].copyWithin(2));
// [1, 2, 1, 2, 3]; move all elements to the right by 2 positions
Phương thức copyWithin() là một mutating method. Nó không thay đổi độ dài của this, nhưng sẽ thay đổi nội dung của this và tạo các thuộc tính mới hoặc xóa các thuộc tính hiện có nếu cần thiết.
Phương thức copyWithin() bảo toàn các slot rỗng. Nếu vùng cần sao chép là mảng thưa (sparse), các chỉ số mới tương ứng với slot rỗng sẽ bị xóa và cũng trở thành slot rỗng.
Phương thức copyWithin() là generic. Nó chỉ yêu cầu giá trị this có thuộc tính length và các thuộc tính có khóa là số nguyên. Mặc dù chuỗi cũng giống mảng, phương thức này không phù hợp để áp dụng lên chúng vì chuỗi là bất biến.
Examples
>Dùng 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]
Dùng copyWithin() trên mảng thưa
copyWithin() sẽ truyền lan các slot rỗng.
console.log([1, , 3].copyWithin(2, 1, 2)); // [1, empty, empty]
Gọi copyWithin() trên các đối tượng không phải mảng
Phương thức copyWithin() đọc thuộc tính length của this và sau đó thao tác với các chỉ số số nguyên liên quan.
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 }
// The '3' property is deleted because the copied source is an empty slot
Specifications
| Thông số kỹ thuật |
|---|
| ECMAScript® 2027 Language Specification> # sec-array.prototype.copywithin> |