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