[英]The length of an item of an array should be undefined however in debugger it has a value
這是將數組細分為更小的塊的解決方案。 該解決方案在數組項上使用長度屬性,這對我來說沒有意義,因為它應該是未定義的; 但是,該解決方案確實有效,當我使用調試器在 chrome 開發工具中將它作為片段運行時,它確實顯示了一個值,我只是不確定它是如何工作的。 我無法解釋為什么last.length
有任何價值。 有人可以解釋為什么這有效,為什么我不能為它的 console.log 記錄一個值?
const chunk = (arr, size) => {
let newArr = []
for (let el of arr) {
let last = newArr[newArr.length -1]
console.log(last, 'i am last')
if(!last || last.length === size) {
newArr.push([el])
} else {
last.push(el)
}
}
return newArr
}
// chunk([1, 2, 3, 4, 5], 2) --> [[ 1, 2], [3, 4], [5]]
您可以將last
的聲明移到循環之外,並防止每個項目都對newArr
進行新的訪問。
const chunk = (arr, size) => { let newArr = []; let last; for (let el of arr) { if (!last || last.length === size) { last = []; newArr.push(last); } last.push(el); } return newArr } console.log(chunk([1, 2, 3, 4, 5], 2));
TLDR:當last
未定義時,此表達式
(!last || last.length === size)
仍然評估為真。 請閱讀以獲得更多詳情。
在循環的第一次迭代中,會發生以下分配:
let last = newArr[-1];
因此,last 被分配為undefined
作為一個值。
隨后的聲明:
if(!last || last.length === size) {
!last
計算結果為 true,因為這就是!undefined
計算結果。
由於!last
為真, last.length
根本不被評估。 因此,不會引發異常,因為沒有實際嘗試評估本質上undefined.length
。長度 這是大多數流行的編程語言的一個特性,稱為布爾短路。 一旦 OR 表達式的第一部分計算結果為真,則不會計算其右側的任何內容。 當左表達式的計算結果為 false 時,同樣的原則適用於 AND 語句。
這會觸發下一行:
newArr.push([el])
這給了數組一個有效的元素。 因此newArr.size
現在是 1。
在循環的后續迭代中, last 被正確分配到newArr
的最后一個元素。
Nina Scholz 建議的一個變體,只是完全擺脫了undefined
-magic:
const chunk = (arr, size) => { let last = []; let newArr = [last]; for (let el of arr) { if (last.length === size) { last = []; newArr.push(last); } last.push(el); } return newArr } console.log(chunk([1, 2, 3, 4, 5], 2));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.