【问题标题】:Javascript Undefined String Property TruthinessJavascript未定义字符串属性真实性
【发布时间】: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/…
  • 对于一个空字符串ss.no_such_property 给了我undefineds.no_such_property || 11 给我11 的预期。我在 Firefox、Chrome 和 Safari 中得到了相同的(预期的)结果。我应该看到什么?我看错了吗? jsfiddle.net/ambiguous/8wwUh

标签: javascript truthiness


【解决方案1】:

虽然我熟悉 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

【讨论】:

  • 对不起,你是正确的,JS 没有原生断言。我只是想解释这种情况,但我真的应该说“// assert ..”更清楚(我会编辑问题)。你的最后一句话回答了我的问题(谢谢),但 Gohn67 的 cmets 才理解它。对于其他读者,据我了解,原因 var foo = ""; foo.x = 1; foo.x != 1;是因为在第二个语句中 foo 被临时转换为 new String(foo)。这允许它获得分配给它的 x 属性,但之后它又回到了(无属性)原语。
猜你喜欢
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多