一、种类
截止目前,JavaScript有七种数据类型:number,string,boolean,symbol (ES6增),null,undefined,object 。
其中,前六种属于基本数据类型,object 属于可由基本类型组成的复杂类型。
二、熟练掌握
- 数据类型好比经济基础,打好了地基才能构建高楼,这是踏入JS的第一步。
- (由于设计上的Bug)没有一个能完美辅助我们判断上述数据类型的方法。
判断类型常用到 typeof 操作符,typeof xxx 之后得到的都是字符串。
xxx 的类型 | number | string | boolean | symbol | undefined | null | object | function |
---|---|---|---|---|---|---|---|---|
typeof xxx | 'number' | 'string' | 'boolean' | symbol | 'undefined' | 'object' | 'object' | 'function' |
关于 typeof 的两大Bug如下:
typeof null // 'object'
typeof function() {} // 'function'
三、基本类型 number string boolean null undefined
值不可变的,即值本身无法被改变
1. number 数字类型
JavaScript 内部,所有数字均以64位浮点数存储,并没分离出整数类型,所以 1 === 1.0,表示同一个数字。但是当运算需要整数时,JavaScript 又会自动把 64位浮点数 转成 32位整数,然后再进行运算。
浮点 是一种对于实数的近似值数值表现法,由一个有效数字(即尾数)加上幂数来表示,通常是乘以某个基数的整数次指数得到。以这种表示法表示的数值,称为浮点数(floating-point number)。利用浮点进行运算,称为浮点计算,这种运算通常伴随着因为无法精确表示而进行的近似或舍入。
准确性:由于浮点数不能表达所有实数,浮点运算与相应的数学运算有所差异,有时此差异极为显著。
—— 摘取自维基百科
相对定点数而言,浮点数是小数点可变的数,从上述定义可以看出,浮点数不是精确的值,它的小数运算可能由于丢失精度,往往不是我们所期望的结果,所以涉及小数的比较和运算要特别小心。
0.2 + 0.4 // 0.6000000000000001
0.6 / 0.1 // 5.999999999999999
(0.3 - 0.2) === (0.2 - 0.1) // false
数值表示和进制
数字可采用科学计数法表示,使用 e 或 E进行缩写,如:1.23e2 == 123。
当 ①小数点前的数字多于21位 ②小数点后的零多于5个,此时JavaScript会自动数值转为科学计数法表示。
JavaScript 的整数有4种字面量表示格式,分别是十进制、二进制、八进制、十六进制,而且默认情况下,其他进制表示的数值会自动转为十进制表示。
- 十进制:没有前导0或单个数值大于7的数值。
71 // 71
081 // 81
- 二进制:有前缀0b或0B的数值。
0b1001 // 9
0B010 // 2
- 八进制:有前缀0o或0O的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。
前导 0 表示八进制,处理时很容易造成混乱。ES5 的严格模式和 ES6,已经废除了这种表示法,但是浏览器为了兼容以前的代码,目前还继续支持这种表示法。
071 // 57
0o11 // 9
- 十六进制:有前缀0x或0X的数值。
0x11 // 17
0XA1 // 161
特殊数值
number类型包含几个特殊数值,包括 +0、-0、NaN、+Infinity、-Infinity。
NaN表示“非数字”(Not a Number),一些数值相关操作出错时就会得到NaN,可通过 !isNaN(xx) 判断该值是否为有效数字,还有 typeof NaN == 'number'。
2. string 字符串类型
零个或多个字符由成对的单引号'' 或 双引号 "" 包裹起来的形式就是字符串
转义
为什么要转义?
- 字符串的内容包含单引号或双引号
- 字符串中表示一些特殊含义的字符,如换行符、制表符等
转义符
转义符以反斜杠(\)开头,用来表示一些特殊字符。
串。
转义符 | 含义 | Unicode 字符值 |
---|---|---|
\0 | null | \u0000 |
\b | Backspace | \u0008 |
\f | 换页符 | \u000C |
\n | 换行符 | \u000A |
\r | 回车键 | \u000D |
\t | 制表符 | \u0009 |
\v | 垂直制表符 | \u000B |
' | 单引号 | \u0027 |
" | 双引号 | \u0022 |
\ | 反斜杠 | \u005C |
多行字符串(一个字符串分多行书写)
// ① \后不能任何字符,换行后的必须顶格,出错难找,如②
var s = '1234 \
590'
// ② 报错
var s = '1234 \
590'
// ③ 前两种都不推荐
var s3 = '1234' +
'590'
// ES6 新增
var s4 = `1234
590` // 包括了输入的特殊字符 等价于 "1234 ↵ 590"
s4.length // 10
3. boolean 布
1)“布尔”的由来:纪念一位敬业的逻辑学家乔治·布尔而得名
2)取值,只有两个值:true(真) 和 false(假)
3)&&(逻辑且) 、||(逻辑或) 逻辑操作真值表口诀: a && b 一假必假; a || b 一真必真
4)熟记五个falsy值:0 null undefined NaN ''或""(空字符串)
4. symbol 符号
唯一特性:使用Symbol()可以创建一个全局唯一的值,其类型为symbol。
5. null 和 undefined
两者皆表示什么也没有,它们的区别如下:
1)语法上,如果变量只是声明没赋值,则它默认值为 undefined
2)惯例而言,有一个对象object,现在还不想赋值,则赋值为 null(一般表示空对象);有一个非对象,还不想给值时,则赋值为 undefined(一般表示空非对象)。
四、复杂类型(object 对象)
1. 概述
对象(object)是最重要的数据类型。
对象就是哈希表,即一组“键值对“(key: value)的集合,是一种无序的复合数据集合。
2. 声明赋值
var person = {
name: 'Amanda',
age: 22,
married: undefined,
graduate: true,
'good-friends': {
name: 'June'
},
'': null
}
- key: value的形式中key为字符串,value可以是任意七种数据类型。
- 空串属于字符串,可以被当作对象数据的key。
- 如果key为合法标识符,书写时,作为字符串标识的引号可以被省略,但key仍然是字符串。
3. 访问、编辑对象
两种访问对象的方式:(1)变量名[key] (2)变量名.key
var obj = {
code: 0001,
'data-text': 'a box'
}
obj.code // 0001
obj['code'] // 0001
obj['data-text'] // 'a box'
obj.data-text // Uncaught ReferenceError: text is not defined
// 赋值
obj.name = 'div'
obj.name = undefined
'name' in obj // true
delete obj.name // 删除obj.name属性
'name' in obj // false
Object.keys(obj) // ["code", "data-text"]
由上可知,变量名[key] 属于通用方法,只有当key满足合法标识符时,才能使用 变量名.key 访问。
- 通过 delete命令 删除对象属性
- in 操作符判断对象中是否存在这个key
- Object.keys 方法获取一个对象所有的key