Appearance
把其他类型值转为字符串方法1:[val].toString() 被用于隐式转换
js
('12').toString() // '12'
(12).toString() // '12'
(NaN).toString() // 'NaN'
(true).toString() // 'true'
(false).toString() // 'false'
(null).toString() // 报错 null / undefined禁止直接toString()
(undefined).toString() // 报错
Symbol().toString() // 'Symbol()'
Symbol('key').toString() // 'Symbol(key)'
(100n).toString() // '100' BigInt转为字符串丢失n
{}.toString() // [object Object]
{ name: 'Tom' }.toString() // [object Object]
([]).toString() // ''
([1, 2]).toString() // '1,2'
(function fn () {}).toString() // 'function fn () {}'把其他类型值转为字符串方法2:String([val]) 效果同上
js
String(null) // 'null'
String(undefined) // 'undefined'String和toStirng区别
1.String可以处理null/undefiend,但不能将数字转为进制字符串
2.toString不能处理null/undefined,但可以将数字转为进制字符串
把其他类型值转为字符串方法3:字符串拼接
js
// 四则运算中,只有加法可能存在字符串拼接,其余都是数学运算(数学运算中遇到非数字类型,基于Number()转为数字,再进行运算)
4 / 2 // 2
7 / 3 // 2.3333333333333335
'10' - 10 // 10 - 10 => 0
'10px' - 10 // NaN - 10 => NaN加号两边任意一边出现字符串 => '' + x 或者 x + '' => 必为字符串拼接
如果x不是引用数据类型 => 字符串拼接
如果x是引用数据类型 => 先转化再拼接
依次调用 1.Symbol.toPrimitive 2.valueOf 3.toString 三个方法, 一旦有一个返回值是基本数据类型, 则不再调用其他方法,如果这个返回值是String类型, 直接使用,如果不是String类型,通过String()转化为String类型再使用 如果调用完三个方法还不能转为基本数据类型, 则报错 Cannot convert object to primitive value
加号两边任意一边出现引用数据类型 => {} + x 或者 x + {}
x是String类型 => 上面的情况
x不是String类型,引用数据类型尝试转化为数字,如果引用数据类型转化成了 String 类型会变为字符串拼接, 排除 {} + 1
js
{} + 1 // 会把{}当作代码块,其实运算的只有+1 => 1
console.log({} + 1) // {} => '[object Object]1' => '[object Object]1'
({} + 1) // '[object Object]1' 这样就{}不会被当作代码块了
var n = {} + 1 // 字符串拼接
1 + {} // 字符串拼接
'10' + 10 // '1010'
1 + [] // 1 + '' => '1'
1 + {} // 1 + '[object Object]' => '1[object Object]'
[10] + true // '10' + true => '10true'
100 + true + 21.2 + null + undefined + 'Tencent' + [] + null + 9 + false // 'NaNTencentnull9false'
new Number(10) + 10 // valueOf() => 10 => 10 + 10 = 20加号只有一边的情况:
+value 把value变为数字
value+ 报错
++i 先把i累加1(数学运算),再输出或运算
i++ 先把1输出或运算,完了之后再累加1
把其他类型值转为字符串方法4: 字符串拼接 ``
js
let str = `
${[1, 2, 3].map(item => {
return `<li>${item}</li>`
}).join('')}
`