JavaScript ( JS ) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。虽然它是作为开发Web 页面的脚本语言而出名的,但是它也被用到了很多非浏览器环境中,例如 Node.js、 Apache CouchDB 和 Adobe Acrobat。JavaScript 是一种基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式(如函数式编程)风格。
回调函数
作为参数传递的函数
某一时刻,回来调用
语句:语句是执行行为(action)的语法结构和命令。
分号:当存在换行符(line break)时,在大多数情况下可以省略分号。
注释:为代码添加 注释 来描述它做了什么和为什么要这样做,变得非常有必要了。
单行注释以两个正斜杠字符 // 开始。
多行注释以一个正斜杠和星号开始 “/” 并以一个星号和正斜杠结束 “/”。
⭐️运算符:基础数学
术语:“一元运算符”,“二元运算符”,“运算元”(运算符应用的对象)
数学
+ 数学加法;字符串连接;转换类型为数字(+true //1)
- 减法
乘法
/ 除法
% 取余
求幂
赋值运算符
= 赋值,链式赋值
所有算术和位运算符都有简短的“修改并赋值”运算符:/= 和 -= 等
自增/自减
++ 自增
— 自减
自增/自减只能应用于变量
后置形式返回的是旧值
?位运算符
位运算符把运算元当做 32 位整数,并在它们的二进制表现形式上操作。
按位与 ( & )
按位或 ( | )
按位异或 ( ^ )
按位非 ( ~ )
左移 ( << )
右移 ( >> )
无符号右移 ( >>> )
逗号运算符*
let a = (1 + 2, 3 + 4);
alert( a ); // 7(3 + 4 的结果)
每个语句都运行了,但是只有最后的语句的结果会被返回。
⭐️运算符:值的比较
比较运算符始终返回布尔值。
字符串的比较,会按照“词典”顺序逐字符地比较大小。
当对不同类型的值进行比较时,它们会先被转化为数字(不包括严格相等检查)再进行比较。
在非严格相等 == 下,null 和 undefined 相等且各自不等于任何其他的值。
在使用 > 或 < 进行比较时,需要注意变量可能为 null/undefined 的情况。比较好的方法是单独检查变量是否等于 null/undefined。
关系运算符
in:in运算符用来判断对象是否拥有给定属性。.
instanceof:instanceof 运算符判断一个对象是否是另一个对象的实例。
< (en-US):小于运算符。
> (en-US):大于运算符。
<= (en-US):小于等于运算符。
>= (en-US):大于等于运算符。
相等运算符
如果相等,操作符返回的是布尔类型的true,否则是false。
== (en-US):相等 运算符.
!= (en-US):不等 运算符.
=== (en-US):全等 运算符.
!== (en-US):非全等 运算符.
条件(三元)运算符
(condition ? ifTrue : ifFalse)
条件元素运算符把两个结果中其中一个符合运算逻辑的值返回。
表达式
主要表达式
JavaScript中基本关键字和常用表达式。
this 关键字指向函数的执行上下文。
function 关键字定义了函数表达式。
class 关键字定义了类表达式。
function 关键字定义了一个 generator 函数表达式。
yield 暂停和恢复 generator 函数。
yield 委派给另外一个generator函数或可迭代的对象。
async function 定义一个异步函数表达式。
await 暂停或恢复执行异步函数,并等待promise的resolve/reject回调。
[] 数组初始化/字面量语法。
{} 对象初始化/字面量语法。
/ab+c/i 正则表达式字面量语法。
( ) 分组操作符。
左表达式
左边的值是赋值的目标。
属性访问符
成员运算符提供了对对象的属性或方法的访问。
(object.property 和 object[“property”]).
new 运算符创建了构造函数实例。
new.target
在构造器中,new.target 指向new调用的构造器。
super 关键字调用父类的构造器。
…obj
展开运算符可以将一个可迭代的对象在函数调用的位置展开成为多个参数,或者在数组字面量中展开成多个数组元素。
语法
1 值、变量
我们可以使用 var、let 或 const 声明变量来存储数据。
:::info
let — 现代的变量声明方式。
var — 老旧的变量声明方式。一般情况下,我们不会再使用它。但是,我们会在 老旧的 “var” 章节介绍 var 和 let 的微妙差别,以防你需要它们。
const — 类似于 let,但是变量的值无法被修改。
:::
变量应当以一种容易理解变量内部是什么的方式进行命名。
2 数据类型
2.1 基本类型
JavaScript 中有八种基本的数据类型(译注:前七种为基本数据类型,也称为原始类型,而 object 为复杂数据类型)。
:::info
布尔值(Boolean),有2个值分别是:true 和 false.
null , 一个表明 null 值的特殊关键字。 JavaScript 是大小写敏感的,因此 null 与 Null、NULL或变体完全不同。
undefined ,和 null 一样是一个特殊的关键字,undefined 表示变量未赋值时的属性。
数字(Number),整数或浮点数,例如: 42 或者 3.14159。
任意精度的整数 (BigInt) ,可以安全地存储和操作大整数,甚至可以超过数字的安全整数限制。
字符串(String),字符串是一串表示文本值的字符序列,例如:”Howdy” 。
代表(Symbol) ( 在 ECMAScript 6 中新添加的类型).。一种实例是唯一且不可改变的数据类型。
对象(Object) :::
2.2 类型判断
我们可以通过 typeof 运算符查看存储在变量中的数据类型。
:::info
通常用作 typeof x,但 typeof(x) 也可行。
以字符串的形式返回类型名称,例如 “string”。
typeof null 会返回 “object” —— 这是 JavaScript 编程语言的一个错误,实际上它并不是一个 object。
:::
2.3 类型转换
有三种常用的类型转换:转换为 string 类型、转换为 number 类型和转换为 boolean 类型。
字符串转换 —— 转换发生在输出内容的时候,也可以通过 String(value) 进行显式转换。原始类型值的 string 类型转换通常是很明显的。
数字型转换 —— 转换发生在进行算术操作时,也可以通过 Number(value) 进行显式转换。
:::info
undefined —— NaN
null —— 0
true / false —— 1 / 0
string —— “按原样读取”字符串,两端的空白会被忽略。空字符串变成 0。转换出错则输出 NaN。
:::
布尔型转换 —— 转换发生在进行逻辑操作时,也可以通过 Boolean(value) 进行显式转换。
:::info
0, null, undefined, NaN, “” —— false
其他值 —— true
:::
上述的大多数规则都容易理解和记忆。人们通常会犯错误的值得注意的例子有以下几个:
:::info
Number:对 undefined 进行数字型转换时,输出结果为 NaN,而非 0。
Boolean:对 “0” 和只有空格的字符串(比如:” “)进行布尔型转换时,输出结果为 true。
:::
3 流程控制
if else语句
:::info
if(…){…} [else if(…)]{…} [else]{…}
:::
条件计算判断规则
:::info
0, null, undefined, NaN, “”,false —— false
其他值 —— true
:::
switch 语句
switch 语句允许一个程序求一个表达式的值并且尝试去匹配表达式的值到一个 case 标签。如果匹配成功,这个程序执行相关的语句。
switch (expression) {case label_1:statements_1[break;]case label_2:statements_2[break;]...default:statements_def[break;]}
如果没有 break,程序将不经过任何检查就会继续执行下一个 case。
switch 语句有至少一个 case 代码块和一个可选的 default 代码块。
条件运算符 ‘?’
let result = condition ? value1 : value2;
计算条件结果,如果结果为真,则返回 value1,否则返回 value2。
4 运算(表达式、运算符)
表达式是一组代码的集合,它返回一个值。
:::info
算数: 得出一个数字, 例如 3.14159. (通常使用 arithmetic operators.)
字符串: 得出一个字符串, 例如, “Fred” 或 “234”. (通常使用 string operators.)
逻辑值: 得出true或者false. (经常涉及到 logical operators.)
基本表达式: javascript中基本的关键字和一般表达式。
this关键字被用于指代当前的对象,通常,this指代的是方法中正在被调用的对象。
左值表达式: 分配给左值。
你可以使用new operator 创建一个自定义类型或者是预置类型的对象实例。
super 关键字可以用来调用一个对象父类的函数,它在用来调用一个类的父类的构造函数时非常有用
扩展语句符 … 允许一个表达式在原地展开, 当需要多个参数 (比如函数调用时) 或者多个值(比如字面量数组) 。
解构赋值语法是一个能从数组或对象对应的数组结构或对象字面量里提取数据的表达式。
:::
分组操作符()控制了表达式中计算的优先级.
运算符
:::info
赋值运算符(Assignment operators)
=,复合赋值 (+-*/…)=,解构赋值(var [one, two, three] = [“one”, “two”, “three”])
比较运算符(Comparison operators)
算数运算符(Arithmetic operators)
位运算符(Bitwise operators)
逻辑运算符(Logical operators)
字符串运算符(String operators)
条件(三元)运算符(Conditional operator)
逗号运算符(Comma operator)
一元运算符(Unary operators)
关系运算符(Relational operator)
:::
4.1 数学
4.2 比较
4.3 逻辑
5 函数
5.1 函数声明
5.1 函数表达式
5.1 回调函数
5.1 箭头函数
数据类型深入
原始类型的方法
数字类型
数组
数组方法
Iterable object(可迭代对象)
Map and Set(映射和集合)
WeakMap and WeakSet(弱映射和弱集合)
Object.keys,values,entries
结构赋值
日期和时间
JSON序列化、反序列化
对象
属性/字面量
:::info
数组字面量(Array literals)
布尔字面量(Boolean literals)
数字字面量(Numeric_literals)
对象字面量(Object literals)
RegExp 字面值
字符串字面量(String literals)
:::
in、for…in
对象引用
深拷贝、浅拷贝
Symbol
垃圾收集机制
this
new
Optional chaining ‘?.’
类型转换 Symbol.toPrimitive
Propert flags、descriptors
getters、setters
函数
调用栈
递归、尾递归
arguments、params spread
作用域、闭包
var、变量提升
IIFE、匿名自执行函数
NFE、函数命名表达式
箭头函数
new Function
setTimeout、setInterval
call、apply、bind
部分施用、柯里化
执行上下文
原型
原型链、继承
F.prototype
Object.prototype
类
extend 继承
方法重载
构造函数
Super、[[HomeObject]]
静态属性、静态函数
私有属性、私有函数
混合、Mixins
异步流程控制
Callback
Promise
Promises/A+、Promisification、Thenable
async/await
generator
iterable
模块化
commonJS
amd、cmd、umd、es-module
异常捕获
try…catch…finally
throw
使用throw语句抛出一个异常。当你抛出异常,你规定一个含有值的表达式要被抛出。
Error
代码质量
Object(对象):基础知识
数据类型
函数进阶内容
对象属性配置
原型,继承
类
错误处理
Promise,async/await
Generator,高级 iteration
模块
杂项
