ES6+

ES6簡(jiǎn)介

ECMAScript 第六代標(biāo)準(zhǔn)

let 和 const

用于聲明變量或聲明常量

變量和常量
var 和 let 聲明的就是變量胸哥,變量初始化后還可以重新賦值。
const 聲明的是常量晃危,常量一旦初始化后就不能重新賦值浮声,否則報(bào)錯(cuò)礁叔。常量可以防止不經(jīng)意間改變了不能改變的量妄荔。如果常量值的類型是引用類型泼菌,例如對(duì)象谍肤,可以修改對(duì)象屬性的值。
const 聲明常量一旦聲明哗伯,就必須完成初始化荒揣,否則報(bào)錯(cuò)

let、const 與 var 的區(qū)別

  1. 重復(fù)聲明:var 支持重復(fù)聲明焊刹,let 與 const 不支持系任。
  2. 變量提升:let 與 const 不存在變量提升。
  3. 暫時(shí)性死區(qū):只要作用域內(nèi)存在 let 和 const 伴澄,他們聲明的量就會(huì)綁定作用域赋除,該量不再受外部影響阱缓。
  4. window對(duì)象的屬性和方法:let 和 const 聲明的量不會(huì)變成 window 對(duì)象的屬性或方法非凌。
  5. 塊級(jí)作用域: let 與 const 存在塊級(jí)作用域。

模板字符串

一般字符串:?jiǎn)我?hào)和雙引號(hào)荆针。
模板字符串:反引號(hào)敞嗡。

特征:

  1. 模板字符串中所有空格、換行航背、縮進(jìn)都被保留在輸出中喉悴。
  2. 同樣可以使用轉(zhuǎn)義字符輸出反引號(hào)、反斜杠等特殊字符玖媚。
  3. 可以直接在模板字符串中使用${} 注入內(nèi)容(變量箕肃,屬性值,函數(shù)值今魔,計(jì)算值等)

標(biāo)簽?zāi)0?/h2>

是函數(shù)調(diào)用的一種特殊形式勺像。模板字符串可以緊跟在一個(gè)函數(shù)后面,該函數(shù)將被調(diào)用來(lái)處理這個(gè)模板字符串错森,這被成為“標(biāo)簽?zāi)0濉惫δ芤骰拢纾?/p>

alert('hello')
//等同于
alert`hello`

"標(biāo)簽"指的就是函數(shù),緊跟在后面的模板字符串就是他的參數(shù)涩维。
如果模板字符串中有變量殃姓,就不是簡(jiǎn)單的調(diào)用了,而是會(huì)將模板字符串先處理成多個(gè)參數(shù)瓦阐,再調(diào)用函數(shù)蜗侈。

let a = 5;
let b = 10;
function tag(tpldata,...values){
    console.log(tpldata); 
    console.log(values);
    console.log(arguments);
}
tag`hello ${a+b} world ${a*b}`
//等同于
tag(['hello',' world ',''],15,50)

“標(biāo)簽?zāi)0濉钡囊粋€(gè)重要應(yīng)用,就是過(guò)濾HTML字符串睡蟋,防止用戶注入代碼


let message =
  SaferHTML`<p>${sender} has sent you a message.</p>`;

function SaferHTML(templateData) {
  let s = templateData[0];
  for (let i = 1; i < arguments.length; i++) {
    let arg = String(arguments[i]);

    // Escape special characters in the substitution.
    s += arg.replace(/&/g, "&amp;")
            .replace(/</g, "&lt;")
            .replace(/>/g, "&gt;");

    // Don't escape special characters in the template.
    s += templateData[i];
  }
  return s;}

箭頭函數(shù)

寫法: ()=>{} 小括號(hào)內(nèi)參數(shù)踏幻,等號(hào)大于號(hào),中括號(hào)內(nèi)函數(shù)體薄湿。
通常需要用一個(gè)變量或常量接收叫倍。

注意事項(xiàng)

  1. 單個(gè)參數(shù)可省略小括號(hào)偷卧,0個(gè)或多個(gè)不可省略。
  2. 單行函數(shù)體可同時(shí)省略大括號(hào)和 return 吆倦,必須同時(shí)听诸。
  3. 單行對(duì)象如果要省略大括號(hào),需要在對(duì)象外加小括號(hào):例如 const add = (x+y)=>({value:x+y})

箭頭函數(shù)沒(méi)有自己的this

非箭頭函數(shù)執(zhí)行一定會(huì)產(chǎn)生屬于這個(gè)函數(shù)的this蚕泽,箭頭函數(shù)沒(méi)有自己的this晌梨,只會(huì)從自己的作用域鏈的上一層繼承 this.

箭頭函數(shù)使用注意

  1. 不能作為構(gòu)造函數(shù)。
  2. 需要 this 指向調(diào)用對(duì)象的時(shí)候箭頭函數(shù)不適用须妻。
  3. 需要 arguments 的時(shí)候仔蝌,箭頭函數(shù)沒(méi)有 arguments 』睦簦可以用剩余參數(shù)替代敛惊。

Iterator 迭代器/遍歷器

找到 iterator
先創(chuàng)建一個(gè)數(shù)組 const arr = [1,2] 用控制臺(tái)查看,深挖其屬性會(huì)有個(gè) Symbol.iterator 绰更,執(zhí)行該方法 arr[Symbol.iterator]() 執(zhí)行后會(huì)返回一個(gè) Array Iterator{} 可以用一個(gè)量接收瞧挤。

使用Iterator
iterator調(diào)用 next() 方法,會(huì)返回 {value: xxx , done: xxx}

可迭代對(duì)象

只要有 Symbol.iterator 方法儡湾,且這個(gè)方法調(diào)用后會(huì)產(chǎn)生一個(gè) iterator 特恬。
例如:數(shù)組、字符串徐钠、arguments癌刽、NodeList、Set尝丐、Map显拜、剩余參數(shù) 等。
一般對(duì)象不是可迭代對(duì)象摊崭,可以給一般對(duì)象強(qiáng)行添加 Symbol.iterator 方法讼油。

obj[Symbol.iterator] = ()=>{
    let index = ;
    return(
        next(){
        index++;
       ……
       }
    )
}
//類數(shù)組對(duì)象可以直接偷數(shù)組原型上的
LEISHUZU[Symbol.iterator] = Array[Symbol.iterator]

for of

