显示类型转换
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()方法