2016-03-18 3 views
8

Я не понимаю, что именно делает ....Что означает обозначение «...» (тройная точка) в массивах?

Я попытался простой пример с Вавилонской, чтобы понять это (view the example), но мне кажется, что:

ES6 синтаксис

let myArray = [1, 2, 3, ...18]; 

console.log(myArray); // [1, 2, 3] 
console.log(myArray[4]);// undefined 
console.log(myArray.length); // 3 

такое же, как этот ES5 синтаксис:

"use strict"; 

function _toConsumableArray(arr) { 
    if (Array.isArray(arr)) { 
     for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { 
      arr2[i] = arr[i]; 
     } 
     return arr2; 
    } else { 
     return Array.from(arr); 
    } 
} 

var myArray = [1, 2, 3].concat(_toConsumableArray(18)); 

console.log(myArray); // [1, 2, 3] 
console.log(myArray[4]); // undefined 
console.log(myArray.length); // 3 

НО: Что делает этот код? Поскольку выход (console.log) такая же, как в этом коде (ES5):

var myArray = [1,2,3]; 

console.log(myArray); // [1, 2, 3] 
console.log(myArray[4]);// undefined 
console.log(myArray.length); // 3 

Что делает ...18 обозначения означают?

+0

Нет ничего, поскольку оператор с расширением _spread не работает с числами. Возможно, вы хотите '... '18'', который является'' 1 ',' 8'' –

+0

@WashingtonGuedes Or '... [18]'! –

+0

Что вы ожидали от этого кода? (И почему ...) – Amit

ответ

11

... (spread operator) работает, возвращая каждое значение из индекса 0 к индексу length-1:

В качестве примера:

[...'18'] // returns ['1', '8'] 

который был бы таким же, как:

['18'[0], '18'[1]] 

Теперь, чтобы получить rray от 1 к 18, вы можете сделать это:

[...Array(19).keys()].slice(1) 

Или это с картой:

[...Array(18)].map(_=>i++,i=1) 

Надеется, что это помогает.

+2

Это совершенно неуместно (на мой взгляд). OP хочет понять '...', а не создать массив от 1 до 18 – Amit

+0

Ну, моя цель - понять новый (для меня) синтаксис ES6, а не делать это, но спасибо вам. Ну, если я наконец сделаю это со строками 'let myArray = ['1', '2', '3', ... '18'];' почему консольный журнал теперь '[" 1 "," 2 " , "3", "1", "8"] '? –

+0

@AralRoca. Поскольку '' 18'' имеет индекс '0' и' 1', он возвращает каждое значение в своих позициях в качестве параметров –

1

Выражение [1, 2, 3, ...18] недействительно.

Вы не можете использовать ... с Number. Вы можете использовать только ... с истребимым объектом, например Array, String или Object.

Интересно отметить, что Tracur - другой transpiler - выдает ошибку при подаче того же кода:

TypeError: Не может распространяться без итерации объекта.

Я не близок с specification, но я думаю, что это может быть Babel «ошибка».

+0

перечислимый с '.length' правильно? Строка, массив. И что именно ... делаете именно в этом случае? спасибо :) –

Смежные вопросы