想要遍歷一些東西的時(shí)候,五花八門呢簸,對(duì)象用 for(...in...) 矮台,數(shù)組用 for 循環(huán)、forEach 方法根时。而 iterator 只有一種遍歷方式瘦赫,就是“下一個(gè)”,一般用系統(tǒng)封裝好的 for(...of...)

for(let item of arr){

}
  • for(...of...) 循環(huán)只會(huì)遍歷出那些 done 為false時(shí)對(duì)應(yīng)的 value 值蛤迎。(如果改寫了對(duì)象的Symbol.iterator()之后比如把done改為false則會(huì)瘋狂輸出)
  • for(...of...) 可以和 break 确虱、 continue 一起使用。

可迭代對(duì)象的方法

forEach()

forEach() 方法可遍歷 可迭代對(duì)象 替裆。
forEach() 傳入的第一個(gè)參數(shù) 是一個(gè)回調(diào)函數(shù)校辩【轿剩回調(diào)函數(shù)可以使用三個(gè)參數(shù),按順序分別是 (1)可遍歷對(duì)象鍵值對(duì)的值 (2)可遍歷對(duì)線鍵值對(duì)的鍵 (3)可遍歷對(duì)像本身宜咒。
forEach() 傳入的第二個(gè)參數(shù) 是 this 指向(非箭頭函數(shù)時(shí)才可用)惠赫。例如:

let arr = [11,22,33];
arr.forEach((value,key,self)=>{
    console.log(value,key,self)
},arr)

keys()

一些可迭代對(duì)象可以執(zhí)行 keys() 方法,遍歷此方法得到的對(duì)象故黑,可以取得鍵名(例如數(shù)組的索引值儿咱,可迭代對(duì)象的鍵名)。例如:

let arr = [1,2,3]
for(let k of arr.keys()){
 console.log(k)
}

values()

可迭代對(duì)象的 values() 方法场晶,遍歷此方法返回的對(duì)象可以取得鍵值對(duì)的值(低版本瀏覽器不支持)

let arr = [1,2,3]
for(let k of arr.values()){
 console.log(k)
}

entries()

可迭代對(duì)象的 entries() 方法混埠,遍歷此方法返回的對(duì)象可以取得鍵值對(duì)(索引+值組成的數(shù)組)

let arr = [1,2,3]
for(let k of arr.entries()){
 console.log(k)
}

生成器函數(shù)

生成器函數(shù),在舊函數(shù)聲明方法 function fc(){} 中诗轻,在function關(guān)鍵字和函數(shù)名中間插入一個(gè)*號(hào)

function* (){}

普通函數(shù)執(zhí)行時(shí)沒(méi)有停止功能 Generator函數(shù)可以暫停

Generator 生成器 返回的是iterator接口

CO庫(kù)就是不停的調(diào)用next方法將最后結(jié)果返回

Generator 中 yield 后面只能跟 Thunk 函數(shù)或 Promise 對(duì)象

function * gen(){
    console.log(arg);
    let one = yield 111;
    console.log(one)
}

let iterator = gen('AAA')
console.log(iterator.next());
console.log(iterator.next('BBB'))

next方法里面可以傳入實(shí)參钳宪,傳入的實(shí)參將會(huì)作為上一個(gè)yield整體返回的結(jié)果

展開(kāi)運(yùn)算符

... 可用于 可迭代對(duì)象 的展開(kāi)。

例如概耻,可以用于數(shù)組展開(kāi)使套,把數(shù)組拆成一個(gè)一個(gè)數(shù)字罐呼。例如:Math.min 和Math.max 只能計(jì)算一串參數(shù)的最大最小值不能傳入數(shù)組鞠柄,這時(shí)就能傳入數(shù)組同時(shí)用展開(kāi)運(yùn)算符展開(kāi)。

let arr = [1,2,3];
//直接Math.min(arr)則不計(jì)算嫉柴,可以
Math.min(...arr);

展開(kāi)運(yùn)算符可用于數(shù)組淺復(fù)制(淺克卵岫拧),例如

let arr1 = [1,2,3];
let arr2 = [...arr1]

所以展開(kāi) 可迭代對(duì)象 外直接套一個(gè)中括號(hào)可以快速轉(zhuǎn)變?yōu)橐粋€(gè)數(shù)組计螺。

展開(kāi)運(yùn)算符可以用于 對(duì)象 展開(kāi)

但不能直接展開(kāi)夯尽,只能在 {} 大括號(hào)中展開(kāi)。
所以還可以用于對(duì)象復(fù)制登馒,也可以用于合并對(duì)象匙握,用于合并對(duì)象時(shí),后展開(kāi)的與前展開(kāi)的對(duì)象同名的屬性會(huì)覆蓋陈轿。
展開(kāi)空對(duì)象沒(méi)有效果

let obj1 = {name:'mingzi',age:18}
let obj2 = {...obj1}

展開(kāi)運(yùn)算符只能“淺展開(kāi)”

即只能展開(kāi)一層

展開(kāi)運(yùn)算符特殊用法:剩余參數(shù)

當(dāng)函數(shù)執(zhí)行傳入 比形參數(shù)量更多的 實(shí)參時(shí)圈纺,可以用剩余參數(shù)接受,寫法 ...xxx 麦射,本質(zhì)是個(gè)數(shù)組蛾娶,即使沒(méi)有值,也是個(gè)控股數(shù)組潜秋,讀取時(shí)不用 ... 直接讀 xxx 即可蛔琅。例如

function func(a,b,...sycs){console.log(sycs)}
func(1,2,3,4,5,6,7,8)
//返回?cái)?shù)組[3,4,5,6,7,8]

箭頭函數(shù)中的剩余參數(shù)

箭頭函數(shù)中,因?yàn)榧^函數(shù)只有一個(gè)參數(shù)的時(shí)候可以省略小括號(hào)峻呛,但即使只有一個(gè)剩余參數(shù)罗售,也不能省略小括號(hào)辜窑。
箭頭函數(shù)沒(méi)有arguments,所以可以用剩余參數(shù)替代寨躁,且剩余參數(shù)可以用數(shù)組的方法谬擦。

剩余參數(shù)必須、只能是最后一個(gè)參數(shù)朽缎,之后不能有其他參數(shù)惨远,否則報(bào)錯(cuò)

剩余參數(shù)可以與解構(gòu)賦值結(jié)合使用。
剩余參數(shù)與對(duì)象解構(gòu)賦值結(jié)合使用會(huì)成為剩余元素话肖。

