интересная проблема с методами цепочки массива и push - PullRequest
2 голосов
/ 07 октября 2011

Ранее возился с некоторыми элементами массива и обнаружил очень своеобразную оговорку

рассмотрите этот код:

[1,2,3].map(function(el) { return el * 2}).push(4*2).join(" ");

При написании я ожидал получить: 2, 4, 6, 8

вместо этого он выдал исключение. при дальнейших исследованиях .push возвращает скорректированный .length переданного массива:

[1,2,3].map(function(el) { return el * 2}).push(4*2);
>>> 4

[1,2,3,4].map(function(el) { return el * 2}).push("hi");
>>> 5

, а typeof - число, поэтому .join выбрасывает, поскольку его нет в прото числа.

кажется, что вы можете передавать / цепочку любые другие методы массива, но не push. хотя это не проблема, и это работает, если вы передаете результат в переменную, почему происходит разбиение как есть и почему здесь возвращается свойство length?

это отлично работает ...

var foo = [1,2,3,4].map(function(el) { return el * 2});
foo.push(5*2);
console.log(foo); 
>>> [2, 4, 6, 8, 10]; 

вероятно, еще один важный момент ...

1 Ответ

3 голосов
/ 07 октября 2011

Почему здесь возвращается свойство length?

Это определено в спецификации :

Аргументы добавляются в конец массива в порядке их появления. Новая длина массива возвращается как результат вызова.

Почему ломается как есть?

Ну, вы уже ответили на это сами: .push возвращает новую длину, а .join не определено для чисел.

...