Web/JavaScript/Reference/Global objects/Array/copyWithin
The copyWithin() method shallow copies part of an array to another location in the same array and returns it without modifying its length.
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
Syntax
arr.copyWithin(target[, start[, end]])
Parameters
target- Zero-based index at which to copy the sequence to. If negative,
targetwill be counted from the end. - If
targetis at or greater thanarr.length, nothing will be copied. Iftargetis positioned afterstart, the copied sequence will be trimmed to fitarr.length. startOptional- Zero-based index at which to start copying elements from. If negative,
startwill be counted from the end. - If
startis omitted,copyWithinwill copy from index0. endOptional- Zero-based index at which to end copying elements from.
copyWithincopies up to but not includingend. If negative,endwill be counted from the end. - If
endis omitted,copyWithinwill copy until the last index (default toarr.length).
Return value
The modified array.
Description
The copyWithin works like C and C++'s memmove, and is a high-performance method to shift the data of an Array. This especially applies to the TypedArray method of the same name. The sequence is copied and pasted as one operation; pasted sequence will have the copied values even when the copy and paste region overlap.
The copyWithin function is intentionally generic, it does not require that its this value be an Array object.
The copyWithin method is a mutable method. It does not alter the length of this, but it will change its content and create new properties, if necessary.
Polyfill
if (!Array.prototype.copyWithin) {
Object.defineProperty(Array.prototype, 'copyWithin', {
value: function(target, start/*, end*/) {
// Steps 1-2.
if (this == null) {
throw new TypeError('this is null or not defined');
}
var O = Object(this);
// Steps 3-5.
var len = O.length >>> 0;
// Steps 6-8.
var relativeTarget = target >> 0;
var to = relativeTarget < 0 ?
Math.max(len + relativeTarget, 0) :
Math.min(relativeTarget, len);
// Steps 9-11.
var relativeStart = start >> 0;
var from = relativeStart < 0 ?
Math.max(len + relativeStart, 0) :
Math.min(relativeStart, len);
// Steps 12-14.
var end = arguments[2];
var relativeEnd = end === undefined ? len : end >> 0;
var final = relativeEnd < 0 ?
Math.max(len + relativeEnd, 0) :
Math.min(relativeEnd, len);
// Step 15.
var count = Math.min(final - from, len - to);
// Steps 16-17.
var direction = 1;
if (from < to && to < (from + count)) {
direction = -1;
from += count - 1;
to += count - 1;
}
// Step 18.
while (count > 0) {
if (from in O) {
O[to] = O[from];
} else {
delete O[to];
}
from += direction;
to += direction;
count--;
}
// Step 19.
return O;
},
configurable: true,
writable: true
});
}
Examples
Using copyWithin
[1, 2, 3, 4, 5].copyWithin(-2)
// [1, 2, 3, 1, 2]
[1, 2, 3, 4, 5].copyWithin(0, 3)
// [4, 5, 3, 4, 5]
[1, 2, 3, 4, 5].copyWithin(0, 3, 4)
// [4, 2, 3, 4, 5]
[1, 2, 3, 4, 5].copyWithin(-2, -3, -1)
// [1, 2, 3, 3, 4]
[].copyWithin.call({length: 5, 3: 1}, 0, 3)
// {0: 1, 3: 1, length: 5}
// ES2015 Typed Arrays are subclasses of Array
var i32a = new Int32Array([1, 2, 3, 4, 5])
i32a.copyWithin(0, 2)
// Int32Array [3, 4, 5, 4, 5]
// On platforms that are not yet ES2015 compliant:
[].copyWithin.call(new Int32Array([1, 2, 3, 4, 5]), 0, 3, 4);
// Int32Array [4, 2, 3, 4, 5]
Specifications
| Specification |
| ECMAScript (ECMA-262)The definition of 'Array.prototype.copyWithin' in that specification. |
Browser compatibility
The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.
Update compatibility data on GitHub
| Desktop | Mobile | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
copyWithin
|
Chrome
Full support 45 |
Edge
Full support 12 |
Firefox
Full support 32 |
IE
No support No |
Opera
Full support 32 |
Safari
Full support 9 |
WebView Android
Full support 45 |
Chrome Android
Full support 45 |
Firefox Android
Full support 32 |
Opera Android
Full support 32 |
Safari iOS
Full support 9 |
Samsung Internet Android
Full support 5.0 |
nodejs
Full support 4.0.0 |
Legend
- Full support
- Full support
- No support
- No support
See also
Array.prototype.copyWithin() by Mozilla Contributors is licensed under CC-BY-SA 2.5.