灰尘:逻辑部分{?}和{#}之间的差异

时间:2013-08-12 10:16:08

标签: dust.js

{?}{#}之间究竟有什么区别?

-

经过一点测试后,列出所有truthy/falsy values for {?},并将它们与{#}进行比较:

上下文

{
  values: [
    // false
    '',
    "",
    false,
    null,
    undefined,
    [],
    // true
    0,
    "0",
    "null",
    "undefined",
    "false",
    {},
    {a: 'a'}
  ]
}

模板

{#values}
 {?.}true{:else}false{/.}
{/values}
{~n}
{#values}
 {#.}true{:else}false{/.}
{/values}

它输出的结果完全相同:

falsefalsefalsefalsefalsefalsetruetruetruetruetruetruetrue
falsefalsefalsefalsefalsefalsetruetruetruetruetruetruetrue

-

它们之间真的有什么区别吗?

1 个答案:

答案 0 :(得分:11)

#?之间存在差异,但它有些微妙,并且在您的示例中没有显示出来。

?(存在):检查给定密钥的真实性。如果密钥是真实的,请执行正文,否则执行:else正文(如果有的话)。

#(部分):检查给定密钥的真实性。如果键是真实的,请将上下文设置为键,然后执行正文。如果上下文是数组,则对数组中的每个元素执行一次body。如果密钥不真实,请不要更改上下文,并执行:else正文(如果存在)。

所以,如果你的模板看起来像这样:

<强>模板:

{?values}
 {?.}true{:else}false{/.}
{/values}
{~n}
{#values}
 {#.}true{:else}false{/.}
{/values}

然后你的输出将是:

true
falsefalsefalsefalsefalsefalsetruetruetruetruetruetruetrue

第一行检查values是否存在,但不会更改上下文。第二行检查当前上下文(在本例中是根上下文)是否存在,并打印true。由于?没有进入上下文并循环遍历数组,因此true仅打印一次。