解構(gòu)賦值

  • 將 可迭代對(duì)象 的值 賦給一個(gè) 可迭代對(duì)象 書寫形式的結(jié)構(gòu)北秽,例如:const [a,b] = [1,2]
  • 對(duì)象也可以使用解構(gòu)賦值,但必須滿足 1.模式(結(jié)構(gòu))匹配 2.屬性名相同的完成匹配最筒。
  • 其他數(shù)值類型也可以使用解構(gòu)賦值贺氓,例如number和boolean,會(huì)先將等號(hào)右邊的值先轉(zhuǎn)為對(duì)象床蜘。但無(wú)法解構(gòu)其內(nèi)容辙培,只能提取繼承的屬性。
  • undefined 和 null 無(wú)法進(jìn)行解構(gòu)賦值邢锯。

可迭代對(duì)象全部都可以使用數(shù)組形式完成結(jié)構(gòu)賦值扬蕊,字符串還可以使用對(duì)象的結(jié)構(gòu)完成解構(gòu)賦值,例如: let {0:a} = 'bilibili' 丹擎,此時(shí) a 為下標(biāo)為 0 的字母b尾抑。

解構(gòu)賦值的默認(rèn)值

可以給解構(gòu)賦值的常量變量賦一個(gè)默認(rèn)值,例如 let[a=1,b=2]=[]
注意:只有右邊與左邊解構(gòu)賦值嚴(yán)格等于 undefined 時(shí)蒂培,默認(rèn)值才會(huì)生效再愈。默認(rèn)值擁有惰性求值的特性,即用得到才執(zhí)行求值式求值护戳,用不到則不執(zhí)行翎冲。

解構(gòu)賦值的應(yīng)用用途

解構(gòu)賦值可以用于快捷交換變量值,例如

let x=1,y=2;
[x,y]=[y,x]
//此時(shí)x和y就快速交換了值媳荒。

Set

Set是一些列無(wú)序抗悍、沒(méi)有重復(fù)值的數(shù)據(jù)集合。

無(wú)序: Set沒(méi)有下標(biāo)去標(biāo)識(shí)每一個(gè)值肺樟,所以set是無(wú)序的檐春,不能像數(shù)組一樣通過(guò)下標(biāo)去訪問(wèn) set 的成員,但遍歷 set 的時(shí)候么伯,是根據(jù)成員添加進(jìn) set 的順序進(jìn)行遍歷的疟暖。
沒(méi)有重復(fù)值: Set會(huì)自動(dòng)去重,Set重復(fù)值的判斷遵循全等原則,但NaN除外俐巴,在Set中NaN也不可重復(fù)骨望。

創(chuàng)建一個(gè) Set

使用 Set 構(gòu)造函數(shù) const se = new Set() 即可創(chuàng)建一個(gè)set,創(chuàng)建 Set 時(shí)可以傳入一個(gè)可迭代對(duì)象作為參數(shù)欣舵,構(gòu)造出來(lái)的Set就會(huì)擁有對(duì)象里的成員擎鸠,例如:

let arr = [1,2,3]
const se = new Set(arr)

Set 的屬性

size:可以訪問(wèn)Set里面的成員個(gè)數(shù)。new Set().size 會(huì)返回一個(gè)0.

Set 的常用方法

方法 作用
add() 添加成員缘圈,可連續(xù)使用
has() 查看是否有某個(gè)成員劣光,返回布爾值
delete() 刪除某個(gè)成員
clear() 清除所有成員
forEach() 遍歷

add

可以連續(xù)添加,例如:

const se = new Set()
se.add(1).add(2).add(3)

delete

如果刪除不存在的成員糟把,則什么都不會(huì)發(fā)生绢涡,也不會(huì)報(bào)錯(cuò)

forEach

Set 的 forEach 是按照成員添加進(jìn)Set的順序遍歷的

Set 用途

Set 可以用于 可迭代對(duì)象 去重,例如數(shù)組去重遣疯,字符串去重雄可。或者需要使用Set方法的地方也可以轉(zhuǎn)換成Set

Map

Map 和對(duì)象都是鍵值對(duì)的集合缠犀。
Map 和對(duì)象的區(qū)別:
對(duì)象一般用字符串當(dāng)作鍵数苫,Map 可以用所有數(shù)據(jù)類型的值當(dāng)鍵,包括引用類型辨液。

創(chuàng)建一個(gè) Map

使用 Map 構(gòu)造函數(shù) const ma = new Map() 即可創(chuàng)建一個(gè) Map 虐急,創(chuàng)建 Map 時(shí)可以傳入一個(gè) entry object (例如二維數(shù)組,二維set對(duì)象室梅,map對(duì)象)戏仓,例如:

let arr2d = [
    [1,2],
    [3,4],
    [5,6]
]
const ma = new Map(arr2d);

Map 屬性

size:獲取有幾個(gè)鍵值對(duì),上面的代碼然后 ma.size 會(huì)返回3.

Map 的方法

方法 作用
set() 添加新成員
get() 獲取成員
has() 判斷是否有這個(gè)成員返回布爾值
delete() 刪除成員亡鼠,如果沒(méi)有則無(wú)事發(fā)生也不報(bào)錯(cuò)
clear() 清除所有成員
forEach() 遍歷成員

set

可連續(xù)使用,例如 new Map().set(9,8).set(7,6) 敷待,當(dāng)后添加的成員與前添加的鍵名一樣時(shí)间涵,后添加的會(huì)覆蓋前添加的。

get

獲取成員榜揖,當(dāng)獲取不存在的成員時(shí)返回 undefined

Map 其他注意事項(xiàng)

Map 重復(fù)鍵名的判斷方式遵循全等原則勾哩,NaN例外。

Map 用途

當(dāng)你只需要鍵值對(duì)結(jié)構(gòu)時(shí)举哟,或者需要Map的方法時(shí)思劳,或者使用字符串以外的值做鍵時(shí)。

ES6其他新增技巧

對(duì)象字面量增強(qiáng)

  • 屬性的簡(jiǎn)潔表示法:已定義的變量或常量妨猩,可以直接寫進(jìn)對(duì)象里當(dāng)其屬性潜叛,例如:
let name = 'mingzi';
let obj = {name};   //等同于let obj = {name:name}
obj.name    //直接返回 'mingzi'
  • 方法的簡(jiǎn)潔表示法:對(duì)象的方法可以省略冒號(hào)和 function 關(guān)鍵字,例如:
