天天看点

显示类型转换和隐式类型转换

显示类型转换

1.Number():函数把对象的值转换为数字,如果对象的值无法转换为数字,那么 Number() 函数返回 NaN。

var a = 'true';
        console.log(typeof(Number(a)) + '-' + Number(a)); // number-NaN
        var a = '1a';
        console.log(typeof(Number(a)) + '-' + Number(a)); // number-NaN
        var a = undefined;
        console.log(typeof(Number(a)) + '-' + Number(a)); // number-NaN
        var a = null;
        console.log(typeof(Number(a)) + '-' + Number(a)); // number-0
        var a = '123';
        console.log(typeof(Number(a)) + '-' + Number(a)); //number-123
        var a = true;
        console.log(typeof(Number(a)) + '-' + Number(a)); //number-1
           

2.parseInt():函数可解析一个字符串,并返回一个整数

var a = '3.14';
        console.log(typeof(parseInt(a)) + '-' + parseInt(a));//number-3
        var a = true;
        console.log(typeof(parseInt(a)) + '-' + parseInt(a));//number-NaN
        var a = null;//undefined,NaN
        console.log(typeof(parseInt(a)) + '-' + parseInt(a));//number-NaN
        var a='10';
        console.log(parseInt(a,16));//16
        var a='b';
        console.log(parseInt('abc123'));//NAN
        var a='b';
        console.log(parseInt('123abc'));//123 
           

3.parseFloat():函数可解析一个字符串,并返回一个浮点数

var a = 'b';
        console.log(parseFloat('3.1415')); //3.1415
        var num = parseFloat('3.1415')
        console.log(num.toFixed(2));//3.14  四舍五入
           

4.String():函数把需要转换的值转换为字符串,并返回。

console.log(typeof(String(123))); //string
        console.log(typeof(123 + '')); //string
           

5.toString()

var str = '3.14';
        console.log(str.toString()); //3.14
        var str = undefined; //null也没有toString()
        console.log(str.toString()); //报错
        var str = '100';
        console.log(parseInt(str, 2));//二进制100变十进制  4
        console.log(parseInt(str, 2).toString(16));//4
           

6.Boolean()

console.log(Boolean(1));//true
        console.log(Boolean(null));//false  NAN 空字符串 0 undefined null
           

隐式类型转换

+运算符内部会隐式调用String()

var a = 'a' + 1; //String(1) 'a'+'1'=a1
     console.log(a) //a1
           

运算符内部(-,*,/,%)会隐式调用Number()

var a = '3' * 2; //* / - % str-->Number转换为数字
     console.log(a); //6
     var a = '1' > 2; //转换成Number >=<
     console.log(a); //false
     //转换成ASCII var a='a'>'b';
     var a=1=='1';
     console.log(a);//true
     var a=1==='1';//不进行隐式转换
     var a=NaN==NaN;//false
           

内部会隐式调用Bollean()

var a1=2>1>3;
     var a2=2>1==1;
     console.log(a1);//false
     console.log(a2);//true
     var a=undefined>0;//undefined和null既不大于0也不小于0 也不等于0
     var a=null==0;//false
     var a=undefined==null;//true
     var a=undefined===null;//false
     console.log(a)//false
           

运算符内部(++/–,正负)会隐式调用Number()

var a = '123';
     a++;
     console.log(a); //124
     var num='123';
     console.log(typeof(+num));//number
     var num='abc';
     console.log(typeof(-num)+':'+-num);//number:NaN
           

isNaN() 需要经过Number()处理

console.log(isNaN(NaN));//true
     console.log(isNaN(undefined))//true
     console.log(isNaN(null));//false
     console.log(isNaN('ab'));//true
     console.log(isNaN('null'));//true
     console.log(isNaN(1));//false
           

经典面试题

1.if(typeof(a) &&(-true) +(+undefined)+ ' '){
   //"undefined" && "NaN "  (-1+NaN+' ')
   console.log('通过了')
  }else{
   console.log('没通过')
  }
   console.log(a);
   //通过了
   //a is not defined
           

未被定义的变量直接console.log会报引用错误,但是放在typeof里面不会出错。

2.console.log(!!' '+!!''-!!false || '未通过');
//1
           

或运算符遇到一个条件为真就直接输出运算结果,遇到条件为假的情况就继续判断。

分析:前面的’ ‘中是一个空格,空格是true,在两次!之后还是true,遇到+运算符转换为数字1,后面的’'是一个空字符串,它是false,两次!!后还是false,转换为数字0,由此可知,或运算符前面的计算结果是1,所以结果为1。

3.window.a || (window.a = '1');
  console.log(window.a);
 //'1'
           

分析:括号的面的优先级是最高的,先看括号里面的内容。

4.var =???
  if(a == 1 && a == 2 && a == 3){
  console.log("1");
  }
           

分析:与运算符条件条件全部为真才会输出运算结果。上述题中,a需要满足三个条件,此时应该想到复杂数据类型转换。

复杂数据类型转number顺序如下:

1.先使用valueOf()方法获取其原始值,如果原始值不是number类型,则使用 toString()方法转成string

2.再将string转成number运算

对象的valueOf()方法是可以重写的。

var a = {
i : 0,//声明一个属性i
valueOf:function ( ) {
return ++a.i;//每调用一次,让对象a的i属性自增一次并且返回
}
}
if (a == 1 && a == 2 && a == 3){//每一次运算时都会调用一次a的valueOf()方法