[英]Create array and push into it in one line
下面只是一道理論上的JavaScript題。 我很好奇以下內容是否可以轉換為單個語句:
if(!window.foo){
window.foo = [];
}
window.foo.push('bar');
這段代碼大家應該都寫過,但是能不能一行完成呢?
起初我認為這樣的事情會起作用:
(window.foo || window.foo = []).push('bar');
但這不起作用,因為分配無效。 接下來我嘗試在推送時鏈接一些東西,但這不起作用,因為推送不返回數組。
關於這是否可以在普通 JavaScript 中完成的任何想法?
(結果應該是window.foo = ['bar']
)
你的作業倒退了*。 它應該是:
(window.foo = window.foo || []).push('bar');
||
JavaScript中的運算符不返回布爾值。 如果左側為真,則返回左側,否則返回右側。
a = a || [];
相當於
a = a ? a : [];
因此,編寫上述內容的另一種方法是:
(window.foo = window.foo ? window.foo : []).push('bar');
* 詳情見評論
如果您添加括號,您的代碼就可以正常工作,以便它按照您的意圖執行:
(window.foo || (window.foo = [])).push('bar');
沒有括號,它認為它應該評估window.foo || window.foo
window.foo || window.foo
首先,然后將數組分配給那個結果,這是不可能的。
這個問題讓我玩了不同的選擇來獲得樂趣。 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
最短的方法是使用Logical Nullish Assignment :
(window.foo ??= []).push('bar');
您可以使用.concat
而不是.push
,因為.concat
返回數組而.push
返回數組的長度。
window.foo = (window.foo || []).concat('bar');
這樣代碼更容易閱讀和理解。
帶有新||=
運算符的較短版本:(雖然可能稍微難以閱讀)
window.foo ||= [].concat('bar');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.