//const obj = { func : function(){} }
const obj = { func(){} }
  • 方括號(hào)語(yǔ)法可以寫在對(duì)象字面量里,方括號(hào)可以注入變量值威兜,運(yùn)算值等销斟,例如:
let bianliang = 'x'
const obj = {
    [bianliang] : 18;
}
obj.x   //返回18

函數(shù)參數(shù)的默認(rèn)值

可以給函數(shù)的參數(shù)設(shè)置一個(gè)默認(rèn)值,例如:

function xjiay(x=1,y=2){
    return x+y
}
xjiay()
//直接執(zhí)行不傳參數(shù)則使用默認(rèn)值
  • 生效條件:不傳參或者傳的是undefined的時(shí)候椒舵,默認(rèn)值才會(huì)生效蚂踊。
  • 同樣擁有惰性求值特性。

ES6 其他新增方法

ES6字符串新增方法

includes() 方法

用于判斷字符串是否有某些字符笔宿。
用法:第一個(gè)參數(shù)傳入的是一個(gè)值犁钟,返回布爾值判斷字符串內(nèi)是否有這個(gè)值。第二個(gè)參數(shù)表示開(kāi)始搜索的位置泼橘。

startsWith() 和 endsWith

用于判斷參數(shù)是否在字符串的頭部和尾部特纤,返回布爾值。
例如 abcd.startsWith('ab') 返回true侥加,abcd.endsWith('cd')返回true

repeat()

repeat() 方法返回一個(gè)新的字符串捧存,表示將源字符串重復(fù)n次。例如:

'rero'.repeat(4);
//輸出rerorerorerorero

參數(shù)如果不是整數(shù)會(huì)自動(dòng)向下取整担败,為0次則不輸出內(nèi)容昔穴,為負(fù)數(shù)則報(bào)錯(cuò)

padStart() 和 padEnd()

pad是填充的意思,用于補(bǔ)全字符串長(zhǎng)度提前,無(wú)法改變?cè)址?br> 用法:

  1. 第一個(gè)參數(shù)表示“需要補(bǔ)到的長(zhǎng)度”是多少吗货,通常是一個(gè)整數(shù)。
  2. 第二個(gè)參數(shù)表示“補(bǔ)入的值”狈网,如果不傳參數(shù)2宙搬,默認(rèn)使用空格代替。
  • 如果第一個(gè)參數(shù)小于或等于原字符串長(zhǎng)度拓哺,則補(bǔ)全不生效勇垛,返回原字符串。
  • 如果第二個(gè)參數(shù)補(bǔ)入的值長(zhǎng)度士鸥,補(bǔ)入后總長(zhǎng)度不滿足第一個(gè)參數(shù)闲孤,則循環(huán)再補(bǔ),補(bǔ)到滿足長(zhǎng)度烤礁。
  • 如果第二個(gè)參數(shù)補(bǔ)入的值長(zhǎng)度讼积,補(bǔ)入后總長(zhǎng)度超過(guò)第一個(gè)參數(shù),則只補(bǔ)需要補(bǔ)的長(zhǎng)度脚仔,后面的截去勤众。

padStart() 是從頭部開(kāi)始補(bǔ), padEnd() 是從尾部開(kāi)始補(bǔ)鲤脏。例如:

'x'.padStart(5,'ab')    //返回 'ababx'
'y'.padEnd(5,'6688')    //返回 'y6688'

trimStart() 和 trimEnd()

trim是去掉不必要部分的意思们颜,用于清除字符串的首或尾的空格吕朵,中間的空格不會(huì)清除。
trimStart() 等同于 trimLeft() 掌桩,trimEnd() 等同于 trimRight()边锁。
同時(shí)去除頭尾空格的方法為 trim()。

matchAll()

matchAll() 方法返回一個(gè)正則表達(dá)式在當(dāng)前字符串的所有匹配
返回的是?個(gè)遍歷器(Iterator)波岛,?不是數(shù)組茅坛。

ES6數(shù)組新增方法

includes()

數(shù)組的 includes() 方法,可以判斷數(shù)組中是否含有某個(gè)成員则拷,判斷基于全等原則贡蓖,NaN除外。第一個(gè)參數(shù)傳入的是一個(gè)值煌茬,返回布爾值判斷數(shù)組內(nèi)是否有這個(gè)值斥铺。第二個(gè)參數(shù)表示開(kāi)始搜索的位置。

Array.from()

Array.from() 可以將 可迭代對(duì)象 和 類數(shù)組對(duì)象 轉(zhuǎn)換成數(shù)組坛善。

  • 第一個(gè)參數(shù)表示的是要轉(zhuǎn)換的對(duì)象晾蜘。本來(lái)是什么類型的值,如果沒(méi)發(fā)生顯式或隱式類型轉(zhuǎn)換眠屎,轉(zhuǎn)換后數(shù)組的每個(gè)成員還是原來(lái)的類型剔交。
  • 第二個(gè)參數(shù)是一個(gè)回調(diào)函數(shù),用于將轉(zhuǎn)換后的數(shù)組內(nèi)的每一個(gè)成員進(jìn)行處理然后返回新數(shù)組改衩。例如 Array.from('01',(count)=>{return Boolean(count)}) 將成員轉(zhuǎn)成布爾類型岖常。例如 Array.from('12',(count)=>{return count*2}) 將成員每個(gè)乘以2。
  • 第三個(gè)參數(shù)指定/修改this指向

Array.of()

Array.of()方法用于將一組值轉(zhuǎn)化為數(shù)組葫督,即新建數(shù)組竭鞍,而不考慮參數(shù)的數(shù)量或類型。

//使?Array.of()創(chuàng)建數(shù)組 
console.log(Array.of()); //[] 創(chuàng)建?個(gè)空數(shù)組
console.log(Array.of(8)); //[8] 創(chuàng)建只有?個(gè)元素值為8的數(shù)組 console.log(Array.of(1, 2, 3)); //[1,2,3] 創(chuàng)建?個(gè)值為1橄镜,2偎快,3的數(shù)組 

//以前直接使?Array創(chuàng)建數(shù)組 
console.log(Array()); //[] 創(chuàng)建?個(gè)空數(shù)組 
console.log(Array(4)); // [ , , , ] 創(chuàng)建擁有4個(gè)元素空值的數(shù)組 
console.log(Array(1, 2, 3)); //[1,2,3] 創(chuàng)建?個(gè)值為1,2蛉鹿,3的數(shù)組

