12.数据类型转换

177 阅读3分钟

数据类型转换的4大核心标准

1.把其他数据类型转换为Number类型

1. 特定需要转换为Number的
	* Number([val])
    * parseInt/parseFloat([val])
2. 隐式转换(浏览器内部默认要先转换为Number在进行计算的)
	* isNaN([val])
    * 数学运算(特殊情况:+ 在出现字符串的情况下不是数学运算,是字符串拼接)
    * 在==比较的时候,有些值需要转换为数字再进行比较
    * ...

2.把其他数据类型转换为字符串

1. 能用的办法
	* toString()
    * String()
2. 隐式转换(一般都是调用其toString)
	* 加号

1.

let result = 100 + true + 21.2 + null + undefined + "Tencent" + [] + null + 9 + false;
// 100 +1(true) + 21.2 + 0(null) + NaN(undefined) // => NaN 「任何数字加NaN都会变成NaN」
// NaN+'Tencent' // => 'NaNTencent' 「加号两边任何一边出现字符串,原始值都转化为字符串拼接」
// 'NaNTencent' + [](空字符串'',空数组无toPrimitive,valueOf也非原始值(即基本类型值),toString为空字符串) // 「加号两边任何一边出现对象:1.是否有Symbol.toPrimitive;2.valueOf为原始值;3.toString」
// 'NaNTencent' + null('null') + 9('9') + false('false') // => 'NaNTencentnull9false'
console.log(result);

/*
'NaNTencentnull9false'
*/

2.

{ } +0 ? alert('ok') : alert('no');
// 空大括号{},放在最左端,会被认为是代码块不参与运算 => 0 => false
// false ? alert('ok') : alert('no) => alert('no')
0 + {} ? alert('ok') : alert('no');
// 加号两边出现对象(to),{} toString为'[Objdect Objdect]' => '0[Objdect Objdect]' => true
// true ? alert('ok') : alert('no) => alert('no') => alert('ok')

/*
alert('no')
alert('ok')
*/

3.

let res = Number('12px'); // 出现非有效数字符截断 =》NaN
if (res === 12) {
  alert(200);
} else if (res === NaN) { // NaN和NaN 不相等
  alert(NaN);
} else if (typeof res === 'number') { // NaN 属于number类型
  alert('number'); // => 执行
} else {
  alert('Invalid Number');
}

/*
alert('number')
*/

4

// let arr = [27.2, 0, '0013', '14px', 123];
// arr = arr.map(parseInt);
// console.log(arr);

/**
 * arr.map(()=>{
 *  return xxx;
 * }) -> 数组迭代的方法
 * 
 * parseInt(xxx) : 把xxx转换为字符串,紧接着从字符串左侧第一个字符开始查找
 * 找到有效数字字符「直到遇到一个非有效数字字符结束(不论后面是否还有,都不再查找)」,把找到的有效数字字符转换为数字
 * parseInt(xxx,radix):radix进制,在xxx字符串中,从左到右查找符合radix进制的信息,把找到的结果最后转换为10进制
 *  radix:取值范围2~36之间,不在这个之间,则最后结果都是NaN
 *  radix:没有设置或者设置为0,则默认都是按照10进制处理「特殊:如果字符串是按照0x开头的,则默认值不是10,而是16」
 */


let arr = [27.2, 0, '0013', '14px', 123];
arr = arr.map(parseInt);
// parseInt(27.2, 0) // 默认照10进制,不写或者写0 -> 27

// parseInt(0, 1) // -> NaN 「radix不在2~36范围内」

// parseInt('0013', 2) // -> '001' 把找到2进制转换为10进制
//  1*2^0 + 0*2^1 + 0*2^2 => 1+0+0 => 1

// parseInt('14px', 3) // -> '1' 把找到的3进制转换为10进制
// 1*3^0 => 1

// parseInt(123, 4) // -> parseInt('123',4) -> '123' 把找到的4进制转换为10进制
// 3*4^0 + 2*4^1 + 1*4^2 => 27

console.log(arr);

// *注意:
// JS中遇到"以0开头"的"数字",浏览器解析阶段,就会把其当做8进制,最后转换为十进制
// 070 => 0*8^0 + 7*8^1 + 0*8^2 => 56
// parseInt(070, 10) => parseInt(56) ->  parseInt('56',10) -> 56
// parseInt('070', 10) => parseInt('70',10) -> 76