14、数据类型转换练习题

222 阅读3分钟

1.

    /**
     * 100 + true(转为数字是1) = 101
     * 101 + 21.2 = 122.2
     * 122.2 + null(转为数字是0) = 122.2
     * 122.2 + undefined(转为数字是NaN,NaN和数字相加还是NaN) = NaN
     * NaN + "Tencent"(字符串加任何东西都hi字符串) = "NaNTencent"
     * "NaNTencent" + [](空字符串'') = "NaNTencent"
     * "NaNTencent" + null + 9 + false  = "NaNTencentnull9false"
     * 
    */
    let result = 100 + true + 21.2 + null + undefined + "Tencent" + [] + null + 9 + false
    console.log(result)

知识点:

  1. A + B
    +两边中的任何一边遇到字符串或者对象(对象转换为数字首先要转换为字符串【排除有原始值的】),都是按字符串拼接处理的.
    1. {} + 10 => 10 // 左边的大括号当作一个代码块,不参与运算
    2. ({} + 10) = '[objct Object]10' // 在()包裹下就会正常运算,{}调用toString()转换为字符串'[object Object]'
    3. 10 + {} = '10[object Object]' // {}在后边也会正常运算
  2. +A/++A/A++
    都是转为数字
    1. let n = '10' console.log(+n + 10) // 20

2.

// {} + 0 => {}被认为是代码块不参与运算,0转为布布尔值是false
{} + 0 ? alert('ok') : alert('no') // 'no'
// 0+{} => '0[object Object]' 转为布尔值是true
0 + {} ? alert('ok') : alert('no') // 'ok'

3.

let res = Number('12px') // NaN
if (res === 12) {
  alert(200)
} else if (res === NaN) { // NaN和NaN不相等
  alert(NaN)
} else if (res === 'number') {
  alert('number')
} else {
  alert('Invalid Number') // 弹出'Invalid Number'
}

知识点:

  1. Number
    要转换的字符串中有非有效字符的话,转为NaN
  2. paraseInt
    从左到右查找有效字符转换,忽略遇到的第一个非有效字符后的数据

4.

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

知识点:

  1. parseInt([value]):把一个字符串转换为数字([value]不是字符串,也要先转换为字符串),处理机制:从字符串左侧第一个字符开始查找,把找到有效数字字符转为数字,直到遇到第一个非有效数字字符,则停止查找(不论后面是否还有有效数字字符,都不再查找了)(如果一个有效数字字符都没有,返回NaN)
parseInt('12px') // 12
parseInt('d12px') // NaN
  1. parseInt([value], [radis]):

    • [radix]不写(或者写0),默认是10进制;特殊情况:如果[value]是以0x开头的字符串,则[radix]不写的话默认是16进制
    parseInt('12px') // 12
    parseInt('0x11') // 17    
    
    • [radix]有自己的取值范围2~36之间,不再这个之间的,返回结果都是NaN
    parseInt('12', 1) // NaN
    
    • 首先会在[value]字符串中,从左到右找到所有符合[radix]进制的值(遇到一个非[radix]进制的则停止查找),把找到的结果最后转换为10进制的值
    • 把一个N进制的值转换为10进制
      例如:把一个八进制的值转换为10进制
    let n = '1042'  // 八进制
    n从右开始数,每一位数字*进制的index(每一位数字从右开始数的索引)幂,如下
    2*8^0 + 4*8^1 + 0*8^2 + 1*8^3
    最后结果是:2+32+0+512=546
    反向验证
    

  2. parseFloat()没有[radix]这个机制

题目解析:

arr = arr.map(function(item, index) {
	// 每迭代数组中的一项,都会把这个回调函数触发执行,并且把当前迭代这一项和这一项的索引传递个这个函数
    // 回调函数的返回值会把数组这一项替换掉,原始数组不变,返回一个新的数组
})
let arr = [27.2, 0, '0013', '14px', 123]
arr = arr.map(parseInt)
// parseInt(27.2, 0)  => parseInt(27.2, 10) => 27
// parseInt(0, 1) => [radix]取值范围2~36,1不符合,返回NaN
// parseInt('0013', 2) => 将001看作二进制数转为十进制数,3不符合二进制,只有001符合二进制。按照规则计算 1*2^0 + 0*2^1 + 0*2^2 = 1
// parseInt('14px', 3) // 将14看作三进制转为十进制数,4不符合三进制,只有1符合,计算:1*3^0 = 1
// parseInt(123, 4) // 将123看作四进制转为十进制数:3*4^0 + 2*4^1 + 1*4^2 = 27
console.log(arr) // [27, NaN, 1, 1, 27]