簡體   English   中英

為什么這個 && 不會短路?

[英]Why does this && not short-circuit?

此代碼來自節點模塊templatizer

if (i === 3 && node.type === "ExpressionStatement" && node.expression.callee.object.name === "buf" &&
       node.expression.arguments.length === 1 && node.expression.arguments[0].type === "Literal") {

       // save the simple string
       simpleString = node.expression.arguments[0].value;
       cnt++;
    }

node.type的值是 'VariableDeclaration' 所以邏輯表達式是假的,所以node.expression甚至不應該被評估,但它似乎是這樣......

類型錯誤:無法在 Array.forEach(本機)處讀取 /node_modules/templatizer/lib/simplifyTemplate.js:34:89 處未定義的屬性“對象”

它的意思是“被調用者”中的“對象”。 expressioncallee都是未定義的。 一旦我跨過條件節點就會崩潰。

編輯

我認為 Javascript 工作正常,也許一些異步代碼會導致調試器產生奇怪的結果。 如果我將 console.log 放在循環的頂部,它有時會提供有意義的輸出......

/usr/local/bin/node bin/www
count: 1
i:0
node.type: VariableDeclaration
expression: undefined
node.expression.callee: undefined

count: 2
i:1
node.type: VariableDeclaration
expression: undefined
node.expression.callee: undefined

count: 3
i:2
node.type: VariableDeclaration
expression: undefined
node.expression.callee: undefined

count: 4
i:3
node.type: ExpressionStatement
expression: [object Object]
node.expression.callee: [object Object]

count: 5
i:4
node.type: ReturnStatement
expression: undefined
node.expression.callee: undefined

count: 6
i:0
node.type: VariableDeclaration
expression: undefined
node.expression.callee: undefined

count: 7
i:1
node.type: VariableDeclaration
expression: undefined
node.expression.callee: undefined

count: 8
i:2
node.type: VariableDeclaration
expression: undefined
node.expression.callee: undefined

count: 9
i:3
node.type: ExpressionStatement
expression: [object Object]
node.expression.callee: undefined


/Users/ME/WebstormProjects/MySite/node_modules/templatizer/lib/simplifyTemplate.js:41
= 3 && node.type === "ExpressionStatement" && node.expression.callee.object.na
                                                                    ^
TypeError: Cannot read property 'object' of undefined
    at /Users/ME/WebstormProjects/MySite/node_modules/templatizer/lib/simplifyTemplate.js:41:89
    at Array.forEach (native)
    at module.exports (/Users/ME/WebstormProjects/MySite/node_modules/templatizer/lib/simplifyTemplate.js:15:18)
    at /Users/ME/WebstormProjects/MySite/node_modules/templatizer/templatizer.js:111:20
    at Array.forEach (native)
    at module.exports (/Users/ME/WebstormProjects/MySite/node_modules/templatizer/templatizer.js:95:15)
    at Object.<anonymous> (/Users/ME/WebstormProjects/MySite/app.js:23:1)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)

Process finished with exit code 8

所以看起來像是模塊中的一個錯誤。

似乎調試器顯示的值來自執行的不同部分,而不是導致崩潰的部分。 當然,它必須在某處異步運行。 所以是模塊中的一個錯誤。 臨時修復是為條件添加額外的檢查。

if (i === 3 && node.type === "ExpressionStatement" && node.expression.callee && node.expression.callee.object.name === "buf" &&
                node.expression.arguments.length === 1 && node.expression.arguments[0].type === "Literal") 

我打開了一個問題

暫無
暫無

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

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