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应该总是导致任何东西......所以为什么不呢?
虽然我熟悉这个概念,但assert我不知道 JavaScript 具有该功能。因此,考虑到这一点,我可能是完全错误的,但在我看来,这个说法:
assert (foo.x || valueIfXIsNotDefined) === undefined;\nRun Code Online (Sandbox Code Playgroud)\n\n...正在调用一个名为 的函数assert(),向其传递参数foo.x || valueIfXIsNotDefined,然后将函数的返回值assert()与进行比较undefined。或许你需要的是这样的:
assert(foo.x || valueIfXIsNotDefined === undefined);\nRun Code Online (Sandbox Code Playgroud)\n\n如果我尝试类似的操作console.log():
var foo = "",\n valueIfXIsNotDefined = "test";\nconsole.log( foo.x === undefined);\nconsole.log(foo.x || valueIfXIsNotDefined === undefined);\nRun Code Online (Sandbox Code Playgroud)\n\n\xe2\x80\x8b然后记录:
\n\ntrue\nfalse\nRun Code Online (Sandbox Code Playgroud)\n\n同样,之后:
\n\nvar result = foo.x || valueIfXIsNotDefined;\nRun Code Online (Sandbox Code Playgroud)\n\nresult是"test"。
此外,如果您实际上尝试分配foo.x等于某个东西(其中foo是字符串),它不起作用,因此当您稍后测试时foo.x它会给出undefined.
| 归档时间: |
|
| 查看次数: |
319 次 |
| 最近记录: |