随着 Typescript 3.7 的发布,现在支持Nullish Coalescing。但是,我似乎错误地使用了它.. 我有以下结构:type myType = { ["myKeys"]?: Array<string> }let data: myType;data = {};data["myKeys"] = ["index0"];console.log(data?.["myKeys"]?.indexOf("index0")) // 0 if (data?.["myKeys"]?.indexOf("index0") ?? -1 === -1) { // returns false} else { console.log("returns false");}data["myKeys"].push("index1")console.log(data?.["myKeys"]?.indexOf("index1")) // 1if (data?.["myKeys"]?.indexOf("index1") ?? -1 === -1) { // returns true - why? console.log("Why is it true"); }为什么??当索引为index1is1而索引为index0is时运算符的行为不同0。两者都应该返回 false,因为它是!== -1
2 回答
大话西游666
TA贡献1817条经验 获得超14个赞
这是一个优先级问题。您的代码被评估为:
if (data?.["myKeys"]?.indexOf("index1") ?? (-1 === -1)) {
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^−−−−−−−−−^
console.log("Why is it true");
}
但你的意图是:
if ((data?.["myKeys"]?.indexOf("index1") ?? -1) === -1) {
// −^−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^
console.log("Why is it true");
}
奇怪的是,我没有看到提案中讨论的优先级,尽管它在规范草案中如乔纳斯提到的那样被提及,并且它确实出现在问题中。
如您所见,这与 的优先级一致||,这是它的非常非常近的亲戚:
const a = 2;
const b = -1;
console.log(`${a} || ${b} === ${b}: ${a || b === b}`);
console.log(`(${a} || ${b}) === ${b}: ${(a || b) === b}`);
console.log(`${a} || (${b} === ${b}): ${a || (b === b)}`);
根据草案规范,??优先级低于||(大概只是更低)。(为避免混淆,也不允许在&&or||表达式中。)
添加回答
举报
0/150
提交
取消