一、数据类型
- JavaScript 语言的每一个值,都属于某一种数据类型。 JavaScript 共有七种数据类型:
- 数值(number):包括整数和小数(比如
1
和3.14
)- 字符串(string):即文本(比如
Hello World
)- 布尔值(boolean):表示真伪的两个特殊值,即
true
和false
- Symbol:ES6 新增,定义对象的唯一属性名
- undefined:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值
- null:表示空值,即此处的值为空
- 对象(object):各种值组成的集合
-
基本(简单)数据类型:数值、字符串、布尔值、Symbol、undefined、null
复杂数据类型:对象 - 对象是最复杂的数据类型,又可以分成三个子类型:狭义的对象(object)、数组(array)、函数(function)。
- 空数组
[]
的类型也是 object,本质上只是一种特殊的对象。
-
typeof
运算符
用以判断数据类型,返回一个值的数据类型。
typeof 123 // "number"
typeof 'abc' // "string"
typeof false // "boolean"
typeof undefined // "undefined"
typeof {} // "object"
- 两种特殊情况:
null
和function
function f() {} // "function"
typeof null // "object"
二、 null 和 undefined
null
与undefined
都可以表示“没有”,含义非常相似。
- 二者区别:
-
null
是一个表示“空”的对象,转为数值时为 0. -
undefined
是一个表示”此处无定义”的原始值,转为数值时为 NaN.
- 常见语法惯例:
- 变量没有赋值 —— undefined
- 声明一个对象 object,暂时不想给值
var obj = null
—— null
声明一个非对象,暂时不想给值var n (= undefined)
—— undefined
三、布尔值
布尔值代表“真”和“假”两个状态。
“真”用关键字 true
表示,“假”用关键字 false
表示。
- 下列运算符会返回布尔值:
两元逻辑运算符:
&&
(And),||
(Or)
前置逻辑运算符:!
(Not)
相等运算符:===
,!==
,==
,!=
比较运算符:>
,>=
,<
,<=
- 两元运算符运算规则:
a && b:
true && true = true 、 true && false = false 、 false && false = false
a || b:
true && true = true 、 true && false = true 、 false && false = false
- 如果 JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为 false,其他值都视为 true。
undefined
、null
、false
、0
、NaN
、""
或''
(空字符串)
- 布尔值往往用于程序流程的控制。
四、数值
- 整数和浮点数
- JavaScript 内部,所有数字都是以 64 位浮点数形式储存,整数也是。所以
1===1.0
,它们是同一个数。 - JavaScript 语言的底层根本没有整数,所有数字都是小数(64位浮点数)
- 数值精度
-
JavaScript 浮点数的 64 个二进制位组成(从最左边开始):
第 1 位:符号位,
0
表示正数,1
表示负数
第 2 位到第 12 位(共11位):指数部分
第 13 位到第 64 位(共52位):小数部分(即有效数字) 符号位决定了一个数的正负,指数部分决定了数值的大小,小数部分决定了数值的精度。
正常情况下(指数部分在 0 到 2047 之间),一个数在 JavaScript 内部实际的表示形式:
(-1)^符号位 * 1.xx...xx * 2^指数部分
JavaScript 提供的有效数字最长为 53 个二进制位,绝对值小于等于2的53次方的整数,即 -2^53 到 2^53,都可以精确表示。由于 2 的 53 次方是一个 16 位的十进制数值,所以 JavaScript 对 15 位的十进制数都可以精确处理。大于 2 的 53 次方以后,多出来的有效数字都会无法保存,变成 0.
Math.pow(2, 53)
// 9007199254740992
9007199254740992111
// 9007199254740992000 多出的三个有效数字,将无法保存
- 进制
二进制:前缀为
0b
的数字
八进制:前缀为0u
的数字,或以0
开头且只含0~7的数字
十进制:不以0
开头的数字
十六进制:前缀为0x
的数字
- JavaScript 内部会自动默认将八进制、十六进制、二进制转为十进制。
- 十进制数值的记法包括整数、小数 和 科学计数法(
1.23e2 = 123
)。
- 特殊数值
正 0 和负 0
几乎所有场合,正 0 和负 0 都会被当作正常的 0:+0 === -0 === 0
唯一有区别的场合是,+0 或 -0 当作分母,返回的值是不相等的。NaN
NaN
是 JavaScript 的特殊值,表示“非数字”(Not a Number)。
NaN
不是独立的数据类型,而是一个特殊数值,它的数据类型依然属于 Number.
NaN
在布尔运算时被当作false
.
NaN
不等于任何值,包括它本身;0 除以 0 等于NaN
;NaN
与任何数(包括它自己)的运算,得到的都是NaN
.Infinity
Infinity
表示“无穷”,用来表示两种场景:一种是一个正的数值太大或一个负的数值太小,无法表示;另一种是非 0 数值除以 0,得到Infinity
。
Math.pow(2, 1024) // Infinity
0 / 0 // NaN
1 / 0 // Infinity
Infinity
有正负之分,Infinity
表示正的无穷,-Infinity
表示负的无穷。
Infinity
与NaN
比较,总是返回 false
.
五、字符串
- 定义
-
字符串:放在
''
或""
之间的 0 个或多个字符。
''
字符串里面可以用""
;""
字符串里面可以用''
。 -
''
含0 个字符,为“空字符串”,length=0;
' '
含一个空格,为“空格字符串”,length=1. - 很多项目约定 JavaScript 语言的字符串只使用
''
。
- 多行字符串
- 字符串默认只能写在一行内,分成多行将会报错;
- 如果长字符串必须分成多行,可以在每一行的尾部使用反斜杠
\
- 反斜杠的后面必须是换行符,而不能有空格等其他字符,否则会报错。
'ab \
cd \
ef'
// abcdef
- 模板字符串 (template string)(ES6 新增)
用反引号(`)标识,可以用作普通字符串,也可以用来定义多行字符串(length 中包含回车),或在字符串中嵌入变量:
`ab
cd
ef`
// abcdef
- 连接运算符
+
+
可以连接多个单行字符串,将长字符串拆成多行书写,输出的时候也是单行。
'ab'
+ 'cd'
+ 'ef'
// abcdef
- 转义
反斜杠\
在字符串内有特殊含义,用来表示一些特殊字符,又称为转义符。
\0
:null(\u0000)
\b
:后退键(\u0008)
\f
:换页符(\u000C)
\n
:换行符(\u000A)
\r
:回车键(\u000D)
\t
:制表符(\u0009)
\v
:垂直制表符(\u000B)
\'
:单引号(\u0027)
\"
:双引号(\u0022)
\\
:反斜杠(\u005C)
- 反斜杠的三种特殊用法:
(1)\HHH
\
后面紧跟三个八进制数(000到377),代表一个字符。
(2)\xHH
\x
后面紧跟两个十六进制数(00到FF),代表一个字符。
(3)\uXXXX
\u
后面紧跟四个十六进制数(0000到FFFF),代表一个字符。
-
lenth 属性
length
属性返回字符串的长度,该属性是无法改变的。
var s = 'hello';
s.length // 5
- 字符集
- JavaScript 引擎内部以 Unicode 储存字符,所有字符都用 Unicode 表示。
- 程序中可使用 Unicode 码点表示字符,即将字符写成\uxxxx的形式:
var a = '\u006F\u006F';
a // "oo"
- 每个字符在 JavaScript 内部都是以16位(即2个字节)的 UTF-16 格式储存。即 JavaScript 的单位字符长度固定为16位长度,2个字节。
(1)但UTF-16 有两种长度:码点在U+0000
到U+FFFF
之间的字符,长度为16位(即2个字节);码点在U+10000
到U+10FFFF
之间的字符,长度为32位(即4个字节)。
(2)对于码点在U+10000
到U+10FFFF
之间的字符,JavaScript 总是认为它们是两个字符(length属性为2)。因此JavaScript 返回的 length 可能不正确。 - JavaScript 引擎不能自动识别编号大于 0xFFFF 的 Unicode 字符。
- Base64 转码
- Base64 是一种编码方法,可以将任意值转成 0~9、A~Z、a-z、+和/这64个字符组成的可打印字符。使不出现特殊字符,简化程序的处理。
btoa()
:任意值转为 Base64 编码
atob()
:Base64 编码转为原来的值
var string = 'Hello World!';
btoa(string) // "SGVsbG8gV29ybGQh"
atob('SGVsbG8gV29ybGQh') // "Hello World!"
- 要将非ASCII码(比如中文)字符转为Base64编码,必须中间插入一个转码环节。
六、对象
- 定义
- 对象(object)是一组“键值对”(key-value)的集合,是一种无序的复合数据集合(哈希表)。
- 对象是复杂类型(其他六类为简单类型),由其他简单类型组成。
- 对想是 JavaScript 语言的核心概念,也是最重要的数据类型。
- 语法
- 对象的所有键名(属性)都是字符串(ES6 中 Symbol 值也可以作为键名),所以加不加引号都可以;空字符串也可以作为键名。
- 如果键名不符合“标识符原则”(标识符只能包含字母或数字或汉字或下划线(“_”)或美元符号(“$”),且不能以数字开头),并且也不是数字,则必须加上引号,否则会报错。
- 键值可以为各种类型,键值的类型也可以为一个“对象”。
- 对象的属性之间用逗号分隔。
var person = {
name: 'Frank',
age: 26,
gender: 'female',
married: true,
children: {name: 'Micle',age: 3} , // 键值也可以为对象
'': 'Frank' , // 属性名也可以为空字符串
'9a':'Frank'
}
- 属性的操作
- 读取属性的两种方法:
person['name']
(属性名必须放在引号里,''
不可省略)
person.name
(特例,当属性名符合标识符规则时才可用)
注意:数值键名不能使用点运算符(会被当成小数点);
使用方括号运算符,可以不加引号,因为会自动转成字符串:
var obj = {
123: 'Hello'
};
obj.123 // 报错
obj['123'] // "Hello"
obj[123] // "Hello"
- 查看所有属性:
Object.keys
方法
Object.keys(person);
// ['name', 'age','gender','married','children','','9a']
- 删除属性:
delete
用于删除对象的属性,删除成功后返回 true.
delete person['name'] // true
person.name // undefined
注意:若 delete 一个不存在的属性, 不报错且返回 true.
-
in
运算符
检查对象是否包含某个属性,包含就返回 true,否则返回 false.
'age' in person // true
'phone' in person // false
-
for...in
循环
遍历一个对象的全部属性。
for (var key in person) {
console.log(key);
}
// name (顺序随机)
// age
// ......
for (var key in person) {
console.log(person[key]);
}
// Frank
// 26
// ......
(1)for...in
循环会跳过不可遍历的属性。
(2)它不仅遍历对象自身的属性,还遍历继承的属性。
(3)循环不按声明的顺序遍历属性,顺序随机。