同样的表达,不同的结果
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]
只有当它已经是真值时才会增加 。但是,在此之前它只能是 undefined
或 0
- 都是虚假值。
这两个表达式根本不等价,因为无论 if 语句的结果如何,版本 1 都会递增 obj[veh]
,而版本 2 只会在 else 条件下递增 obj[veh]
。
我正在尝试对这样一列车辆进行简单的频率计数:
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]
只有当它已经是真值时才会增加 。但是,在此之前它只能是 undefined
或 0
- 都是虚假值。
这两个表达式根本不等价,因为无论 if 语句的结果如何,版本 1 都会递增 obj[veh]
,而版本 2 只会在 else 条件下递增 obj[veh]
。