find() 和 findIndex()

find() 方法找到滿足條件的第一個(gè)立即返回這個(gè)值滨砍。
findIndex() 方法找到滿足條件的第一個(gè)立即返回其索引。

  • 第一個(gè)參數(shù)是一個(gè)回調(diào)函數(shù)妖异,回調(diào)函數(shù)的參數(shù)分別為 (1)可遍歷對(duì)象鍵值對(duì)的值 (2)可遍歷對(duì)像鍵值對(duì)的鍵 (3)可遍歷對(duì)像本身×熳罚可以在這個(gè)函數(shù)里指定規(guī)則他膳。
  • 第二個(gè)參數(shù)是回調(diào)函數(shù)里面的 this 指向

some() 和 every()

ARR.every() 和 ARR.every() 目的:確定數(shù)組的所有成員是否滿足指定的測(cè)試

  • some() 方法:只要其中一個(gè)為true 就會(huì)返回true。
  • every() 方法:必須所有都返回true才會(huì)返回true绒窑,哪怕有一個(gè)false棕孙,就會(huì)返回false.
const data =[ 
    {name:'zhangsan',age:22,sex:'man'}, 
    {name:'lisi',age:25,sex:'woman'},
    {name:'wangwu',age:23,sex:'man'}, 
]; 
    
//使?some判斷data中是否含有?條name以"wang"開(kāi)頭的 
let s1 = data.some(v => v['name'].startsWith("wang")); 
console.log(s1); //true

//使?every判斷data信息中是否都是age?于20的信息。 
let s2 = data.every(v => v['age']>20); 
console.log(s2); //true 
若有?個(gè)不符合則返回false

fill()

ARR.fill() 函數(shù),使用指定的元素替換原數(shù)組內(nèi)容蟀俊,會(huì)改變?cè)瓉?lái)的數(shù)組钦铺。
參數(shù)一:要改變成的內(nèi)容;參數(shù)二:要改變的開(kāi)始位置肢预;參數(shù)三:要改變的結(jié)束位置矛洞。

//空數(shù)組則沒(méi)有替換 
console.log([].fill(6)); //[] 
//將數(shù)組中的值都替換成指定值6 
console.log([1,2,3].fill(6));//(3) [6, 6, 6] 
//從數(shù)組索引位置2開(kāi)始替換成指定值6,替換到數(shù)組結(jié)束位置烫映。 
console.log([1,2,3,4,5].fill(6,2)); //(5) [1, 2, 6, 6, 6]
//從數(shù)組索引位置2開(kāi)始替換到索引位置4前結(jié)束沼本。 
console.log([1,2,3,4,5].fill(6,2,4)); //(5) [1, 2, 6, 6, 5]

ES6對(duì)象新增方法

Object.assign()

Object.assign() 作用是合并對(duì)象
傳入的參數(shù)為多個(gè)對(duì)象。本質(zhì)是將后面參數(shù)的對(duì)象合并到第一個(gè)參數(shù)中锭沟,會(huì)改變第一個(gè)參數(shù)自身抽兆。如果不想改變?nèi)魏螀?shù),可以在第一個(gè)參數(shù)寫一個(gè)空對(duì)象族淮,例如: Object.assign({},obj1,obj2)

注意事項(xiàng):基本數(shù)據(jù)類型作為源對(duì)象時(shí)辫红,會(huì)先轉(zhuǎn)換成對(duì)象,再合并祝辣。合并時(shí)如果出現(xiàn)同名屬性贴妻,后面的會(huì)把前面的覆蓋。

Object.keys() 较幌、Object.values() 揍瑟、 Object.entries()

這三個(gè)方法都是Object構(gòu)造函數(shù)上的, 傳入的參數(shù)是一個(gè)對(duì)象乍炉,執(zhí)行后分別返回鍵名組成的數(shù)組绢片、值組成的數(shù)組、鍵值對(duì)組成的數(shù)組岛琼。
為什么返回的不是 可迭代對(duì)象 底循?因?yàn)?keys 是ES5的方法,ES5 中沒(méi)有 Iterator 的概念槐瑞,所以為了統(tǒng)一熙涤,Object 的這三個(gè)方法返回的都是數(shù)組。

Object.fromEntries()

是 Object.entries() 的逆操作困檩,將可迭代對(duì)象作參數(shù)傳入Object.fromEntries()中祠挫,會(huì)返回一個(gè)對(duì)象。

Object.is()

  • ES5 ?較兩個(gè)值是否相等悼沿,只有兩個(gè)運(yùn)算符:相等運(yùn)算符(==)和嚴(yán)格相等運(yùn)算符(===)等舔。 它們都有缺點(diǎn),前者會(huì)?動(dòng)轉(zhuǎn)換數(shù)據(jù)類型糟趾,后者的NaN不等于?身慌植,以及+0等于-0甚牲。 JavaScript 缺乏?種運(yùn)算,在所有環(huán)境中蝶柿,只要兩個(gè)值是?樣的丈钙,它們就應(yīng)該相等。
  • ES6 提出“Same-value equality”(同值相等)算法交汤,?來(lái)解決這個(gè)問(wèn)題雏赦。 Object.is就是部署這個(gè)算法的新?法。它?來(lái)?較兩個(gè)值是否嚴(yán)格相等蜻展,與嚴(yán)格?較運(yùn)算符 (===)的?為基本?致喉誊。
Object.is('foo', 'foo') // true 
Object.is({}, {}) //false
+0 === -0 //true 
NaN === NaN // false 
Object.is(+0, -0) // false
Object.is(NaN, NaN) // true

Object.getOwnPropertyDescriptors()

ES5 的Object.getOwnPropertyDescriptor()?法會(huì)返回某個(gè)對(duì)象屬性的描述對(duì)象 (descriptor)。 ES2017 引?了Object.getOwnPropertyDescriptors()?法纵顾,返回指定對(duì)象所有?身屬性(?繼承 屬性)的描述對(duì)象

const obj = { foo: 123, get bar() { return 'abc' } }; 
Object.getOwnPropertyDescriptors(obj);
// { foo: 
// { value: 123, 
// writable: true, 
// enumerable: true, 
// configurable: true }, 
// bar: 
// { get: [Function: get bar], 
// set: undefined, 
// enumerable: true, 
// configurable: true } }

