一、转换为string类型
形如 : ?+str的类型就会调用前者的toString方法,然后对二者进行拼接,前提是前者必须有toString方法。
console.log(1 + 'str');//1str
console.log(-1 + 'str');//-1str
console.log(0 + 'str');//0str
conlose.log(NaN+'str');//NaNstr
console.log(true + 'str');//truestr
console.log(false + 'str');//falsestr
console.log(null + 'str');//nullstr
console.log(undefined + 'str');//undefinedstr
console.log([] + 'str');//str
console.log([1, 2, 3] + 'str');//1,2,3str
console.log({} + 'str');//[object Object]str
console.log({ a: 1 } + 'str');//[object Object]str
二、转换为Number类型
? +-*/% number 就会调用前者的valueOf方法进行算数运算。
console.log('' + 1)//'1'
console.log('a' + 1);//'a1'
console.log('1' + 1);//'11'
console.log(NaN + 1);//NaN
console.log(true + 1);//2
console.log(false + 1);//1
console.log(null + 1);//1
console.log(undefined + 1);//NaN
console.log([] + 1)//1
console.log([1, 2, 3] + 1);//'1,2,31'
console.log({} + 1);//'[object Object]1'
console.log({ a: 1 } + 1);//'[object Object]1'
注意点:
1、+运算时,如果有string,直接拼接
2、-*/%运算时:
字符串如果能转换为数字,进行数学运算,否则就返回NaN,空字符串会转换为0
null、fasle当做数字0,true当做数字1,undefined返回NaN
NaN和数字不管什么运算都返回NaN
空数组转换为0,非空数组、空对象、非空对象转换为NaN
比较运算符会把左右两边转换为数字再进行比较
[] false转化为0
{} NaN undefined null当做NaN
字符串的比较会转换为unicode再比较大小(A<Z<a<z),多个字符则依次比较。
console.log('' == 0);//true
console.log([] == 0);//true
console.log(fasle == 0);//true
console.log({} == 0);//false
console.log(NaN == 0);//false
console.log(undefined == 0);//false
console.log(null == 0);//false
//特殊情况:无视规则
console.log(NaN == NaN);//false
console.log(null == undefined);//true
console.log(null === undefined);//false null--object undefined----undefined
//----------------------------------------------------------------------------------
console.log('2' > 10);//false
console.log('2'.charCodeAt());//50
console.log('2' > '10');//true
console.log('10'.charCodeAt());//49
console.log('a' > 'b');//false
console.log('a'.charCodeAt());//97
console.log('b'.charCodeAt());//98
console.log('z'.charCodeAt());//122
// a - z 97 - 122
console.log('a'>'A')//
console.log('A'.charCodeAt());//65
console.log('Z'.charCodeAt());//90
//A-Z 65-90
//A<Z<a<z
// 长条字符串从左到右依次比较
console.log('abc' > 'b');//false
console.log('abc' > 'aad');//true
复杂类型转换规则
先调用valueOf获取原始值,如果原始值不是number类型,则使用toString转换为字符串,再将这个字符串转换为数字
let obj = {a:1}
console.log(obj.valueOf()) // {a:1}
console.log(obj.toString()) //[object Object]
let arr = [1,2,3]
console.log(arr.valueOf()) // [1,2,3]
console.log(arr.toString()) // 1,2,3 (字符串)