5

我经常在我的 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 || anyElse 应该总是导致anythingElse ...那为什么不呢?

4

1 回答 1

2

虽然我熟悉这个概念,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"

http://jsfiddle.net/YBPyw/

此外,如果您实际上尝试分配foo.x等于某些东西(foo字符串在哪里),它不起作用,所以当您稍后测试时foo.x,它会给出undefined.

于 2012-03-24T02:40:32.097 回答