同样的表达,不同的结果

Same expression but different outcome

我正在尝试对这样一列车辆进行简单的频率计数:

    const data = ['car', 'car', 'truck', 'truck', 'bike', 'walk', 'car', 'van', 'bike', 'walk', 'car', 'van', 'car', 'truck', 'airplane'];

使用了两个不同但相似的表达方式: 我认为两者都以相同的方式表达:如果 veh 不在对象中,则它等于 0,否则如果在 obj 中,则继续加一。但是,使用三元运算符的函数给出了一个带有车辆名称但所有值为 0 的 obj。

1.

let sumVeh = data.reduce((obj, veh) => {
  if(!obj[veh]) obj[veh] = 0; 
  obj[veh]++;
  return obj;
}, {})

结果:

{car : 5, truck : 3, bike : 2....}

2.

let sumVeh = data.reduce((obj, veh) => {
  !obj[veh] ? obj[veh] = 0 : obj[veh]++;
  return obj;
}, {})

结果:

{car : 0, truck : 0, bike : 0....}

为什么要这样做??我只是无法理解......提前致谢!

这两个表达式不等价。三元运算符表达式等效于此代码:

if(!obj[veh]) obj[veh] = 0;
else obj[veh]++;

您看到这与您的版本 1 有何不同吗? obj[veh] 只有当它已经是真值时才会增加 。但是,在此之前它只能是 undefined0 - 都是虚假值。

这两个表达式根本不等价,因为无论 if 语句的结果如何,版本 1 都会递增 obj[veh],而版本 2 只会在 else 条件下递增 obj[veh]