伍茄、proto屬性,Object.setPrototypeOf()和Object.getPrototypeOf()

JavaScript 語(yǔ)?的對(duì)象繼承是通過(guò)原型鏈實(shí)現(xiàn)的施逾。ES6 提供了更多原型對(duì)象的操作?法敷矫。 具體詳??檔

Object.defineProperty

參數(shù)一:給誰(shuí)添加屬性
參數(shù)二:添加屬性的屬性名
參數(shù)三:配置項(xiàng),是一個(gè)對(duì)象汉额,其中包括value曹仗。
此方法定義的屬性默認(rèn)是不可枚舉/遍歷的,可在配置項(xiàng)里修改enumerable:true開(kāi)啟遍歷蠕搜。
定于的屬性默認(rèn)是不可以被修改的怎茫,可在配置項(xiàng)修改 writable:true 開(kāi)啟修改
定義的屬性默認(rèn)是不可以被刪除的,可在配置項(xiàng)修改 configurable:true 開(kāi)啟刪除

類與對(duì)象

class (類)

  • Javascript 的類妓灌,寫法為
class 類名{   }

注意沒(méi)有圓括號(hào)和分號(hào)轨蛤。

  • 類也可以是匿名的,所以可以用表達(dá)式形式定義類
const 類名 =class{    }
  • type of 類 返回的也是一個(gè) function 虫埂,類里的方法本質(zhì)上也是相當(dāng)于寫在這個(gè) function 上的 prototype 上祥山,所以 class 是構(gòu)造函數(shù)的語(yǔ)法糖。
    所以衍生出了“立即執(zhí)行類”掉伏,例如:
//加new因?yàn)閏onstructor必須要有new才能執(zhí)行缝呕。
(new class {
    constructor(){
        執(zhí)行語(yǔ)句;
    }
})

constructor

class里的構(gòu)造方法 constructor 用法,如下:

class 類名{
    constructor(參數(shù)1,參數(shù)2...參數(shù)n){
        this.屬性名1 = 參數(shù)1;
        this.屬性名2 = 參數(shù)2
    }
}
  • 構(gòu)造方法 constructor 里面的 this 直接指向?qū)嵗鰜?lái)的對(duì)象斧散。
  • 構(gòu)造方法 constructor 里面一般不定義方法供常,只定義屬性,因?yàn)?constructor 里的方法會(huì)使每個(gè)實(shí)例都新生成一個(gè)自己的方法鸡捐,占用新內(nèi)存话侧。
  • 所以共享的方法直接寫在類里即可,不用寫在 constructor 里面闯参,注意寫法瞻鹏,方法與方法之間沒(méi)有逗號(hào),直接寫 方法名(){ } 即可鹿寨,不用加function關(guān)鍵字新博,例如:
class 類名{
    constructor(參數(shù)1,參數(shù)2...參數(shù)n){
        this.屬性名1 = 參數(shù)1;
        this.屬性名2 = 參數(shù)2
    }
    方法1 (){     }
    方法2 (){     }
}

類的方法(靜態(tài)方法)

使用關(guān)鍵字 static ,寫在聲明里脚草,是只有類可以訪問(wèn)的赫悄,實(shí)例無(wú)法訪問(wèn),例如:

//static 靜態(tài)方法名(){}
class Lei{
    static func(){
        console.log('靜態(tài)方法')
    }
}
Lei.func()

類的屬性(靜態(tài)屬性)

有三種方法:

  1. 類名.屬性名 = 值
  2. 聲明里寫 static 靜態(tài)方法(){return 值;}
  3. 聲明里直接寫 static 靜態(tài)屬性 = 值
    方法3存在兼容性問(wèn)題馏慨,低版本瀏覽器不支持埂淮。

實(shí)例對(duì)象

如何創(chuàng)建一個(gè)實(shí)例:

new 類名();

即可生成一個(gè)實(shí)例對(duì)象,這個(gè)實(shí)例對(duì)象會(huì)擁有 class 里面的 constructor 的屬性写隶。例如

class Person{
    constructor(a,b){
        this.name = a;
        this.age = b;
    }
}
const student = new Person('ming',24);

這個(gè) student 就會(huì)擁有 name 和 age 屬性倔撞,屬性值是什么取決于你寫的是定值還是參數(shù)。
也可以給屬性值添加默認(rèn)值(截至2021年7月默認(rèn)值已失效)

JS 類與對(duì)象 的私有屬性和方法

想要實(shí)現(xiàn)私有慕趴,可以使用閉包實(shí)現(xiàn)痪蝇,或者利用模塊化。

class 繼承

使用關(guān)鍵字 extends 和關(guān)鍵字 super 冕房,例如:

class Person{
    constructor(a,b){
        this.name = a;
        this.age = b;
    }
    func(){console.log(1)}
}

class Student extends Person{

}

此時(shí) Student 這個(gè)類就會(huì)擁有 Person 的所有構(gòu)造方法和共享方法躏啰。

子類如果想要擁有自己的構(gòu)造方法,則必須配合 super 關(guān)鍵字使用耙册,否則會(huì)報(bào)錯(cuò)给僵;
super 前面不能放任何this操作,否則報(bào)錯(cuò)详拙。例如

class Person{
    constructor(a,b){
        this.name = a;
        this.age = b;
    }
    func(){console.log(this.name)}
}
class Student extends Person{
    constructor(x,y,c){
        super(x,y)      
        //這里super接收的參數(shù)會(huì)扔到父類的constructor中執(zhí)行帝际,this指向子類實(shí)例
        this.newProp = c
    }
}

子類想要使用父類的方法,子類調(diào)用的父類方法里的this指向的是父類溪厘,所以要在之類的構(gòu)造方法里使用super

class 中的 super 關(guān)鍵字

  1. 在構(gòu)造方法和一般方法中使用胡本,super 代表的都是父類的原型 SUPERCLASS.prototype
  2. 在靜態(tài)方法 static FUNCTION(){} 中使用,代表的是父類自身畸悬,this 指向子類侧甫。
  • super 要么接點(diǎn)要么接括號(hào),否則瀏覽器會(huì)報(bào)錯(cuò)蹋宦。

class中的get和set

