let , const
-
const
與let
的區(qū)別:1. 聲明時(shí)必須賦值 2.只能賦值一次 - let 存在暫時(shí)性死區(qū):
let
會(huì)使變量作用域綁定在當(dāng)前塊內(nèi)隅俘;那么這個(gè)變量在let之前是未定義的了袁,但它又不能取父作用域的同名變量的值
for(let i=0;i<3;i++){
//此時(shí)i的作用域就在括號(hào)內(nèi)
//但js會(huì)自動(dòng)幫用戶在花括號(hào)內(nèi)創(chuàng)建一個(gè)同名臨時(shí)變量i,使得i在打印時(shí)不會(huì)固定變?yōu)?
button[i].onclick = ()=>{
console.log(i)
}
}
Symbol
當(dāng)我不關(guān)心一個(gè)一個(gè)變量的值蹲缠,只希望區(qū)分該變量與其他變量時(shí)
x = Symbol()
默認(rèn)參數(shù)值
- 當(dāng)傳給函數(shù)的參數(shù)值為undefined時(shí)艘虎,默認(rèn)參數(shù)值會(huì)生效
- function x(a,...b) {} 得到的b是一個(gè)數(shù)組
- 偽數(shù)組轉(zhuǎn)數(shù)組兩種方法
let arr = Array.from(arguments)
let arr = [...arguments]
- 簡(jiǎn)單的值交換
let [a,b] = [1,2];
[a,b] = [b,a]
console.log(a,b) //2,1
需要特別注意的是唉侄,在這種情況下,值交換的前一句結(jié)束分號(hào)一定不能省略野建,否則會(huì)出錯(cuò)
- 雙層解構(gòu)賦值
var obj = {x:{b:1}}
var {x:属划} = obj
console.log(b) //1
//先 x = obj.x 而后 b = x.b
- Object.assign()是淺拷貝恬叹,或者說只能深拷貝一層
對(duì)象屬性增強(qiáng)
let obj = {x,y}
- 對(duì)象聲明時(shí)鍵名可以用表達(dá)式
模塊化
- 依賴:用到了別的模塊
- 導(dǎo)出:給別的模塊用
- 在不同模塊中多次導(dǎo)入同一個(gè)模塊,該模塊也只會(huì)被下載一次同眯,但會(huì)執(zhí)行多次
-
import
語(yǔ)句只能在聲明了type="module"
的 script 的標(biāo)簽中使用
import defaultExport from "module-name";
import * as name from "module-name";
import { export } from "module-name";
import { export as alias } from "module-name";
import { export1 , export2 } from "module-name";
import { foo , bar } from "module-name/path/to/specific/un-exported/file";
import { export1 , export2 as alias2 , [...] } from "module-name";
import defaultExport, { export [ , [...] ] } from "module-name";
import defaultExport, * as name from "module-name";
import "module-name";
- export
export { name1, name2, …, nameN };
export default expression;
export * from …;//模塊透?jìng)?
class
- 如何不用class實(shí)現(xiàn)繼承
function Animal(){
this.a = 1
}
Animal.prototype.move = function(){}
function Human(){
Animal.apply(this,aruguments)
this.b = 2
}
let f = function(){}
f.prototype = Animal.prototype
Human.prototype = new f()
Human.prototype.constructor = Human
- 使用class實(shí)現(xiàn)繼承
class Human extends Animal{
constructor(){
super()
}
}
- 類:擁有共同屬性的對(duì)象
- constructor用于構(gòu)造自有屬性
- extends會(huì)使原型鏈再多一層
- 在繼承時(shí)绽昼,用到了this就要在使用前加super()
- class不支持公有屬性是非函數(shù)
- 用
get
設(shè)置可讀不可寫的屬性
class Human{
constructor(age){
this._age = age
}
get age (){
return this._age
}
}
var human = new Human(19)
console.log(human.age) // 19
- 用set對(duì)屬性的寫操作進(jìn)行響應(yīng)的限制
class Human{
constructor(name){
this._name = name
}
set name (value){
if(value>4){console.log('名字長(zhǎng)度不能超過4個(gè)字')}
else{this._name = value}
}
}
var human = new Human('yyh')
human.name('哈哈哈哈哈哈哈') //名字長(zhǎng)度不能超過4個(gè)字
- static 用于聲明構(gòu)造函數(shù)的靜態(tài)方法
promise
- promise解決了多層的異步嵌套。增加了代碼的可讀性
- 手寫promise
function fn (){
return new Promise((resolve,reject)=>{
if(x){resolve()}
else{reject()}
}
function rs1(){
//...
if(x){return Promise.resolve()//如果不寫明返回值须蜗,默認(rèn)返回resolve
}else{ return Promise.reject()}
}
}
function rj1(){
if(x){return Promise.resolve()//如果不寫明返回值绪励,默認(rèn)返回resolve
}else{ return Promise.reject()}
}
fn().then(rs1,rj1)
promise.catch()
- 如果作為參數(shù)的 Promise 實(shí)例,自己定義了catch方法唠粥,那么它一旦被rejected,并不會(huì)觸發(fā)Promise.all()的catch方法停做。因?yàn)閳?zhí)行完它自己的catch方法后晤愧,該實(shí)例的狀態(tài)也會(huì)變成resolved
- 只要函數(shù)中有錯(cuò)誤,就會(huì)進(jìn)入
reject()
蛉腌,而reject()
等同于拋出錯(cuò)誤官份。Promise 對(duì)象的錯(cuò)誤具有“冒泡”性質(zhì),會(huì)一直向后傳遞烙丛,直到被捕獲為止舅巷。也就是說,錯(cuò)誤總是會(huì)被下一個(gè)catch語(yǔ)句捕獲河咽。 - 比較下面兩種寫法
// bad
promise
.then(function(data) {
// success
}, function(err) {
// error
});
// good
promise
.then(function(data) { //cb
// success
})
.catch(function(err) {
// error
});
上面代碼中钠右,第二種寫法要好于第一種寫法,理由是第二種寫法可以捕獲前面then方法執(zhí)行中的錯(cuò)誤忘蟹。應(yīng)該說如果想要捕獲then方法執(zhí)行中的錯(cuò)誤飒房,應(yīng)該這么寫
promise
.then(function(data) {
// success
}, function(err) {
// error
}).then(function(data){},function(err){});
then的第二個(gè)參數(shù),只能處理上一層函數(shù)的錯(cuò)誤媚值,而不能處理上上層的錯(cuò)誤狠毯,所以第二種寫法優(yōu)于第一種寫法
- 跟傳統(tǒng)的try/catch代碼塊不同的是,如果沒有使用catch方法指定錯(cuò)誤處理的回調(diào)函數(shù)褥芒,Promise 對(duì)象拋出的錯(cuò)誤不會(huì)傳遞到外層代碼嚼松,即不會(huì)有任何反應(yīng)。這就是說锰扶,Promise 內(nèi)部的錯(cuò)誤不會(huì)影響到 Promise 外部的代碼献酗,通俗的說法就是“Promise 會(huì)吃掉錯(cuò)誤”。
Promise.prototype.finally()
- finally方法用于指定不管 Promise 對(duì)象最后狀態(tài)如何坷牛,都會(huì)執(zhí)行的操作凌摄。
Promise.all()
- 參數(shù)是由promise對(duì)象構(gòu)成的數(shù)組
- 返回值分兩種,數(shù)組內(nèi)promise對(duì)象的狀態(tài)都為成功后漓帅,返回對(duì)象成功后的返回值構(gòu)成的數(shù)組锨亏;數(shù)組內(nèi)promise對(duì)象有一個(gè)失敗痴怨,返回第一個(gè)失敗的對(duì)象的返回值
promise.race()
const p = Promise.race([p1, p2, p3]);
- 上面代碼中,只要p1器予、p2浪藻、p3之中有一個(gè)實(shí)例率先改變狀態(tài),p的狀態(tài)就跟著改變乾翔。那個(gè)率先改變的 Promise 實(shí)例的返回值爱葵,就傳遞給p的回調(diào)函數(shù)。
async&await
- async function 用于聲明一個(gè)返回Promise對(duì)象的函數(shù)反浓。該函數(shù)內(nèi)部會(huì)有異步操作萌丈。async的優(yōu)點(diǎn)在于處理 then 鏈,該聲明使異步函數(shù)看起來像同步函數(shù)一樣
-
async
函數(shù)中可能會(huì)有await
雷则,await
后面接一個(gè)Promise對(duì)象辆雾,這會(huì)使async
函數(shù)暫停執(zhí)行,等待Promise
的結(jié)果出來月劈,然后恢復(fù)async
函數(shù)的執(zhí)行并返回解析值(resolved)度迂。 - 正常情況下,await可以接一個(gè) Promise 對(duì)象猜揪,返回該對(duì)象的結(jié)果惭墓。它會(huì)阻塞后面的代碼,如果不是 Promise 對(duì)象而姐,就直接返回對(duì)應(yīng)的值腊凶。
- 任何一個(gè)await語(yǔ)句后面的 Promise 對(duì)象變?yōu)閞eject狀態(tài),那么整個(gè)async函數(shù)都會(huì)中斷執(zhí)行拴念。
- 這篇文章寫的是真真好:https://segmentfault.com/a/1190000007535316