概述
JavaScript语言的每一个值,都属于一种数据类型,共有七种:number
、string
、boolean
、symbol
(ES6新增)、undefined
、null
、object
。 注意没有 array
类型也没有 function
类型。
一、number
- 整数和小数:
1
、1.1
、.1
- 科学记数法:
1.23e2
- 二进制:
0b11
- 八进制:
011
(后来 ES5 添加了 0o11 语法) - 十六进制:
0x11
二、string
- 空字符串:
''
- 多行字符串:
var s = '12345' + '67890' // 无回车符号 或 var s = `12345 67890` // 含回车符号复制代码
- 转义符
反斜杠(\)在字符串内有特殊含义,用来表示一些特殊字符,所以又称为转义符。
需要用反斜杠转义的特殊字符,主要有下面这些:
\0 null(\u0000)\b 后退键(\u0008)\f 换页符(\u000C)\n 换行符(\u000A)\r 回车键(\u000D)\t 制表符(\u0009)\v 垂直制表符(\u000B)\' 单引号(\u0027)\" 双引号(\u0022)\\ 反斜杠(\u005C)复制代码
上面这些字符前面加上反斜杠,都表示特殊含义。如果在非特殊字符前面使用反斜杠,则反斜杠会被省略。如果字符串的正常内容之中,需要包含反斜杠,则反斜杠前面需要加一个反斜杠,用来对自身转义。
三、boolean
- boolean 的取值只有两个值:
true
和false
如果JS预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为false,其他值都视为true。
undefinednullfalse0NaN""或''(空字符串,引号之间没有空格)复制代码
a && b
在a
和b
都为true
时,取值为true
;否则为false
a || b
在a
和b
都为false
时,取值为false
;否则为true
四、symbol
Symbol
是ES6引入的一种新原始数据类型,表示独一无二的值。
Symbol
值通过 Symbol
函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol
类型。凡是属性名属于 Symbol
类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。
五、undefined 和 null
null
与 undefined
都可以表示“没有”,含义非常相似。将一个变量赋值为 undefined
或 null
,语法效果几乎没区别。
在 if
语句中,它们都会自动转为 false
,相等运算符 ==
甚至直接报告两者相等。
undefined == null //true复制代码
都表示没有值,至于 JS 为什么有两个表示「没有值」的东西:
1995年JavaScript诞生时,最初像Java一样,只设置了null作为表示"无"的值。根据C语言的传统,null被设计成可以自动转为0。但是,JavaScript的设计者Brendan Eich,觉得这样做还不够,有两个原因。首先,null像在Java里一样,被当成一个对象。但是,JavaScript的数据类型分成原始类型和合成类型两大类,Brendan Eich觉得表示"无"的值最好不是对象。其次,JavaScript的最初版本没有包括错误处理机制,发生数据类型不匹配时,往往是自动转换类型或者默默地失败。Brendan Eich觉得,如果null自动转为0,很不容易发现错误。因此,Brendan Eich又设计了一个undefined。
- (规范)如果一个变量没有被赋值,那么这个变量的值就是
undefiend
- (习惯)如果你想表示一个还没赋值的对象,就用
null
。如果你想表示一个还没赋值的字符串/数字/布尔/symbol,就用undefined
(但是实际上你直接var xxx
一下就行了,不用写var xxx = undefined
)
六、object
object
就是上面几种基本类型(无序地)组合在一起;object
里面可以有object
:
var person = { name: 'aaa', 'child': { name: 'bbb' }, // 最后这个逗号可有可无 }复制代码
object
的key
一律是字符串,不存在其他类型的key
;object['']
是合法的;object['key']
可以写作object.key
;- 注意
object.key
与object[key]
不同; delete object['key']
(delete命令用于删除对象的属性);'key' in object
(in运算符用于检查对象是否包含某个属性,注意检查的是键名,不是键值);
七、type of 操作符
- 数值、字符串、布尔值分别返回字符串
number
、string
、boolean
typeof 123 //"number" typeof '你好' //"string" typeof true //"boolean"复制代码
- 函数返回字符串
function
function f() {} typeof f //"function"复制代码
- undefined
undefined
返回字符串'undefined'
。
typeof undefined //"undefined"复制代码
利用这一点,typeof
可以用来检查一个没有声明的变量,而不报错。
v //ReferenceError: v is not defined typeof v //"undefined"复制代码
上面代码中,变量 v
没有用 var
命令声明,直接使用就会报错。但是,放在 typeof
后面,就不报错了,而是返回 undefined
。 实际编程中,这个特点通常用在判断语句:
// 错误的写法 if (v) { // ...} //ReferenceError: v is not defined // 正确的写法 if (typeof v === "undefined") { // ...}复制代码
- 其他 除此以外,其他情况都返回
object
。
typeof window //"object" typeof {} //"object" typeof [] //"object" 数组本质上只是一种特殊的对象 typeof null //"object"复制代码
这里 null
的类型也是 object
,这是由于历史原因造成的。为了兼容以前的代码,后来就没法修改了。这并不是说 null
就属于对象,本质上 null
是一个类似于 undefined
的特殊值。