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;
}