这个三元运算符有什么问题?

时间:2013-02-08 16:47:07

标签: javascript ternary

我有一个对象menuNames,它应该维护一个菜单项列表。如果menuNames已经有slug,请增加该值,如果它不包含slug,请将值设置为1。我这样做是为了跟踪唯一的名字。我想最终得到类似的东西:

menuNames: {
    home: 1,
    products: 10,
    contact: 1
}

这不起作用(这将包含在通过每个slug的循环中):

menuNames[slug] = (menuNames.hasOwnProperty(slug) ? menuNames[slug]++ : 1);
//this sets every value to 1

但这确实有效(这将包含在每个slug的循环中):

if(menuNames.hasOwnProperty(slug)) {
    menuNames[slug]++;
} else {
    menuNames[slug] = 1;
}

3 个答案:

答案 0 :(得分:6)

menuNames[slug]++会增加该值,但会返回原始值。

您正在执行menuNames[slug] =,因此在递增后,该值将重新设置为原始值。

要修复它,只需执行以下操作:

menuNames[slug] = (menuNames.hasOwnProperty(slug) ? menuNames[slug]+1 : 1);

或者:

(menuNames.hasOwnProperty(slug) ? menuNames[slug]++ : menuNames[slug] = 1);

答案 1 :(得分:3)

我想它可以这样工作:

menuNames[slug] = (menuNames.hasOwnProperty(slug) ? ++menuNames[slug] : 1);

答案 2 :(得分:2)

正如其他答案所说,问题在于后期增量。

另一种写作方式是:

menuNames[slug] += (some_bool ? 1 : 0);

++ 非常对错误很敏感。尝试将其写为+=语句。


如果menuNames[slug]未定义,请将其写为:

menuNames[slug] = 0;
if (some_bool) {
    menuNames[slug] += 1;
}

这是(在我看来)编写初始化/计数器循环的最清晰的方法。

如果您喜欢单行,那么您会感到畏缩,但如果您喜欢无错误的代码,您会很高兴看到这一点。