gpt4 book ai didi

javascript - 那个 js 表达式安全吗 : if( ! x || doSomething( x[prop], y[prop] ) === false )

转载 作者:行者123 更新时间:2023-11-30 08:33:40 26 4
gpt4 key购买 nike

根据错误报告,我认为如果 x 为空,以下表达式可能会抛出异常:

if ( !x || doSomething( x[prop], y[prop] ) === false )

异常(exception)是:

Cannot read property 'prop' of null

... 就好像 || 的右边即使左侧为真,也会进行评估。javascript reference似乎表明那不应该发生,但我不确定。我已经测试过只写 x = null 不会(总是)崩溃,但是否保证在每个 JS 引擎上都如此?

编辑:

关于同样的问题

if( x && foo( x[prop] ) === true && bar() === false )

一种表达方式是:

如果(a && b && c)

... 如果 a === false 则计算 b 或 c?该文档不清楚这种情况,仅适用于“a && ( expr1 && expr2 )”,而不是“a && expr1 && expr2”

完整代码片段

var x = null;
var y = {
"p1": "p1",
"p2": "p2"
};

function f() {
return true;
}

for (var propName in y) {

if (x && f(y[propName]) === true && f(y[propName]) === false) {
doSomething(x[propName], y[propName]);
} else if (!x || f(x[propName], y[propName]) === false) {
console.log(y[propName]);
}
}

EDIT2:为了完整性,在浏览器中运行的真实(最小化)代码

  function a(c, b, e, f) {

for (var d in b) {
if (c && _.isObject(b[d]) === true && _.isArray(b[d]) === false) {
a(c[d], b[d], e, d + ".")
} else {
if (!c || _.isEqual(c[d], b[d]) === false) {
e.push({
name: f + d,
value: b[d]
})
}
}
}
return e
}

最佳答案

Javascript || 运算符短路。右侧不会评估左侧是否为 true。这是运算符的基本属性,应该在所有引擎中平等实现。

因此,右侧只会评估 x 是否为 truthy,并且 Javascript 中的所有 truthy 值都应该是可订阅的,不会出错。

话虽如此,y 在此示例中是完全未知的,可能会引发错误。

关于javascript - 那个 js 表达式安全吗 : if( ! x || doSomething( x[prop], y[prop] ) === false ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34358276/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com