我经常在我的 Javascript 中使用以下模式:
x = couldBeNullThing || valueIfItIsNull;
因为它比:
x = couldBeNullThing ? couldBeNullThing : valueIfItIsNull;
我也经常使用相同模式的轻微变体:
x = x || valueIfXIsNotDefined;
这一切都很好......除了问题是,我最近发现:
foo = "";
//assert foo.x === undefined;
foo.x = foo.x || valueIfXIsNotDefined;
//assert foo.x === undefined;
换句话说,如果你有一个字符串,并且你执行 string.aPropertyThatStringDoesntHave || foo,你既不会返回 foo 也不会返回实际值;相反,你得到了未定义。
谁能解释一下这是为什么?在我看来,如果 foo.x 未定义,则 foo.x || anythingElse 应该总是导致 anythingElse ...那为什么不呢?
最佳答案
虽然我熟悉 assert
的概念,但我并不知道 JavaScript 具有该功能。因此,考虑到这一点,我可能完全错了,但在我看来,这句话:
assert (foo.x || valueIfXIsNotDefined) === undefined;
...正在调用一个名为 assert()
的函数,将参数 foo.x || 传递给它valueIfXIsNotDefined
,然后将 assert()
函数的返回值与 undefined
进行比较。也许您需要的是:
assert(foo.x || valueIfXIsNotDefined === undefined);
如果我用 console.log()
尝试类似的东西:
var foo = "",
valueIfXIsNotDefined = "test";
console.log( foo.x === undefined);
console.log(foo.x || valueIfXIsNotDefined === undefined);
然后它记录:
true
false
类似地,之后:
var result = foo.x || valueIfXIsNotDefined;
result
是 "test"
。
此外,如果您实际上尝试将 foo.x
赋值给某物(其中 foo
是一个字符串)它不起作用,所以当您稍后测试 foo.x
它将给出 undefined
。
关于Javascript 未定义的字符串属性真实性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9848510/