--- title: Array.prototype.slice() slug: Web/JavaScript/Reference/Global_Objects/Array/slice tags: - Array - JavaScript - Масив - метод translation_of: Web/JavaScript/Reference/Global_Objects/Array/slice ---
Метод slice()
повертає дрібну копію частини масиву у новий масив, починаючи з begin
і до end
(не включаючи end
), де begin
та end
є індексами елементів масиву. Початковий масив не змінюється.
The source for this interactive demo is stored in a GitHub repository. If you'd like to contribute to the interactive demo project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
arr.slice([begin[, end]])
begin
{{optional_inline}}slice(-2)
копіює останні два елементи послідовності.begin
не надано, slice
починається з індексу 0
.begin
більший за довжину послідовності, повертається порожній масив.end
{{optional_inline}}slice
копіює до, але не включаючи end
.slice(1,4)
копіює з другого по четвертий елемент (елементи за індексами 1, 2 та 3).slice(2,-1)
копіює з третього елемента по другий з кінця.end
пропущений, slice
копіює до кінця послідовності (arr.length
).end
більший за довжину послідовності, slice
копіює до кінця послідовності (arr.length
).Новий масив, який містить скопійовані елементи.
slice
не змінює початковий масив. Він повертає дрібну копію елементів початкового масиву. Елементи початкового масиву копіюються у повернений масив наступним чином:
slice
копіює посилання на об'єкт у новий масив. І початковий, і новий масиви посилатимуться на той самий об'єкт. Якщо цей об'єкт зміниться, зміни відобразяться у обох масивах, новому та початковому.slice
копіює значення у новий масив. Зміни у рядках, числах або булевих значеннях одного масиву не відображатимуться у іншому масиві.Якщо новий елемент додано у якийсь з масивів, інший масив не зміниться.
var fruits = ['Банан', 'Апельсин', 'Лимон', 'Яблуко', 'Манго']; var citrus = fruits.slice(1, 3); // fruits містить ['Банан', 'Апельсин', 'Лимон', 'Яблуко', 'Манго'] // citrus містить ['Апельсин','Лимон']
slice
У наступному прикладі slice
створює новий масив newCar
з myCar
. Обидва містять посилання на об'єкт myHonda
. Коли колір myHonda
змінюється на фіолетовий, обидва масиви відображають зміну.
// Використання slice, створення newCar з myCar. var myHonda = { color: 'червоний', wheels: 4, engine: { cylinders: 4, size: 2.2 } }; var myCar = [myHonda, 2, 'чудовий стан', 'придбана 1997']; var newCar = myCar.slice(0, 2); // Вивести значення myCar, newCar та колір myHonda // з обох масивів. console.log('myCar = ' + JSON.stringify(myCar)); console.log('newCar = ' + JSON.stringify(newCar)); console.log('myCar[0].color = ' + myCar[0].color); console.log('newCar[0].color = ' + newCar[0].color); // Змінити колір myHonda. myHonda.color = 'фіолетовий'; console.log('Новий колір Honda ' + myHonda.color); // Вивести колір myHonda з обох масивів. console.log('myCar[0].color = ' + myCar[0].color); console.log('newCar[0].color = ' + newCar[0].color);
Скрипт запише:
myCar = [{color: 'червоний', wheels: 4, engine: {cylinders: 4, size: 2.2}}, 2, 'чудовий стан', 'придбана 1997'] newCar = [{color: 'червоний', wheels: 4, engine: {cylinders: 4, size: 2.2}}, 2] myCar[0].color = червоний newCar[0].color = червоний Новий колір Honda фіолетовий myCar[0].color = фіолетовий newCar[0].color = фіолетовий
Метод slice
також може перетворювати подібні до масиву об'єкти/колекції на нові об'єкти Array. Ви просто прив'язуєте метод до об'єкта. {{jsxref("Functions/arguments", "Аргументи")}} всередині функції є прикладом подібного до масиву об'єкта.
function list() { return Array.prototype.slice.call(arguments); } var list1 = list(1, 2, 3); // [1, 2, 3]
Прив'язати можна функцією .call
з {{jsxref("Function.prototype")}}, також можна скоротити запис, використовуючи [].slice.call(arguments)
замість Array.prototype.slice.call
. В будь-якому випадку, все можна спростити за допомогою {{jsxref("Function.prototype.bind", "bind")}}.
var unboundSlice = Array.prototype.slice; var slice = Function.prototype.call.bind(unboundSlice); function list() { return slice(arguments); } var list1 = list(1, 2, 3); // [1, 2, 3]
Хоча об'єкти середовища виконання (такі як об'єкти DOM) за специфікацією не зобов'язані відповідати поведінці Mozilla при перетворенні методом Array.prototype.slice
, і IE < 9 цього не робить, версії IE починаючи від 9-ї дозволяють це. Використання шима дозволяє створити надійну кросбраузерну поведінку. Поки інші сучасні переглядачі підтримують цю можливість, як нині роблять IE, Mozilla, Chrome, Safari та Opera, розробники, які читають (підтримують для об'єктів DOM) slice-код, що покладається на цей шим, не будуть введені в оману семантикою; вони спокійно можуть покладатися на семантику, щоб реалізувати тепер вже де-факто стандартну поведінку. (Шим також виправляє роботу IE з другим аргументом slice()
, коли він явно заданий як {{jsxref("null")}}/{{jsxref("undefined")}}, чого більш ранні версії IE також не дозволяли, але всі сучасні переглядачі, в тому числі IE >= 9, зараз дозволяють.)
/** * Шим для "виправлення" слабкої підтримки IE (IE < 9) використання slice * на об'єктах середовища, таких як NamedNodeMap, NodeList та HTMLCollection * (технічно, оскільки об'єкти середовища були залежні від реалізації, * принаймні до ES2015, IE не мав потреби у цій функціональності.) * Також працює для рядків, виправляє IE < 9, дозволяючи явно задане значення * undefined другим аргументом (як у Firefox) та запобігає помилкам * при виклику на інших об'єктах DOM. */ (function () { 'use strict'; var _slice = Array.prototype.slice; try { // Не можна використовувати з елементами DOM у IE < 9 _slice.call(document.documentElement); } catch (e) { // Не працює у IE < 9 // Працюватиме для справжніх масивів, подібних до масивів об'єктів, // NamedNodeMap (атрибутів, сутностей, нотацій), // NodeList (напр., getElementsByTagName), HTMLCollection (напр., childNodes), // і не схибить на інших об'єктах DOM (як на елементах DOM у IE < 9) Array.prototype.slice = function(begin, end) { // IE < 9 не любить undefined в якості аргументу end end = (typeof end !== 'undefined') ? end : this.length; // Для об'єктів Array використовуємо рідну функцію slice if (Object.prototype.toString.call(this) === '[object Array]'){ return _slice.call(this, begin, end); } // Для подібних до масивів об'єктів робимо це самостійно. var i, cloned = [], size, len = this.length; // Обробляємо від'ємне значення "begin" var start = begin || 0; start = (start >= 0) ? start : Math.max(0, len + start); // Обробляємо від'ємне значення "end" var upTo = (typeof end == 'number') ? Math.min(end, len) : len; if (end < 0) { upTo = len + end; } // Очікуваний розмір нового масиву size = upTo - start; if (size > 0) { cloned = new Array(size); if (this.charAt) { for (i = 0; i < size; i++) { cloned[i] = this.charAt(start + i); } } else { for (i = 0; i < size; i++) { cloned[i] = this[start + i]; } } } return cloned; }; } }());
Специфікація | Статус | Коментар |
---|---|---|
{{SpecName('ESDraft', '#sec-array.prototype.slice', 'Array.prototype.slice')}} | {{Spec2('ESDraft')}} | |
{{SpecName('ES6', '#sec-array.prototype.slice', 'Array.prototype.slice')}} | {{Spec2('ES6')}} | |
{{SpecName('ES5.1', '#sec-15.4.4.10', 'Array.prototype.slice')}} | {{Spec2('ES5.1')}} | |
{{SpecName('ES3')}} | {{Spec2('ES3')}} | Початкове визначення. Реалізовано у JavaScript 1.2. |
{{Compat("javascript.builtins.Array.slice")}}