Подтвердить что ты не робот

Создайте массив и вставьте его в одну строку

Ниже приведен только теоретический вопрос JavaScript. Мне интересно, может ли следующее преобразование в один оператор:

if(!window.foo){
  window.foo = [];
}
window.foo.push('bar');

каждый, вероятно, ранее писал этот код, но может ли он быть выполнен в одной строке?
Сначала я подумал, что что-то вроде этого будет работать:

(window.foo || window.foo = []).push('bar');

но это не работает из-за недопустимого назначения. Затем я попытался связать что-то с нажатием, но это не работает, потому что push не возвращает массив.

Любые мысли о том, можно ли это сделать в простом JavaScript?
(результат должен быть таким, что window.foo = ['bar'])

4b9b3361

Ответ 1

У вас есть задание назад *. Это должно быть:

(window.foo = window.foo || []).push('bar');

Оператор || в JavaScript не возвращает логическое значение. Если левая сторона является правдивой, она возвращает левую сторону, иначе она возвращает правую сторону.

a = a || [];

эквивалентно

a = a ? a : [];

Таким образом, альтернативный способ написания выше:

(window.foo = window.foo ? window.foo : []).push('bar');

* см. комментарии для деталей

Ответ 2

Ваш код работает очень хорошо, если вы добавляете круглые скобки, чтобы он делал то, что вы намеревались:

(window.foo || (window.foo = [])).push('bar');

Без круглых скобок он думает, что сначала должен оценивать window.foo || window.foo, а затем назначать массив на результат этого, что невозможно.

Ответ 3

Этот вопрос заставил меня играть с различными вариантами развлечений. Это слишком плохо. push возвращает длину вместо исходной ссылки на массив, но для более коротких выражений может быть полезно иметь что-то, что можно сразу же повторить, отобразить и т.д.

window.foo = (window.foo||[]).concat(['bar']); // always returns array, allowing:
(window.foo = (window.foo||[]).concat(['bar'])).forEach( ... )

(window.foo = window.foo||[]).push('bar'); // always returns length

window.foo && window.foo.push('bar') || (window.foo = ['bar']); // playing around