一、先了解一下什么是'NaN'、八进制、十六进制
1.NaN
NaN意思是“不是数值”(Not a Number),用于表示本来要返回数值的操作失败了(而不是抛出错误)。比如,用0除任意数值在其他语言中通常都会导致错误,从而中止代码执行。NaN,意思是“不是数值”(Not a Number),用于表示本来要返回数值的操作失败了(而不是抛出错误)。比如,用0除任意数值在其他语言中通常都会导致错误,从而中止代码执行。
但在ECMAScript中,0、+0或-0相除会返回NaN:
console.log(0/0); // NaN
console.log(-0/+0); // NaN
如果分子是非0值,分母是有符号0或无符号0,则会返回Infinity或-Infinity:
console.log(5/0); // Infinity
console.log(5/-0); // -Infinity
NaN有几个独特的属性。首先,任何涉及NaN的操作始终返回NaN(如NaN/10),在连续多步计算时这可能是个问题。其次,NaN不等于包括NaN在内的任何值。
例如,下面的比较操作会返回false:
console.log(NaN == NaN); // false
2.八进制
八进制由0-7组成,逢八进一。
八进制数采用0-7这八位数来表达一个数。
转换为10进制:从右到左依次乘以8的零次方,8的二次方。。。然后相加。
在js的Number类型中,对于八进制字面量,第一个数字必须是零(0),然后是相应的八进制数字(0-7),超过了应有的范围就会,忽略前缀零(0),后面的数字当成十进制数。
如下所示:
let octalNum1 = 070; // 八进制的56
let octalNum2 = 079; // 无效的八进制值,当成79处理
let octalNum3 = 08; // 无效的八进制值,当成8处理
3.十六进制
十六进制是逢16进一,但是数字就只有0-9,所以我们用A、B、C、D、E、F这6个字母分别表示10、11、12、13、14、15,字母不区分大小写。
转换为10进制:从右到左依次乘以16的零次方,16的二次方。。。然后相加。
在js的Number类型中,创建十六进制字面量,必须先是真正的数值前缀0x(区分大小写),然后是十六进制数字(0~9以及A~F)。十六进制数字中的字母大小写均可。下面是几个例子:
let hexNum1 = 0xA; // 十六进制10
let hexNum2 = 0x1f; // 十六进制31
使用八进制和十六进制格式创建的数值在所有数学操作中都被视为十进制数值。
二、数据类型转换的方法
转换为字符串
1.toString()方法
这个方法唯一的用途就是返回当前值的字符串等价物,但是不能转null和undefined
如: let found = true;
let foundAsString = found.toString(); // 字符串 "true''
toString()可以接收一个底数参数,即以什么底数来输出数值的字符串表示。默认情况下,toString()返回数值的十进制字符串表示。而通过传入参数,可以得到数值的二进制、八进制、十六进制,或者其他任何有效基数的字符串表示
比如:
let num = 10;
console.log(num.toString()); // "10"
console.log(num.toString(2)); // "1010“
2.string()方法
这个方法就都能转,没有参数,如果是null和undefined则返回字面量文本。
3.隐式转换
当一个num+"",如果+号两边有一个字符串类型,另一个是其它类型时,会先把其它类型转换成字符串再进行字符串拼接,最后返回字符串。
转换为数值类型
1.Number()方法
这个方法可以把任意值转换成数值
boolean:true转换为1,false转换为0
数值,返回本体,除去有效8进制,16进制,其它会忽略前面的0哦
null,“”(空字符串),返回0
undefined,返回NaN
字符串,如果有一个不是数值的字符返回NaN
如果字符串包含有效的十六进制格式如"0xf",则会转换为与该十六进制值对应的十进制整数值。
2.parseInt()
这个方法字符串最前面的空格会被忽略,从第一个非空格字符开始转换。如果第一个字符不是数值字符、加号或减号,parseInt()立即返回NaN。这意味着空字符串也会返回NaN(这一点跟Number()不一样,它返回0)。
如果第一个非空字符数值字符、加号或减号,则继续依次检测每个字符,直到字符串末尾,或碰到非数值字符。
如果字符串以"0x"开头,就会被解释为十六进制整数。如果字符串以"0"开头,且紧跟着数值字符,在非严格模式下会被某些实现解释为八进制整数。
如:
let num2 = parseInt(""); // NaN
let num3 = parseInt("0xA"); // 10,解释为十六进制整数
let num4 = parseInt(22.5); // 22
let num5 = parseInt("70"); // 70,解释为十进制值
let num6 = parseInt("0xf"); // 15,解释为十六进制整数
var num1 = "070";
var num2 = 070;//解释为8进制
document.write(parseInt(num1));//=>70
document.write(parseInt(num2));//=>56
parseInt()函数更专注于字符串是否包含数值模式。
parseInt()也接收第二个参数,用于指定底数(进制数)。如果知道要解析的值是十六进制,那么可以传入16作为第二个参数,以便正确解析
let num = parseInt("0xAF", 16); // 175
3.parseFloat()
parseFloat()函数的工作方式跟parseInt()函数类似,都是从位置0开始检测每个字符。同样,它也是解析到字符串末尾或者解析到一个无效的浮点数值字符为止。
parseFloat()始终忽略字符串开头的零。
十六进制数值始终会返回0。因为parseFloat()只解析十进制值,因此不能指定底数。
如果字符串表示整数(没有小数点或者小数点后面只有一个零),则parseFloat()返回整数。
let num2 = parseFloat("0xA"); // 0
4.隐式转换
var num1 = "45ps";
var num2 = "45";
var num3 = num1 - 0;
var num4 =num2 - 0;// 将num2转换为了number类型
document.write(num3);//=>NaN
document.write(num4);//=>45
document.write(typeof(num4));//=>number
转换为布尔类型
1.Boolean()
转换为false的情况:
""空字符串
0、NaN
null
undefined
转换为true的情况:
非空字符串
非零数值包括正无穷负无穷
N/A(不存在)
2.if判断转换
if(num){
}
3.逻辑非转换
!!
三、有关数据类型转换的题
1
// let num =parseFloat("0x22.85Neu");
// document.write(num); =>0
2
// let num = 0xif;
// document.write(num); /=>空白
3
// let message = null;
// if(message){ =>青城山
// document.write("都江堰");
// }else{
// document.write("青城山");
// }
4
// let octalNum1 = 070; // 八进制的56
// document.write(octalNum1);=>56,如果字面量中包含的数字超出了应有的范围,就会忽略前缀的零
5
// let num =Number("");
// document.write(num); =>0
6
// let num = parseInt("0xf");
// document.write(num);// =>15
感谢我的js老师——胡晓飞老师,让我知道到了别一味追进度做项目,沉下心来想想这些最基础,或许能有别样的感悟。