高级程序设计 第三章 自我总结
3.1 语法
3.1.1区分大小写
3.1.2标识符
- 数字、字母、下划线、$ 组成
- 数字不能开头
3.1.3、注释
- 单行注释 // xxx
- 多行注释 /* xxx */
3.1.4、严格模式
“use strict”;
3.1.5、语句
- 分号结尾,推荐
- 无结尾,不推荐
3.2 关键字和保留字
- 关键字:现在已经使用,不能用作标识符或者属性名
- 保留字:未来使用,不能用作标识符或者属性名
3.3 变量
3.3.1 var(函数作用域)
- 声明作用域
- 使用var在一个函数内部定义一个变量,意味着该函数将在函数退出时被销毁
- 在函数内部定义变量,省略var,可以创建一个全局变量
- 声明提升
- 把所有的变量声明都拉到函数作用域的顶部
3.3.2let(块作用域)
- 暂时性死区
- 不会在作用域中被提升
- 在let声明前的执行瞬间被称为“暂时性死区”
- 全局声明
- 使用let在全局作用域中声明的变量不会成为window对象的属性
- 页面不能重复声明同一个变量
- 条件声明
- 不能依赖条件声明模式
- for循环中的let变量
- 解决了for循环定义的迭代变量会渗透到循环体外部
3.3.3 const
- const声明变量时必须同时声明初始化变量
- const声明的限制只适用于它指向的变量的引用
- 声明风格和最佳实践
- 不使用var
- const优先,let次之
3.4数据类型
1、 typeof操作符
a) undefined:未定义
b) boolean:布尔值
c) string:字符串
d) number:数值
e) object:对象(而不是函数)或null
i. 特殊值null被认为是一个对空对象的引用
f) function:函数
g) symbol:符号
2、 Undefined类型
a) 使用var或者let声明了变量但未初始化时,相当于给变量赋值了undefined值
b) 当typeof返回undefined时,你就会知道给定的变量是尚未定义,而不是声明了但初始化。
3、 Null类型
a) Null只有一个值,即特殊值null
b) 从逻辑上讲,null表示一个空对象指针
4、 Boolean类型
a) 有两个字面量,true和false
b) 转化为false的值有0、NAN、false,’’,undefined、null
5、 Number类型
a) 浮点数存在舍入错误是因为使用了IEEE754数值
b) 值的范围
i. –Infinity、Infinity
ii. 要确定一个数是不是有限大,可以使用IsFinite()
iii. NaN
- 在ECMAScript中,0,+0或-0相除会返回NaN
- 如果分子是非0值,分母是有符号0或无符号0,则会返回Infinity或-Infinity
- 任何涉及NaN的操作始终返回NaN
- NaN不等于包括NaN在内的任何值
- isNaN()可以判断这个参数是否“不是数值”
iv. 数值转换
- Number()是转型函数,可以用于任何数据类型
a) 布尔值:true转换为1,false转换为0
b) 数值:直接返回
c) null:返回0
d) undefined:返回NaN
e) 字符串
i. 数值字符:十进制数值
ii. 浮点数格式字符:浮点数
iii. 十六进制:十进制数值
iv. 空字符串,返回0
v. 其他:NaN
f) 对象:调用valueOf方法,并按照上述规则转换成值。如果转换结果是NaN,则调用toString()方法,再按照字符串的规则转换 - parseInt()和paeseFloat()主要用于将字符串转换成数值
a) parseFloat()只对第一次出现的小数点有效
6、 String类型
a) 字符字面量
i. \n:换行
b) 字符串的特点
i. ECMAScript中的字符串是不可变的
c) 转换成字符串
i. xxx.toString():除null和undefined值没有该方法
ii. String(xxx)
- 如果值有toString()方法,则调用该方法(不穿参数)并返回结果
- 如果是null,返回’null’
- 如果是undefined,返回’undefined’
iii. 用加号操作符给一个值加上一个空字符串’’
d) 模版字面量
``
e) 字符串插值
${a}+${b}=${a+b}
f) 模版字面量标签函数
支持定义标签函数
g) 原始字面量
i. 可以使用默认的String.raw标签函数
ii. console.log(String.raw\u00A9
); // \u00A9
7、 Symbol类型
a) ES6新增
b) 符号是原始值,且符号实例是唯一的、不可变的。
c) 符号的用途是确保对象属性使用唯一标识符,不会发生属性冲突的危险
a)、符号基本用法
注意:Symbol()不能与new关键词一起做微构造函数使用
这样做是为了避免创建符号包装对象
真的确实想使用符号包装对象,可以借用Object()函数
b)、使用全局符号注册表
Symbol.for(‘foo’)
如没有,则创建新符号实例;如果有,则重用已有符号。
Symbol.keyFor()
会查询全局注册表。如果有,防御对应字符串键;如果没有,返回undefined。
c)、使用符号作为属性
Object.defineProperty()/Object.defineProperties
Object.getOwnPropertyNames()返回对象实例的常规属性数组
Object.getOwnPropertySymbols()返回对象实例的符号属性数组
上面两个方法的返回值彼此互斥
Object.getOwnPropertyDescriptors()会返回同时包含常规和符号属性描述符的对象
Object.ownKeys()会返回两种类型的键
d)、常用内置符号
f)、Symbol.asyncIterator
g)、Symbol.hasInstance
… …
8、 Object类型
每个实例都有如下属性和方法
1、constructor 用于创建当前对象的函数
2、hasOwnProperty(propertyName) 用于判断当前对象实例上是否存在给定的属性
3、isPrototypeOf(propertyName) 用于判断当前对象是否为另一个对象的原型
4、propertyIsEnumerable(propertyName)用于判断给定的属性是否可以使用
5、toLocaleString()返回对象的字符串表示,该字符串反映对象所在的本地化执行环境
6、toString()返回对象的字符串表示7、valueOf()返回对象对应的字符串、数值、布尔值表示。通常与toString()的返回值相同。
对象的toString()和valueOf()输出对比:
各个类型的toString()结果:
各个类型的valueOf()结果:
3.5 操作符
3.5.1 一元操作符
1、递增/递减操作符
符号在前,先加;符号在后,后加
2、一元加和减
会执行与使用Number()转型函数一样的类型转换
负号主要用于把数值变成负值
3.5.2 位操作符
有符号整数使用32位的前31位表示整数值。第32位表示数值的符号,如0表示正,1表示负。这一位称为符号位,它的值决定了数值其余部分的格式。
按位非:返回补数,即取反,并减1。(补数:010-》101)
按位与:都是1返回1,有任何一位是0返回0
按位或:至少一位是1时返回1,两位都是0时返回0
按位异或:一位上是1时返回1(两位都是1或0返回0)
左移(<<):所有数值的32位向左移,同时保留符号
右移(>>):所有数值的32位向右移,同时保留符号()正或负
无符号右移(>>>):所有32位向右移。对正数,与有符号右移结果相同;对负数,差异很大
3.5.3 布尔操作符
1、逻辑非
例:!a
空对象、0、null、NAN、undefined 返回true
2、逻辑与
例:a && b
a为true,返回b;a为false,返回false
3、逻辑或
例:a || b
a为true,返回a;a为false,返回b
3.5.4 乘性操作符
1、乘法操作符*
2、除法操作符/
3、取模(余数)操作符%
3.5.5 指数操作符
es7新增了操作符**
相当于Math.pow()
console.log(3**2); // 9
es7新增了赋值操作符**=
let a = 3;
a**=2; // 9
3.5.6 加性操作符
1、加法操作符
数学加法运算
如果有一个操作数为字符串,则两个操作符拼接到一起。如果另一个操作符不是字符串,则调用它们的toString()方法以获取字符串
2、减法操作符
数学减法运算
3.5.7 关系操作符
console.log(3>4); // false
3.5.8 相等操作符
等于:==
不等于:!=
全等:===
不全等:!==
3.5.9 条件操作符
三目运算
a ? b : c
a为true,返回b
a为false,返回c
3.5.10 赋值操作符
=
*=
/=
%=
+=
-=
<<=
>>=
>>>=
3.4.11 逗号操作符
let num = 1,num2 = 2,num3 = 3;
3.6 语句
3.6.1 if 语句
if (a) {
// a为true时运行
} else {
// a为false时运行
}
3.6.2 do-while 语句
do {
// 符合条件运行
// 至少运行一次
} while (条件)
3.6.3 while 语句
while (条件) {
// 条件为真运行
// 可能一次都不运行
}
3.6.4 for 语句
for (i = 0;i < 5; i++) {
// 符合条件就运行
}
3.6.5 for-in 语句
3.6.6 for-of 语句
3.6.7 标签语句
3.6.8 break 和continue 语句
3.6.9 with 语句
3.6.10 switch 语句