[英]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 處未定義的屬性“對象”
它的意思是“被調用者”中的“對象”。 expression
和callee
都是未定義的。 一旦我跨過條件節點就會崩潰。
編輯
我認為 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.