當(dāng)實(shí)例調(diào)用讀取父類方法時(shí)會(huì)觸發(fā)get方法披粟,get方法里面返回的值就是觸發(fā)后返回的值
當(dāng)實(shí)例修改父類方法時(shí)會(huì)觸發(fā)set方法,set方法必須帶有一個(gè)形參

class Phone{
    get price(){
        console.log('價(jià)格屬性被讀取了')
        return 'iloveyou'
    }
    set price(newVal){
        console.log('價(jià)格被修改了')
    }
}

let s = new Phone()
console.log(s.price);   //這里會(huì)觸發(fā)get price并得到里面的返回值
s.price = 'free';   //這里會(huì)觸發(fā)set

Module 模塊系統(tǒng)

模塊系統(tǒng)解決的主要問(wèn)題:

  1. 模塊化的問(wèn)題冷冗。
  2. 消除全局變量守屉。
  3. 管理加載順序。

import蒿辙、export拇泛、export default 和 script type='module'

  • 只要你會(huì)用到 import 或 export 滨巴,在使用 script 標(biāo)簽加載的時(shí)候,就要使用 <script type='module'></script>
  • 一個(gè)模塊如果沒(méi)有導(dǎo)出俺叭,也可以直接將其導(dǎo)入恭取,被導(dǎo)入的代碼都會(huì)執(zhí)行一遍,多次導(dǎo)入同一個(gè)模塊也只執(zhí)行一遍熄守,但無(wú)法使用模塊的東西蜈垮。

export default

export default 可以直接接模塊里的定變量名,類或類名裕照,方法或方法名等攒发。

  • 注意一個(gè)模塊只能有一個(gè) export default
  • 注意 export default 導(dǎo)出的東西是按語(yǔ)句順序執(zhí)行的,沒(méi)有提升晋南。
    export default 的 import 直接寫導(dǎo)出的東西然后命名即可惠猿,名字可以隨便取。

export

export 導(dǎo)出可以有兩種形式搬俊。

  1. 接聲明或語(yǔ)句紊扬,例如 export let a = 'cosin'
  2. 接大括號(hào),例如 export {導(dǎo)出1,導(dǎo)出2}
    export 的 import 只能用大括號(hào)接收唉擂,例如 import{導(dǎo)出1,導(dǎo)出2}

如果導(dǎo)出或?qū)氲臇|西想改名稱餐屎,可以使用 as 關(guān)鍵字,例如:

export {name as newName}    //此時(shí)import 接收的是 newName
import{newName as newnew}

import

import三種形式導(dǎo)入

  1. 通用形式導(dǎo)入玩祟,用as后接一個(gè)名字當(dāng)作接受的對(duì)象
import * as m1 from './js/m1.js'
console.log(m1.name)
m1.fn()
  1. 解構(gòu)賦值形式導(dǎo)入
import {name,fn} from './js/m1.js'
import {name as mingzi,fn as fangfa} from './js/m2/js'
import {default as mod} from './js/m3.js'
  1. 簡(jiǎn)便形式 僅針對(duì) export deafault 默認(rèn)暴露
import m3 from './js/m3.js'

同時(shí)導(dǎo)入

因?yàn)?export 和 export default 的導(dǎo)入方式不同腹缩,所以想一次導(dǎo)入這兩種導(dǎo)出,可以使用:

  1. import default導(dǎo)出的,{非default導(dǎo)出} from '路徑'
  2. 采用整體導(dǎo)入空扎,使用通配符 * 星號(hào)然后接 as 然后接一個(gè)名字藏鹊,就代表導(dǎo)入所有導(dǎo)出的,包括 export 和 export default 的转锈,例如:
import * as obj from './module.js'

導(dǎo)入的內(nèi)如是一個(gè) Module 對(duì)象盘寡,導(dǎo)出的東西都會(huì)變成這個(gè) Module 對(duì)象的屬性茎截,default 的內(nèi)容會(huì)變成 default 屬性

Module 注意事項(xiàng)

  1. 導(dǎo)入的變量是只讀的扼脐,導(dǎo)入的對(duì)象的屬性值可以修改。
  2. 一個(gè)模塊可以直接寫export软棺,即導(dǎo)入后直接導(dǎo)出砌溺,此時(shí)這個(gè)模塊不可以使用導(dǎo)入的任何東西影涉,相當(dāng)于一個(gè)中轉(zhuǎn)站。
  3. import 和 export 命令具有提升效果规伐,會(huì)提升到整個(gè)模塊的頭部并率先執(zhí)行蟹倾。所以 import 和 export 別寫在代碼塊中,想要按條件導(dǎo)入,可以使用 import() 函數(shù)鲜棠。
  4. 模塊頂層的 this 指向 undefined 肌厨,可以利用這點(diǎn)提示使用模塊加載,例如:
if(type of this !== 'undefined'){
    throw new Error('請(qǐng)使用模塊加載')
}

ES6 數(shù)值拓展

Number.EPSILON

Number.EPSILON是 Javascript表示的最小進(jìn)度岔留,可以用來(lái)做浮點(diǎn)運(yùn)算判斷 夏哭、

fuction equal(a,b){
    if(Math.abs(a-b)<Number.EPSILON){
        return true;
    }else{
        return false;
    }
}
console.log(equal(0.1+0.2,0.3))

Number.isFinite 檢測(cè)一個(gè)數(shù)值是否為有限數(shù)

console.log(Number.isFinite(100))

Number.isNaN

isNaN舊方法扔進(jìn)Number中

Math.trunc()

將數(shù)字(參數(shù))的小數(shù)部分抹掉

Math.sign()

判斷參數(shù)是正數(shù)、負(fù)數(shù)献联、還是0

直接書寫N進(jìn)制數(shù)字

let b = 0b1010
let o = 0o777

ES7 新特性

includes

可以檢測(cè)數(shù)組是否擁有該組員

兩個(gè)星號(hào)(乘號(hào))

兩個(gè)星號(hào)后面接的數(shù)字代表幾次方,2 ** 10 類似于 Math.pow(2,10)

ES8

async 函數(shù)

在函數(shù)前面加上 async 關(guān)鍵字

async function fn(){

}

async函數(shù)返回結(jié)果是一個(gè)promise何址,返回的promise狀態(tài)由內(nèi)容決定

  1. 如果返回的東西是一個(gè)Promise對(duì)象里逆,則由該promise決定成功還是失敗
  2. 如果返回結(jié)果是拋出一個(gè)錯(cuò)誤,則狀態(tài)為失敗reject用爪,例如 throw new Error('err')
  3. 其他返回結(jié)果大多為成功resolve/fulfilled

