显示类型转换面试题

1
2
3
4
5
6
console.log(["1", "2", "3"].map(parseInt))// [1, NaN, NaN]
/*
"1"=> parseInt("1", 0)
"2"=> parseInt("2", 1)
"3"=> parseInt("3", 2)
*/
  • map((item, index, arr)):当前值,下标,整个数组
  • parseInt(string, radix):当前字符串,进制
1
2
3
4
5
6
console.log(parseInt(1/0, 19))// 18
/*
1/0 = Infinity
等价于parseInt("Infinity", 19)
19进制有I,但是没有n,则直接返回i,即18
*/
1
2
3
4
5
6
console.log(parseInt(parseInt, 16))// 15
/*
String(parseInt)=> "function parseInt() { [native code] }"
等价于parseInt("function parseInt() { [native code] }", 16)
16进制有f,但是没有u,则直接返回f,即15
*/
1
2
3
4
5
6
console.log(parseInt({}, 16))// NaN
/*
String({})=> "[object Object]"
等价于parseInt("[object Object]", 16)
16进制没有[,直接返回NaN
*/

常见的隐式类型转换

  • 比较操作符:两侧值的类型不同时执行
    • 当操作数是对象,另一个操作数是字符串或数字时会首先调用valueOf方法,当valueOf方法返回的不是基本类型时,才会去调用toString方法
  • 四则运算,除加法外,其他运算均会被转换为数字进行运算,遇到NaN,结果均为NaN。
    • number + number = number
    • number + string = string
    • string + number = string
    • object + number = number
    • object + string = string
    • boolean + string = string(含true/false)
    • boolean + number = number
  • 条件语句

面试题

  • 重写valueOf和toString方法,使得a==1&&a==2&&a==3为true
1
2
3
4
5
6
7
8
9
10
11
12
let a = {
value: 1;
valueOf: function(){
this.value++
}
toString: function(){
this.value++;
}
}
if(a == 1 && a == 2 && a == 3){
console.log(true)
}
  • 下面代码输出什么?
1
2
[9,8,7,6][1,2,3] // outputs 6
[9,8,7,6][8,2,3,1] // outputs 8
  • 解释:逗号运算符会返回最后一个表达式的值