Javascript Undefined String Property Tuthiness

mac*_*ost 5 javascript truthiness

我经常在我的Javascript中使用以下模式:

x = couldBeNullThing || valueIfItIsNull;
Run Code Online (Sandbox Code Playgroud)

因为它胜于:

x = couldBeNullThing ? couldBeNullThing : valueIfItIsNull;
Run Code Online (Sandbox Code Playgroud)

我也经常使用相同模式的轻微变体:

x = x || valueIfXIsNotDefined;
Run Code Online (Sandbox Code Playgroud)

这一切都很棒...除了问题,我最近发现:

foo = "";
//assert foo.x === undefined;
foo.x = foo.x || valueIfXIsNotDefined;
//assert foo.x === undefined;
Run Code Online (Sandbox Code Playgroud)

换句话说,如果你有一个字符串,你就做了string.aPropertyThatStringDoesntHave || foo,你既不会回头也不会回到实际价值; 相反,你得到了未定义.

谁能解释为什么会这样?在我看来,如果foo.x未定义,那么foo.x || anythingElse应该总是导致任何东西......所以为什么不呢?

nnn*_*nnn 2

虽然我熟悉这个概念,但assert我不知道 JavaScript 具有该功能。因此,考虑到这一点,我可能是完全错误的,但在我看来,这个说法:

\n\n
assert (foo.x || valueIfXIsNotDefined) === undefined;\n
Run Code Online (Sandbox Code Playgroud)\n\n

...正在调用一个名为 的函数assert(),向其传递参数foo.x || valueIfXIsNotDefined,然后将函数的返回值assert()与进行比较undefined。或许你需要的是这样的:

\n\n
assert(foo.x || valueIfXIsNotDefined === undefined);\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我尝试类似的操作console.log()

\n\n
var foo = "",\n    valueIfXIsNotDefined = "test";\nconsole.log( foo.x === undefined);\nconsole.log(foo.x || valueIfXIsNotDefined === undefined);\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\x8b然后记录:

\n\n
true\nfalse\n
Run Code Online (Sandbox Code Playgroud)\n\n

同样,之后:

\n\n
var result = foo.x || valueIfXIsNotDefined;\n
Run Code Online (Sandbox Code Playgroud)\n\n

result"test"

\n\n

http://jsfiddle.net/YBPyw/

\n\n

此外,如果您实际上尝试分配foo.x等于某个东西(其中foo是字符串),它不起作用,因此当您稍后测试时foo.x它会给出undefined.

\n