await

  1. await 要放在 async 函數(shù)中
  2. await 右側(cè)的表達(dá)式一般為 promise 對(duì)象
  3. await 返回的是 promise 成功的值
  4. await 的 promise 失敗了原押,就會(huì)拋出異常,需要使用 try{}catch{} 捕獲

ES9

正則捕獲分組

?<>

方向斷言

?<=

dotAll 拓展

結(jié)尾加上s

ES10

數(shù)組拓展 flat

將多維數(shù)組轉(zhuǎn)化為低維數(shù)組
ARR.flat()
參數(shù)是數(shù)字偎血,意義為展開(kāi)深度為幾層诸衔,例如三維轉(zhuǎn)一維,深度就是3-1=2

數(shù)組拓展 flatMap

如果數(shù)組使用map之后返回一個(gè)多元數(shù)組颇玷,flatMap則是把多元數(shù)組變回一維數(shù)組笨农,
ARR.flatMap() 就是數(shù)組的map方法和flat方法結(jié)合

Symbol.prototype.description

let sb = Symbol('HQM')
sb.description

ES11

對(duì)象的私有屬性

在屬性前面加上井號(hào)

class Person{
    name;
    #age;
    #weight;
    constructor(name,age,weght){
        this.name = name;
        this.#age = age;
        this.#weight = weight;
    }
}

const girl = new Person('hong',18,'45kg')
console.log(girl.#age)  //此時(shí)會(huì)報(bào)錯(cuò),私有屬性不能在外部直接訪問(wèn)帖渠,可以在類定義一個(gè)內(nèi)部方法通過(guò)內(nèi)部方法訪問(wèn)

Promise.allSettled

  • Promise.all 是有一個(gè)失敗則直接返回失敗谒亦。
  • 而 Promise.allSettled 是無(wú)論成功還是失敗都會(huì)把所有參數(shù)里的Promise全部執(zhí)行完再返回結(jié)果。結(jié)果都是成功
  • Promise.allSettled() 和 Promise.all() 的參數(shù)都是一個(gè)可迭代對(duì)象(通常為數(shù)組)

可選鏈操作符

?.
當(dāng)一個(gè)函數(shù)的參數(shù) 是一個(gè)對(duì)象的時(shí)候空郊,如果要找傳入的對(duì)象是否有這個(gè)值份招,一般需要層層判斷,有了可選鏈操作符狞甚,直接使用 ?. 即可锁摔,不會(huì)報(bào)錯(cuò)

const fn = (config) => {
            console.log(config.db.a1);
        }
fn({
    db: {
        a1: '111',
        a2: '222'
    }
})
//如果有這個(gè)參數(shù)則不會(huì)報(bào)錯(cuò)
const fn = (config) => {
            console.log(config.db.a1);
        }
fn()
//如果沒(méi)有這個(gè)參數(shù)則報(bào)錯(cuò),只能使用 config&&config.db&&config.db.a1

有了可選鏈操作符哼审,只需要這樣即可

console.log(config?.db?.a1)

動(dòng)態(tài)import

主要用來(lái)提升性能谐腰,動(dòng)態(tài)import就是不在文件頭部使用import導(dǎo)入模塊,而是使用import()這個(gè)函數(shù)在使用的時(shí)候才導(dǎo)入棺蛛,函數(shù)的參數(shù)就是導(dǎo)入這個(gè)模塊的路徑怔蚌。
導(dǎo)入執(zhí)行之后返回的是一個(gè)Promise,用then后的回調(diào)函數(shù)的參數(shù)接收此模塊

BigInt() 大整數(shù)

在整數(shù)后面加一個(gè)字母n旁赊,就是大整型數(shù)據(jù)類型

let bi = 521n
console.log(bi,typeof bi)

使用 BigInt() 方法桦踊,往里面穿一個(gè)整型數(shù)字,就會(huì)轉(zhuǎn)變?yōu)榇笳蛿?shù)字

let norm = 123
console.log(BigInt(norm))

運(yùn)用場(chǎng)景是大數(shù)值運(yùn)算终畅,BigInt不能和普通Int做運(yùn)算

let max = Number.MAX_SAFE_INTEGER
console.log(max)
console.log(max+1)
console.log(max+2)
//此時(shí)就會(huì)計(jì)算丟失精度

console.log(BigInt(max))
console.log(BigInt(max)+BigInt(1))
console.log(BigInt(max)+BigInt(2))
//使用BigInt之后就沒(méi)有問(wèn)題

絕對(duì)全局對(duì)象 globalThis

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末籍胯,一起剝皮案震驚了整個(gè)濱河市竟闪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌杖狼,老刑警劉巖炼蛤,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蝶涩,居然都是意外死亡理朋,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門绿聘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嗽上,“玉大人,你說(shuō)我怎么就攤上這事熄攘∈薹撸” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵挪圾,是天一觀的道長(zhǎng)浅萧。 經(jīng)常有香客問(wèn)我,道長(zhǎng)哲思,這世上最難降的妖魔是什么洼畅? 我笑而不...
    開(kāi)封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮也殖,結(jié)果婚禮上土思,老公的妹妹穿的比我還像新娘。我一直安慰自己忆嗜,他們只是感情好己儒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著捆毫,像睡著了一般闪湾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绩卤,一...
    開(kāi)封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天途样,我揣著相機(jī)與錄音,去河邊找鬼濒憋。 笑死何暇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凛驮。 我是一名探鬼主播裆站,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了宏胯?” 一聲冷哼從身側(cè)響起羽嫡,我...
    開(kāi)封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肩袍,沒(méi)想到半個(gè)月后杭棵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡氛赐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年魂爪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鹰祸。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡甫窟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛙婴,到底是詐尸還是另有隱情,我是刑警寧澤尔破,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布街图,位于F島的核電站,受9級(jí)特大地震影響懒构,放射性物質(zhì)發(fā)生泄漏餐济。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一胆剧、第九天 我趴在偏房一處隱蔽的房頂上張望絮姆。 院中可真熱鬧,春花似錦秩霍、人聲如沸篙悯。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鸽照。三九已至,卻和暖如春颠悬,著一層夾襖步出監(jiān)牢的瞬間矮燎,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工赔癌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诞外,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓灾票,卻偏偏與公主長(zhǎng)得像峡谊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容