Javascript 未定义的字符串属性真实性

标签 javascript truthiness

我经常在我的 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"

http://jsfiddle.net/YBPyw/

此外,如果您实际上尝试将 foo.x 赋值给某物(其中 foo 是一个字符串)它不起作用,所以当您稍后测试 foo.x 它将给出 undefined

关于Javascript 未定义的字符串属性真实性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9848510/

相关文章:

javascript - 当鼠标位于行上时,防止行内的编辑控件闪烁

javascript - 是 !!检查 if 语句中真值的最佳实践

r - 连续测试多个 %in% 是什么意思?

javascript - 理解 JavaScript 提升和 truthy & falsy

javascript - 将函数相互嵌套是不好的做法吗?

javascript - 等待音乐加载时的 ionic 旋转器( ionic 2/Angular 2)

javascript - 使用 jquery 在 dom 的其余部分中查找特定元素之后的第一个匹配项

javascript - 此 TypeScript Lambda 表达式中的括号是什么意思?

perl - 双变量的真实性是否总是其字符串部分的真实性?

python - 理解字符串的真实性