随着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")) // 1
if (data?.["myKeys"]?.indexOf("index1") ?? -1 === -1) { // returns true - why?
console.log("Why is it true");
}
当??
的索引为index1
而1
的索引为index0
时,为什么0
运算符的行为会有所不同。两者都应返回false,因为它是!== -1
游乐场link
答案 0 :(得分:6)
这是一个优先问题。您的代码被评估为:
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");
}
奇怪的是,虽然the proposal中提到的优先级为the draft spec,但Jonas mentions中确实提到了the issues中没有讨论的优先级。
如您所见,这与||
的优先级是一致的,它的优先级非常非常接近:
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)}`);
根据规范草案,??
的优先级比||
低(大概 低)。 (为避免混淆,在&&
或||
表达式中也不允许这样做。)
答案 1 :(得分:3)
引用draft:
??优先级低于||
换句话说,您的代码的行为大致类似于:
data?.["myKeys"]?.indexOf("index0") || -1 === -1
这将被视为:
(data?.["myKeys"]?.indexOf("index0")) || (-1 === -1)