给出此打字稿(2.7.2)界面:
export interface A {
b?: string;
c?: boolean;
}
这将按预期输出布尔值“ false”:
let a: A = {b: ''};
if (a.b && a.b.length > 0) {
a.c = true;
} else {
a.c = false;
}
console.log(a.c);
但是,这会打印一个空的''字符串:
let a: A = {b: ''};
a.c = a.b && a.b.length > 0;
console.log(a.c);
我有点困惑。第二个示例的行为应与第一个类似,对吗?我想念什么?
答案 0 :(得分:6)
a.b && a.b.length > 0
等效于"" && false
,因为空字符串评估为虚假。表达式"" && false
的值为""
。这就是a.c
是""
的原因。
像这样重构它,
a.c = a.b && a.b.length > 0 ? true : false
答案 1 :(得分:3)
这更多是Javascript真实/错误问题。 &&
运算符将返回操作数之一的值。参见docs:
但是,&&和||运算符实际上返回指定操作数之一的值,因此,如果将这些运算符与非布尔值一起使用,则它们可能会返回非布尔值。
并且专门针对&&
:
如果expr1可以转换为false,则返回它;否则,返回expr2。因此,当与布尔值一起使用时,&&如果两个操作数都为true,则返回true;否则,返回false。
在您的情况下,""
是一个伪造的值,因此可以将其转换为false。如果您想确保自己使用布尔值,请使用!!
(即双重否定)
let a: A = {b: ''};
a.c = !!(a.b && a.b.length > 0);
console.log(a.c);
答案 2 :(得分:0)
依靠@nrgwsth的回复,您可以在如下情况下通过将a.b
替换为!!a.b
来进一步重构同时保持结构:
let a: A = {b: ''};
a.c = !!a.b && a.b.length > 0;
console.log(a.c);
应用!a.b
会将a.b
转换为其布尔负数,应用!!a.b
将为评估提供正布尔值。