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)
知识点:
- A + B
+两边中的任何一边遇到字符串或者对象(对象转换为数字首先要转换为字符串【排除有原始值的】),都是按字符串拼接处理的.
- {} + 10 => 10 // 左边的大括号当作一个代码块,不参与运算
- ({} + 10) = '[objct Object]10' // 在()包裹下就会正常运算,{}调用toString()转换为字符串'[object Object]'
- 10 + {} = '10[object Object]' // {}在后边也会正常运算
- +A/++A/A++
都是转为数字- 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'
}
知识点:
- Number
要转换的字符串中有非有效字符的话,转为NaN - paraseInt
从左到右查找有效字符转换,忽略遇到的第一个非有效字符后的数据
4.
let arr = [27.2, 0, '0013', '14px', 123]
arr = arr.map(parseInt)
console.log(arr)
知识点:
- parseInt([value]):把一个字符串转换为数字([value]不是字符串,也要先转换为字符串),处理机制:从字符串左侧第一个字符开始查找,把找到有效数字字符转为数字,直到遇到第一个非有效数字字符,则停止查找(不论后面是否还有有效数字字符,都不再查找了)(如果一个有效数字字符都没有,返回NaN)
parseInt('12px') // 12
parseInt('d12px') // NaN
-
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 反向验证 -
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]