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

Javascript 这个三元运算符有什么问题?,javascript,ternary,Javascript,Ternary,我有一个对象menuNames,它应该维护一个菜单项列表。如果menuNames已经有slug,则增加该值,如果该值不包含slug,则将该值设置为1。我这样做是为了追踪唯一的名字。我想以这样的方式结束: menuNames: { home: 1, products: 10, contact: 1 } 这不起作用(这将包含在通过每个段塞的循环中): 但这确实有效(这将包含在通过每个slug的循环中): menuNames[slug]++增加值,但也返回原始值 您正在执行m

我有一个对象
menuNames
,它应该维护一个菜单项列表。如果
menuNames
已经有
slug
,则增加该值,如果该值不包含
slug
,则将该值设置为
1
。我这样做是为了追踪唯一的名字。我想以这样的方式结束:

menuNames: {
    home: 1,
    products: 10,
    contact: 1
}
这不起作用(这将包含在通过每个段塞的循环中):

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


menuNames[slug]++
增加值,但也返回原始值

您正在执行
menuNames[slug]=
,因此该值在递增后会设置回原始值

要解决此问题,只需执行以下操作:

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


我想它可以这样工作:

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

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

另一种书写方式是:

menuNames[slug] += (some_bool ? 1 : 0);
++
对bug非常敏感。试着把它写成
+=
语句


如果
menuNames[slug]
可以是未定义的,则将其写成:

menuNames[slug] = 0;
if (some_bool) {
    menuNames[slug] += 1;
}
在我看来,这是编写初始化/计数器循环最清晰的方法


如果你喜欢一行程序,你会畏缩,但如果你喜欢无bug代码,你会很高兴看到这一点。

这会奏效,但似乎效率低下<代码>++menuNames[slug]增加值并返回新值,然后将新值分配给变量。为什么要做两个作业?你也可以只写:
menuNames[slug]=(menuNames[slug]|124; 0)+1
。如果
menuNames[slug]
未定义的
,这将不起作用,因为
未定义的+0
NaN
。如果
menuNames[slug]
可以是
未定义的
menuNames[slug] = (menuNames.hasOwnProperty(slug) ? ++menuNames[slug] : 1);
menuNames[slug] += (some_bool ? 1 : 0);
menuNames[slug] = 0;
if (some_bool) {
    menuNames[slug] += 1;
}