[TOC] <br/><br/><br/> # <b style="color:#4F4F4F;">简介说明</b> 原文链接: - [JavaScript](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference) ``` 版本:JavaScript 作用:具有函数优先的轻量级,解释型或即时编译型的编程语言 ``` <br/> # <b style="color:#4F4F4F;">基本语法</b> <br/> # <span style="color:#619BE4">? :</span> ***** 三元判断符 <br/> # <span style="color:#619BE4">? .</span> ***** 对象有属性则调用没有则忽略,浏览器环境有效 <br/> # <span style="color:#619BE4">??</span> ***** 空值合并运算符,当左侧返回null或者undefined,执行右侧返回值 <br/> # <span style="color:#619BE4">...args</span> ***** 展开运算符,可以将迭代对象展开 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` var a, b, rest; [a, b] = [10, 20]; console.log(a); // expected output: 10 console.log(b); // expected output: 20 [a, b, ...rest] = [10, 20, 30, 40, 50]; console.log(rest); // expected output: [30,40,50] [..."abc"] // expected output: ["a","b","c"] ``` <br/> # <span style="color:#619BE4">( , )</span> ***** 逗号表达式,从左往右逐个计算表达式,它的值为最后一个表达式(也即表达式n)的值 <br/> # <span style="color:#619BE4">()=>{}/()=>()</span> ***** 箭头函数,没有this,没有arguments对象,小括号直接返回里面内容 <br/> # <span style="color:#619BE4">{}={}/[]=[]</span> ***** 解构赋值 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` 数组案例: let a=12,b=13 [a,b]=[b,a] a 对象案例: 同理 ``` <br/> # <span style="color:#619BE4">\<\<</span> ***** 左移动运算符,往左移动n位相当于乘2的n次方 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` 15 << 2 返回值:60 ``` <br/> # <span style="color:#619BE4">\>\></span> ***** 右移动运算符,往右移动n位相当于除2的n次方 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` 128 >> 2 返回值:64 ``` <br/> # <span style="color:#619BE4">\>\>\></span> ***** 无符号向右移位 <br/> # <span style="color:#619BE4">&&</span> ***** 逻辑与 <br/> # <span style="color:#619BE4">||</span> ***** 逻辑或 <br/> # <span style="color:#619BE4">async</span> ***** 创建一个异步函数 <br/> # <span style="color:#619BE4">await</span> ***** 等待一个promise对象 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` function say() { return new Promise(function (resolve, reject) { setTimeout(function () { resolve(158); },3000); }); } async function demo() { const v = await say(); console.log(v); const z = await say(); console.log(z); } demo(); ``` <br/> # <span style="color:#619BE4">break</span> ***** 跳出当前代码块 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` break ``` # <span style="color:#619BE4">class</span> ***** es6中新定义的类的创建方式 <br/> ### 示例内容 <span style="color:red;">1. static</span> ``` static 关键字只能修饰静态方法 static get 函数名 获取属性 static set 函数名 设置属性 ``` <br/> # <span style="color:#619BE4">const</span> ***** 定义常量 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` const i = 1; ``` <span style="color:red">2. 语法特点</span> ``` - 常量不能重新赋值 - 不能重复声明 - 块级作用域 - const 不会被预解析 ``` <br/> # <span style="color:#619BE4">continue</span> ***** 重新开始下一次新循环 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` continue ``` # <span style="color:#619BE4">delete</span> ***** 释放变量内存 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` 值类型放在栈,引用类型放在堆 let a = [1, 2, 3, 4, 5]; delete a[2]; console.log(a); ``` <br/> # <span style="color:#619BE4">export</span> ***** 模块导出 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` const a = 1; let b = 2; function show() { console.log(10); } show(); // 10 console.log(a); // 1 console.log(b); // 2 export default a; export { a, b as c, show } ``` <span style="color:red">2. 导入案例</span> ``` import {a, b} from './js/foo.js'; console.log(a); import('./js/bar.js').then(bar => { console.log(bar); }); ``` <br/> # <span style="color:#619BE4">for</span> ***** 循环 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` 1. 新式写法 for (let i in [1, 2, 3]) { console.log(i); } for (let x of a) { console.log(x); } 2. 传统写法 for (let i = 0; i < [1, 2, 3].length; i++) { console.log(i); } ``` <br/> # <span style="color:#619BE4">for in</span> ***** 遍历出来是属性 <br/> # <span style="color:#619BE4">for of</span> ***** 遍历出来是值 <br/> ### 示例内容 <span style="color:red;">1. 举例说明</span> ``` // 创建可迭代对象 let obj = { data: [ 'hello', 'world' ], [Symbol.iterator]() { const self = this; let index = 0; return { next() { if (index < self.data.length) { return { value: self.data[index++], done: false }; } else { return { value: undefined, done: true }; } } }; } }; ``` <br/> # <span style="color:#619BE4">func\`TemplateStringsArray\`</span> ***** 直接传递模板字符串给函数 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` function f(a: TemplateStringsArray) { console.log(a); } f`color:red;background:red`; ``` <br/> # <span style="color:#619BE4">if</span> ***** 分支抉择 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` let c = 1; if (c === 1) { } else if (c === 2) { } else { } ``` <br/> # <span style="color:#619BE4">import</span> ***** 模块导入 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` 注意引用标签类型 <script src="main.js" async type="module"></script> <script src="movie.js" type="module" ></script> import {a, c, show} from './trial.js'; show(); // 10 console.log(a); // 1 console.log(c); // 2 <script type="module" src="a.js"></script> ``` <br/> # <span style="color:#619BE4">import()</span> ***** 模块导入 <br/> ### 返回类型 ``` Promise ``` <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` 注意引用标签类型 <script src="main.js" async type="module"></script> <script src="movie.js" type="module" ></script> import("a.js").then(res=>{console.log(res)}); ``` <br/> # <span style="color:#619BE4">in</span> ***** 如果指定的属性在指定的对象或其原型链中,则in 运算符返回true。 <br/> ### 示例内容 <span style="color:red;">1. 举例说明</span> ``` // 数组 var trees = new Array("redwood", "bay", "cedar", "oak", "maple"); 0 in trees // 返回true 3 in trees // 返回true 6 in trees // 返回false "bay" in trees // 返回false (必须使用索引号,而不是数组元素的值) "length" in trees // 返回true (length是一个数组属性) Symbol.iterator in trees // 返回true (数组可迭代,只在ES2015+上有效) // 内置对象 "PI" in Math // 返回true // 自定义对象 var mycar = {make: "Honda", model: "Accord", year: 1998}; "make" in mycar // 返回true "model" in mycar // 返回true ``` <br/> # <span style="color:#619BE4">instanceof</span> ***** 类型判定,并且考虑到继承关系 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` console.log([] instanceof Object); 输出:true ``` <br/> # <span style="color:#619BE4">let</span> ***** 定义块级作用域变量 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` let i = 1; ``` <span style="color:red">2. 语法特点</span> ``` let 允许声明一个在作用域限制在块级中的变量、语句或者表达式 - 块级作用域 - let 不能重复声明 - let 不会被预解析 ``` <br/> # <span style="color:#619BE4">return</span> ***** 跳出当前方法 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` return ``` # <span style="color:#619BE4">switch</span> ***** 分支抉择 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` let c = 1; switch (c) { case 1: console.log("a"); break; case 2: console.log("a"); break; default: console.log("a"); } ``` <br/> # <span style="color:#619BE4">label:</span> ***** 带标签的语句,类似goto允许你在语句之间穿梭 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` outer:while (true) { inner:while (true) { break outer; } } // 跳出循环到这里 console.log("hello") ``` <br/> # <span style="color:#619BE4">throw</span> ***** 抛出一个异常 <br/> # <span style="color:#619BE4">try</span> ***** 异常捕获 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` try { } catch (e) { } finally { } ``` <br/> # <span style="color:#619BE4">typeof </span> ***** 类型判定,输出字符,注意null是Object <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` console.log(typeof []); 输出:object ``` <br/> # <span style="color:#619BE4">var</span> ***** 定义方法级作用域变量 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` var i=1; ``` <span style="color:red">2. 语法特点</span> ``` var 允许声明一个在作用域限制在函数中的变量、语句或者表达式 - 函数作用域 - var 声明的变量只能是全局或者整个函数块的 - var 能重复声明 - var 会被预解析 ``` <br/> # <span style="color:#619BE4">void</span> ***** 定义函数返回undefined <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` var foo = 1; void function(){ foo = 1; }() // will assign foo a value of 1 +function(){ foo = 1; }() // same as above 当IIFE括号上一层代码不写分号会造成小括号作为上一层代码函数调用, 添加void可以避免这个问题 ``` <br/> # <span style="color:#619BE4">while</span> ***** 循环 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` 1. 先做一次再循环 do { } while (1 === 1); 2. 循环知道满足条件 while (1 === 1) { } ``` <br/> # <span style="color:#619BE4">with</span> ***** 将变量属性映射为当前作用域环境 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` var env = {b: 1}; with (env) { console.log(b); } ``` <span style="color:red">2. 变量隔离</span> ``` var b; void function () { var env = {}; b = 2; console.log("function " + b) // 2 with (env) { var b = 9; // 如果不定义var 进行变量提升,函数获取闭包环境中全局b console.log("with " + b) // 9 } }() console.log("global " + b); // undefined ``` <br/> # <span style="color:#619BE4">yield</span> ***** 函数断点,生成器对象 <br/> ### 示例内容 <span style="color:red;">1. 举例说明</span> ``` let compute = function* (a, b) { let sum = a + b; yield console.log(sum); let c = a - b; yield console.log(c); let d = a * b; yield console.log(d); let e = a / b; console.log(e); }; // 执行一下这个函数得到 Generator 实例 let generator = compute(4, 2); // 要使得函数中封装的代码逻辑得到执行,还得需要调用一次next方法。 generator.next(); ``` <br/> # <span style="color:#619BE4">super</span> ***** 父类的引用 <br/> # <span style="color:#619BE4">new</span> ***** 实例化对象 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` new URL(); ``` <br/> # <span style="color:#619BE4">new.target</span> ***** 构造函数中使用的关键字,用于判断当前实例是否为指定类型,多用于做抽象类 <br/> # <span style="color:#619BE4">globalThis</span> ***** 包含全局的 this 值,类似于全局对象 <br/> # <b style="color:#4F4F4F;">特性内容</b> <br/> # <span style="color:#619BE4">语句图解</span> ***** 语句图解 <br/> ### 示例内容 <span style="color:red">1. 思维导图</span> ![JS语句图](https://img.kancloud.cn/98/ce/98ce53be306344c018cddd6c083392d5_555x872.jpeg) <br/> # <span style="color:#619BE4">关系图解</span> ***** 对象间原型,构造函数,原型链之间的关系 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ![JS原型图解](https://img.kancloud.cn/d4/8e/d48edc69f2309cf55d4bf5dd1ea2e692_1768x992.png) <br/> # <span style="color:#619BE4">EventLoop</span> ***** 事件循环 ### 示例内容 <span style="color:red">1. 举例说明</span> ![event-loop](https://img.kancloud.cn/23/36/2336375b94d479d13fc72b9e9d80bb8f_2388x2396.png) ![JS事件循环](https://img.kancloud.cn/b5/d6/b5d6cb4581eab5eb85472a4eb3b2b077_1954x1784.jpg) <br/> # <span style="color:#619BE4">创建对象</span> ***** 创建对象--ES6之前的传统方式 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ![JS原型继承](https://img.kancloud.cn/6a/3e/6a3eee45db2b406a88b7cfa7f564ad5e_890x3673.png) <br/> <span style="color:red">2. jQuery创建模式</span> ``` let jquery = (function () { let obj = function () { return new obj.prototype.init(); }; obj.prototype = { constructor: obj, init: function () { }, }; obj.set = function () { }; obj.prototype.init.prototype = obj.prototype; return obj; })(); ``` <br/> # <span style="color:#619BE4">继承对象</span> ***** 继承对象--ES6之前的传统方式 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ![](https://img.kancloud.cn/4c/23/4c2357d77a06fc145d3cfe9cf0e9ba42_1062x3513.png) <br/> # <span style="color:#619BE4">重载方法</span> ***** 通过闭包来实现JS方法重载,发挥多态的特性 <br/> ### 示例内容 <span style="color:red">1. 使用案例</span> ``` function bind_method(obj, name, fn) { let old = obj[name]; obj[name] = function (...args) { if (args.length === fn.length) { fn.apply(obj, args); } else { old.apply(obj, args); } } } let arr = [...Array(5).keys()]; bind_method(arr, "show", function () { console.log(0) }); bind_method(arr, "show", function (a) { console.log(1) }); bind_method(arr, "show", function (a, b) { console.log(2) }); arr.show(); //0 arr.show(1); //1 arr.show(1, 2); //2 ``` <br/> # <span style="color:#619BE4">拆箱与封箱</span> ***** 自动拆箱与封箱 <br/> # <span style="color:#619BE4">执行上下文</span> ***** ES2018中规定的执行上下文 <br/> ### 示例内容 <span style="color:red">1. 举例说明</span> ``` lexical environment: 词法环境,当获取变量或者this值时使用 variable environment: 变量环境,当声明变量时使用 code evaluation state: 用于恢复代码执行位置 Function: 执行的任务是函数时使用,表示正在被执行的函数 ScriptOrModule: 执行的任务是脚本或者模块时使用,表示正在被执行的代码 Realm: 使用的基础库和内置对象实例 Generator: 仅生成器上下文有这个属性,表示当前生成器 ``` <br/> # <span style="color:#619BE4">IIFE</span> ***** 立即调用函数表达式 <br/> ### 示例内容 <span style="color:red">1. 举例说明</span> ``` (function () { var name = "Barry"; })(); // 无法从外部访问变量 name name // 抛出错误:"Uncaught ReferenceError: name is not defined" ``` <br/> # <span style="color:#619BE4">自动插入分号</span> ***** 自动插入分号 <br/> ### 示例内容 <span style="color:red">1. No Line TerminatorHere</span> ![noLineTerminatorHere](https://img.kancloud.cn/c3/ff/c3ffbc89e049ad1901d4108c8ad88aad_1008x598.jpg) <br/>