簡體   English   中英

創建數組並將其推入一行

[英]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');

資料來源: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_nullish_assignment

2021 更新

@zzzzBov 的有用回答

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

可以使用新的||=運算符進一步簡化, 邏輯 OR 賦值1

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

1參見tcs39/proposal-logical-assignment ,目前處於4階段主要瀏覽器支持

您可以使用.concat而不是.push ,因為.concat返回數組而.push返回數組的長度。

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

這樣代碼更容易閱讀和理解。


帶有新||=運算符的較短版本:(雖然可能稍微難以閱讀)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM