Undefined
Undefined
只有一个特殊值,即undefind
,在使用var申明变量但没有对其赋值时,这个变量值就是undefined
,例如:
var message;
message == undefined // true
Null
Null
是JS中第二个只有一个值的数据类型,其值为null
。null
值表示一个空对象指针,使用typeof
检测会返回object
,例如:
var car = null;
typeof car // 'object'
undefined
派生自null
,所以null == undefined
会返回true
。
Boolean
布尔类型返回两个值,即true
和false
数据类型与布尔值之间的转换
数据类型 | 转换为true值 | 转换为false值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | "" (空字符串) |
Number | 任何非零数值(包括无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | 不适用 | undefined |
Number
使用number
类型来表示正数与浮点数。number
类型除了可以表示10进制数外,还可以表示8进制,16进制等。
JS中可以保存+0
和-0
。+0 == -0 // true
- 浮点数 & 科学计数法
浮点数保存需要的内存,是正数值的2倍。所以JS中不符合浮点数规则的数会自动被转换为正数
var float1 = 1. // 将被解析为整数 1
var float2 = 10.00 // 将被解析为整数 10
对于极大或者极小的数,可以使用e
科学计数法表示
var float2 = 3.14e7 // 表示 3.14*10的7次方
var float2 = 3.14e-7 // 表示 3.14*10的-7次方
浮点数的最高精度是17位,但是做数学运算的时候,其精度远远不及整数
var a = 0.1+0.2 // 并不是输出0.3 而是 0.30000000000004
所以,最好不要用浮点数做运算和做判断。
JS中能够表达的最大的值,保存在Number.MAX_VALUE
,表达的最小的值,保存在Number.MIN_VALUE
中。
Number.MAX_VALU // 1.7976931348623157e+308
Number.MIN_VALUE //5e-324
如果某次运算超出了JS的数值计算范围,则会返回Infinity
,负数为-Infinity(负无穷)
,正数为Infinity(正无穷)
,可以使用isFinite()
函数检测是不是位于最大值和最小值之间,该函数返回布尔值
- NaN & isNaN
NaN
表示非数值。这个值表示一个要返回数值的操作并未返回数值。任何与NaN
的操作,都会返回NaN
,比如NaN/10 // NaN
,NaN
不与任何值相等,包括它自己,NaN == NaN // false
isNaN函数,帮助我们确定这个参数是否'不是一个数值',任何不能被转换为数值的值,都会导致这个函数返回true
isNaN(NaN) // true
isNaN(10) // false 10是一个数
isNaN('10') // false 可以被转换为number
isNaN('blue') // true 不能被转换为number
isNaN(true) // false 可以被转换为数值 1
尽管有点儿不可思议,但
isNaN()
确实也适用于对象。在基于对象调用isNaN()
函数时,会首先调用对象的valueOf()
方法,然后确定该方法返回的值是否可以转 换为数值。如果不能,则基于这个返回值再调用toString()
方法,再测试返回值。 而这个过程也是ECMAScript
中内置函数和操作符的一般执行流程。
- 数值转换
Number() parseInt() parseFloat()
Number
可以用于任何数据类型,另外两个则专门用于把字符串转成数字,这3个函数对同样的输入会返回不同的结果。
Number()函数的转换规则如下。
- 如果是
Boolean
值true
和false
将分别被转换为1
和0
。 - 如果是数字值,只是简单的传入和返回。
- 如果是
null
值,返回0
。 - 如果是
undefined
,返回NaN
。 - 如果是字符串,遵循下列规则:
1、如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即"1" 会变成 1,"123"会变成 123,而"011"会变成 11(注意:前导的零被忽略了);
2 、如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(同样,也会忽略前导零);
3 、如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整数值;
4 、如果字符串是空的(不包含任何字符),则将其转换为 0;
5 、如果字符串中包含除上述格式之外的字符,则将其转换为NaN
。 - 如果是对象,则调用对象的
valueOf()
方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN
,则调用对象的toString()
方法,然后再次依照前面的规则转换返回的字符串值。
var num1 = Number("Hello world!"); //NaN
var num2 = Number(""); //0
var num3 = Number("000011"); //11
var num4 = Number(true); //1
字符串"Hello world!"会被转换为NaN
,因为其中不包含任何有意义的数字值。空字符串
会被转换为 0。字符串"000011"会被转换为 11,因为忽略了其前导的零。最后,true
值被转换为 1。
parseInt()
忽略字符串的空格,找到第一个非空字符串,如果第一个字符不是数字字符或者符号,则返回NaN
。用parseInt()
转换空字符串会返回 NaN
(Number()
对空字符返回0
)。如果遇到非数字字符,则停止解析。同时parseInt
也能够字符解析8进制(ES3 ES5不具备解析8进制的能力
),16进制等。
var num1 = parseInt("1234blue"); // 1234
var num2 = parseInt(""); // NaN
var num3 = parseInt("0xA"); // 10(十六进制数)
var num4 = parseInt(22.5); // 22
var num5 = parseInt("070"); // 56(八进制数)
var num6 = parseInt("70"); // 70(十进制数)
var num7 = parseInt("0xf"); // 15(十六进制数)
同时,parseInt
可以传入第二个参数,具体按照什么进制来转换
var n1 = parseInt(70,10) // 按照10进制解析
var n2 = parseInt(70,8) // 按照8进制解析
parseFloat
与parseInt
差不多,只是parseFloat
只能解析10进制的数,所以没有第二个参数。
String
- toString方法
Number
、Boolean
、Object
和String
值(没错,每个字符串也都有一个 toString()方法,该方法返回字 符串的一个副本)都有toString()
方法。但null
和undefined
值没有这个方法。Number
调用toString
可以传递参数,即需要转换的字符基数。默认按照10进制输出
var num = 10;
alert(num.toString()); // "10"
alert(num.toString(2)); // 2进制 "1010"
alert(num.toString(8)); // 8进制 "12"
alert(num.toString(10)); // 10进制 "10"
alert(num.toString(16)); // 16进制 "a"
- String方法
String函数转换规则
1 、 如果值有toString()
方法,则调用该方法(没有参数)并返回相应的结果
2 、 如果值为null
,则返回'null'
3 、 如果值为undefined
,则返回'undefined'
var value1 = 10;
var value2 = true;
var value3 = null;
var value4;
alert(String(value1)); // "10"
alert(String(value2)); // "true"
alert(String(value3)); // "null"
alert(String(value4)); // "undefined"
Object
Object
类型所具有的任何属性和方法也同样存在于更具体的对象中。
Object
的每个实例都具有下列属性和方法。
-
constructor
:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数(constructor
) 就是Object()
。 -
hasOwnProperty(propertyName)
:用于检查给定的属性在当前对象实例中(而不是在实例 的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串形式指定(例 如:o.hasOwnProperty("name")
)。 -
isPrototypeOf(object)
:用于检查传入的对象是否是传入对象的原型 -
propertyIsEnumerable(propertyName)
:用于检查给定的属性是否能够使用for-in
语句来枚举。与hasOwnProperty()
方法一样,作为参数的属性名必须以字符=串形式指定。 -
toLocaleString()
:返回对象的字符串表示,该字符串与执行环境的地区对应。 -
toString()
:返回对象的字符串表示。 -
valueOf()
:返回对象的字符串、数值或布尔值表示。通常与toString()
方法的返回值相同。