簡體   English   中英

數組項的長度應該是未定義的,但是在調試器中它有一個值

[英]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.

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