数据类型转换
1. typeof
typeof操作符可以确定任意变量的数据类型,可以返回的值有
- number
- string
- boolean
- object
- undefined
- function
- symbol
泛泛的引用值和null,会返回object;
typeof的两种写法:
typeof(data)
typeof data
注意typeof返回的值是字符串。
2. 数据类型转换
2.1 显式类型转换
2.1.1 Number(mix)
将括号里面的值转化为number类型。
var num1 = Number("123"); //num1 = 123
var num2 = Number(true); //num2 = 1
var num3 = Number(false); //num3 = 0
var num4 = Number(null); //num4 = 0
var num5 = Number(undefined); //num5 = NaN
var num6 = Number('a'); //num6 = NaN
var num7 = Number("-123"); //num7 = -123
var num8 = Number("123abc"); //num8 = NaN
2.1.2 parseInt(string, radix)
- string:要被解析的值;
- radix:基底,可选。从2到36,表示被解析的值的进制。即将以radix进制的数转换为十进制。
基本用法:省略radix,将括号里的值转化为整型的数,浮点数直接去掉小数点,不会进行四舍五入。即默认radix是10。
- 如果字符串头部有空格,空格会被自动去除;
- 字符串转为整数的时候,是一个个字符依次转换,如果遇到不能转为数字的字符,就不再进行下去,返回已经转好的部分;这也是数字直接截断小数点后面的数的原因;
- 如果字符串的第一个字符不能转化为数字(后面跟着数字的正负号除外),返回NaN;
- 如果字符串以0x或0X开头,parseInt会将其按照十六进制数解析;
- 如果字符串以0开头,将其按照10进制解析。
var num1 = parseInt("123"); //num1 = 123
var num2 = parseInt(true); //num2 = NaN
var num3 = parseInt(false); //num3 = NaN
var num4 = parseInt(null); //num4 = NaN
var num5 = parseInt(undefined); //num5 = NaN
var num6 = parseInt('a'); //num6 = NaN
var num7 = parseInt("-123"); //num7 = -123
var num8 = parseInt("123abc"); //num8 = 123
var num9 = parseInt(123.3); //num9 = 123
var num10 = parseInt(123.8); //num10 = 123
var num11 = parseInt("123.3"); //num11 = 123
var num12 = parseInt("123.8"); //num12 = 123
如果第二个参数不是数值,会被自动转为一个整数。这个整数只有在2到36之间,才能得到有意义的结果,超出这个范围,则返回NaN。如果第二个参数是0、undefined和null,则直接忽略。
2.1.3 parseFloat(string)
将解析值转换为浮点数。
2.1.4 String(mix)
将解析值转换为字符串。
2.1.5 Boolean()
将解析值转换为布尔值。
2.1.6 toString(radix)
类似于String(),都是将值转换为字符串。
写法:
var demo = 123;
var str = demo.toString();
但是,undefined
和null
不能用toString转换。这两种数据转换会直接报错。
括号中可以加上基底数,意思是将该数转换为指定进制的数。
var demo = 20;
var str = demo.toString(8); //str = "24"
2.2 隐式类型转换
2.2.1 isNaN()
先将括号中的值用Number()转换为number型数据,再将转换后的数据跟NaN比较,若为NaN,则返回true,否则返回false。
2.2.2 ++/–(自加/自减) +/-(一元正负)
var a = "123";
a ++; //a = 124
++
在自加前,先将需要自加的数据调用Number转换为number数据,再进行自加。
--
同理
+/-
不是指加减,而是正负,其也会将后面的数据用Number()转换为数字类型。
2.2.3 +(加号)
当加号两侧存在字符串使,会调用String()将两边数据转换为字符串型。
注意
NaN + 1 //NaN
2.2.4 -(减号) *(乘号) /(除号) %(求余)
会调用Number()。
2.2.5 &&(逻辑与) ||(逻辑或) !(逻辑非)
会调用Boolean()。
2.2.6 <(小于) >(大于) <=(小于等于) >=(大于等于) ==(等于) !=(不等于)
两边都是字符串时,会比较两者ASCII码大小。
两边有数字有字符串时,会将字符串用Number()转换成数字。
var a = "3" > 2; //a = true
var b = "1" == 1; //b = true
var c = true == 1; //c = true
var d = true > false; //d = true
var e = 1 > 2 > 3; //相当于false > 3,所以e = false
var f = 2 > 3 < 1; //相当于false < 1, 所以f = true
注意undefined < 0, undefined > 0, undefined == 0, null < 0, null > 0, null == 0
均为false。
undefined == null
为true。
NaN == NaN
为false.
[] == []
为false;
{} == {}
为false
引用值比较的是地址,地址一样才相等
var obj = {};
var obj1 = obj;
//此时obj==obj1为ture,obj===obj1也为ture
2.2.7 ===(绝对等于)
undefined === null
为false;
===
两端必须完全一样才可能是true。
特例:
NaN === NaN
为false;
[] === []
为false;
{} === {}
为false
2.2.8 !==(绝对不等于)
由于==
和!=
会发生数据类型转换,这在某些时候会造成一定的麻烦,在会造成逻辑偏差的场合下,会用===
和!==
来代替。
绝对等于/不等于两侧不会发生数据类型转换。此时
var a = 1 === "1"; //a = false
var b = 1 !== "1"; //b = true
但是对于NaN,NaN === NaN
依旧为false。
2.2.9 特别地
若一个变量没有定义直接使用,会报错。
但是有一个特例,typeof(a)
,其中a没有定义也不会报错,此时typeof(a)
的值为"undefined"
,注意这里是字符串。
因此typeof(typeof(undefined))
返回值是"string"
。