1. js一共6种数据类型:
- 5中基本数据类型(也叫做简单数据类型)
Undefined Null Boolean Number String
- 1种复杂数据类型
Object
2. typeof操作符检测结果
- "undefined" // 这个值未定义,声明了没有给值
- "boolean" // 这个值是布尔值
- "string" // 这个值是字符串
- "number" // 这个值是数值
- "object" // 这个值是对象或null
- "function" // 这个值是函数
3. Null类型
Null类型是第二个只有一个值的数据类型(另一个是Undefined),这个特殊的值是null。
null的使用
如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null而不是其它值。这样一来,只要检查null值就可以知道相应的变量是否已经保存了一个对象的引用,如下面的例子所示:
if(car != null){
// 对car 对象执行某些操作
}
typeof检测null值时会返回"object"
从逻辑上讲,null值表述一个空对象指针,而这正是使用typeof检测null值时会返回"object"的原因
undefined == null 为true
实际上,undefined值派生自null值,因此ECMA-262规定测试它们的相等性测试要返回true
4. Boolean类型
- 该类型只有两个字面值:true 和 false
- 数据类型对应转换规则表
| 数据类型 | 转换为true的值 | 转换为false的值 |
|---|---|---|
| Boolean | true | false |
| String | 任何非空字符串 | "" (空字符串,注意,如果字符串有空格也不是空字符串) |
| Number | 任何非零数字值(包括无穷大) | 0和NaN |
| Object | 任何对象 | null |
| Undefined | undefined |
5. Number类型
进制的表示
- 10进制,
最基本的数值字面量格式,可以直接在代码输入
var intNum = 55
- 8进制:
八进制的字面值第一位必须是0,后面是8进制序列(0-7)
在严格模式下无效,支持严格模式的JavaScript引擎会抛出错误
var octalNum1 = 070 // 八进制的56
var octalNum2 = 079 // 无效的八进制值,接续为 79
var octalNum3 = 08 // 无效的八进制,解析为8
- 16进制
十六进制的前两位是0x,后面是16进制序列(0-9及A-F),字母A-F也可以小写
var hexNum1 = 0xA // 16进制的10
var hexNum2 = 0x1f // 16进制的31
在进行算术运算时,所有的8进制以及16进制表示的数值最终都会被转成16进制数值
NaN
Not a Number 是一个特殊的数值,这个数值便是一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)
NaN的特点:
- 任何涉及NaN的操作(例如NaN/10)都会返回NaN。
- NaN和任何值都不相等,包括NaN本身
isNaN()函数
- isNaN()在接收一个值之后,会尝试将这个值转换为数值。某些不是数值的值会直接转换为数值,例如字符串"10"或Boolean值
- 任何不能被转为数值的值都会导致这个函数返回true
数值转换
1. 有三个函数可以将非数值转换为数值:
- Number()
- parseInt()
- parseFolat() Number()可以用于任何数据类型 parseInt()、parseFlost() 专门用于把字符串转换成数值
2. Number() 函数转换规则如下
-
如果是Boolean值,true和false将分别转换为1和0
-
如果是数字值,只是简单的传入和返回
-
如果是null值,返回0
-
如果是undefined值,返回NaN
-
如果是字符串,遵循下列规则
1. 如果字符串中只包含数字(包括前面带正负号的情况),则将其转换为10进制值,"011"会变成11(注意,前导0被忽略了)
2. 如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(同样,也会忽略前导0)
3. 如果字符串中包含有效的16进制格式,例如"0xf",则将其转换为相同大小的10进制整数值
4、如果字符串是空的(不包含任何字符或者空格字符也是可以的),则将其转换为0
5. 如果字符串中包含除上述格式之外的字符,将其转换为NaN
6. 如果是对象,则调用对象的valueOf()方法,然后按照前面的规则转换返回的值。如皋转换的结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串值
3. parseInt()
parseInt()在转换字符串时,更多的是看其是否符合数值模式。
(1)它会忽略字符串前面的空格,知道找到第一个非空格字符。如果第一个字符不是数字字符或者负号,parseInt()就会返回NaN;也就是说,用parseInt()转换空格会返回NaN.
(2) 如果第一个字符是数字字符,parseInt()会继续解析第二个字符,知道解析完后续字符或者遇到了一个非数字字符。
(3)如果字符串中的第一个字符是数字字符,parseInt()能够识别出各种进制的整数格式:10进制、8进制、16进制。 如果字符串以"0x"开头后跟数字,则为16进制; 如果字符串以"0"开头后跟数字,则为8进制;(8进制解析会有分歧,不建议使用)
(4)parseInt()提供第二个参数:转换时使用的基数(进制数)
4. parseFloat()
(1)parseFloat()和parseInt()一样从第一个字符(位置0)开始解析每个字符。
(2)parseFloat()一直解析到字符串末尾,或者解析遇到一个无效的浮点数字字符为止。也就是说,字符串中的第一个小数点时有效的,第二个小数点就是无效的了,因此它后面的字符串将被忽略。
(3)parseFloat()它始终会忽略前导的0。parseFloat()只解析10进制值,没有第二个参数指定基数(进制数)的用法。parseFloat()解析16进制格式的字符串结果始终为0
(4)如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后都是0),parseFloat()会返回整数。
6. String类型
字符字面量
| 字面量 | 含义 |
|---|---|
| \n | 换行 |
| \t | 制表 |
| \b | 退格 |
| \r | 回车 |
| \f | 进纸 |
| \ | 斜杠 |
| ' | 单引号 |
| '' | 双引号 |
| \xnn | 以16进制代码nn表示的一个字符()。例如,'\x41'表示'A' |
| \unnn | 以16进制代码nnn表示的一个Unicode字符(其中n为0~F) |
这些字符字面量可以出现在字符串中的任意位置,而且也将被作为一个字符来解析。如下例所示:
转换为字符串
(1)数值、布尔值、对象和字符串值都有toString()方法。但null和undefined值没有这个方法
(2)toString()可传参数:输出数值的基数(进制数)
(3)String()函数转换规则:
@ 如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果
@如果值是null,则返回"null"
@如果值是undefined,则返回"undefined"
7. Object类型
创建自定义对象:
var o = new Object()
var o = new Object //省略(),有效但不推荐
Object的实例都有以下属性和方法:
- constructor:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数(constructor)就是Object()
- hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串的形式指定(例如:o.hasOwnProperty('name'))
- isPropertyOf(object):用于检查传入的对象是否是当前对象的原型
- propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举。作为参数的属性名必须以字符串形式指定
- toLocalString():返回对象的字符串表示,该字符串与执行环境的地区对应
- toString():返回对象的字符串表示
- valueOf():返回对象的字符串、数值或者布尔值表示。通常与toString()方法返回值相同
摘自: 《Javascript 高级程序设计 (第三版)》