js 混合拼接应该用 () 还是 String() 方法处理计算优先级?
js 混合拼接的顺序差异,导致结果差别这么大,为什么 js 这么设计?要避免这种混合处理的差异,应该用 () 还是 String() 方法处理计算优先级?
3 * 0.3 + 1 + 'foo' => 1.9foo 'foo' + 3 * 0.3 + 1 => foo0.8999 九 99999 九 999991
js 混合拼接的顺序差异,导致结果差别这么大,为什么 js 这么设计?要避免这种混合处理的差异,应该用 () 还是 String() 方法处理计算优先级?
3 * 0.3 + 1 + 'foo' => 1.9foo 'foo' + 3 * 0.3 + 1 => foo0.8999 九 99999 九 999991
小写 string${a} 是什么语法?
如果要问为什么这么设计,答案就是这是 js 糟粕部分。建议完全放弃加号拼接字符串的行为
‘foo’ + 3 * 3 // “foo9”
然后不同类型相加会自动转换类型,就全乱套了.
‘a’ + 1 // a1
‘a’ + true // “atrue”
‘a’ + null // “anull”
‘a’ + undefined // “aundefined”
1 + true // 2
1 + undefined // NaN
1 + null // 1
[] + 1// “1”
[] + ‘a’ // “a”
{} + 1 // 1
({}) + 1 // “[object Object]1”
所以最好用模板字符串,而不是加号
另外一坨 9999 的,其实也没毛病。阅读: http://0.30000000000000004.com/
‘foo’ + 3 * 0.3 + 1
=>’foo’ + 0.8999999999999999 + 1
=>”foo0.8999999999999999″ + 1
=>”foo0.89999999999999991″
为什么这么设计,当然是因为先乘除后加减,更符合学过数学的人的思维。
而“+”既可以作为数学的加法运算,也可以作为字符串的拼接运算。当你用“+”来混合操作 String 和 Number 时,会把 Number 转为 String,再跟另一个 String 做拼接运算。
要尽量避免用数学操作符来直接操作非 Number 数据类型,以免出现不可预知的隐式转换。
字符串的拼接尽量用字符串模板(`${}`),避免用“+”拼接。