【发布时间】:2012-04-08 13:30:09
【问题描述】:
我经常在我的 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 应该总是产生任何东西......那为什么不呢?
【问题讨论】:
-
有趣的是,如果你这样做
foo = new String("") -
我注意到的另一件事是,使用
console.log(foo)返回“(一个空字符串)”,而当使用 new String("") 时,它返回一个 String 对象。另外,我在火狐上。在其他浏览器上可能会有所不同。 -
对垃圾邮件感到抱歉。但这是一个有趣的问题。
foo = String("")也返回“(一个空字符串”)。另外,像foo = "Test".substr(1)这样的操作只返回一个字符串值,而不是一个对象。 -
无论如何这可能会回答你的问题:stackoverflow.com/questions/2051833/…
-
对于一个空字符串
s,s.no_such_property给了我undefined和s.no_such_property || 11给我11的预期。我在 Firefox、Chrome 和 Safari 中得到了相同的(预期的)结果。我应该看到什么?我看错了吗? jsfiddle.net/ambiguous/8wwUh
标签: javascript truthiness