Создайте массив и вставьте его в одну строку
Ниже приведен только теоретический вопрос JavaScript. Мне интересно, может ли следующее преобразование в один оператор:
if(!window.foo){
window.foo = [];
}
window.foo.push('bar');
каждый, вероятно, ранее писал этот код, но может ли он быть выполнен в одной строке?
Сначала я подумал, что что-то вроде этого будет работать:
(window.foo || window.foo = []).push('bar');
но это не работает из-за недопустимого назначения. Затем я попытался связать что-то с нажатием, но это не работает, потому что push не возвращает массив.
Любые мысли о том, можно ли это сделать в простом JavaScript?
(результат должен быть таким, что window.foo = ['bar']
)
Ответы
Ответ 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