我的第一个reduce返回一个表达式:a + (condition)? b : c
,我的第二个reduce返回等价的(???)表达式:(condition)? a+b : a+c
为什么它们的行为不同?
function addressLengthWrong(address) {
let keys = ['street', 'city', 'state', 'zip']
return keys.reduce((acc, key) => acc + (address[key]) ? address[key].length : 0, 0)
}
let address = {
street: 'My Street',
city: '',
state: '',
zip: ''
}
console.log(`wrong address len ${addressLengthWrong(address)}`)
address.zip = '01234'
console.log(`wrong address len ${addressLengthWrong(address)}`)
运行替代方案......
function addressLengthCorrect(address) {
let keys = ['street', 'city', 'state', 'zip']
return keys.reduce((acc, key) => (address[key]) ? acc + address[key].length : acc, 0)
}
address = {
street: 'My Street',
city: '',
state: '',
zip: ''
}
console.log(`correct address len ${addressLengthCorrect(address)}`)
address.zip = '01234'
console.log(`correct address len ${addressLengthCorrect(address)}`)
我有一种兴奋的感觉,我即将学习新的东西。这里发生了什么?
你的括号顺序是错误的。试试这个:
function addressLengthWrong(address) {
let keys = ['street', 'city', 'state', 'zip']
return keys.reduce((acc, key) => acc + (address[key] ? address[key].length : 0), 0)
}
你应该用括号包装整个三元表达式,否则将包括acc
。
另外,引用Andreas的回答:
... + ... precedence: 13, ... ? ... : ... precedence: 4; the higher value 'wins'
我认为这是因为第一次操作中的三元操作不正确,并且没有达到初始值。而不是添加(+),在累加器上使用+ =。
let a = 1, b = 2
let c = 0
c + a === 1 ? a : b // fails, c = 0
c += a === 1 ? a : b // success, c = 1