JS基本概念

什么是 JavaScript 語言聋溜?

JavaScript 是一種輕量級的腳本語言。所謂“腳本語言”(script language)缨称,指的是它不具備開發(fā)操作系統(tǒng)的能力睦尽,而是只用來編寫控制其他大型應(yīng)用程序(比如瀏覽器)的“腳本”。

JavaScript 也是一種嵌入式語言沿量。它本身提供的核心語法不算很多,只能用來做一些數(shù)學(xué)和邏輯運算乌妒。JavaScript 本身不提供任何與 I/O(輸入/輸出)相關(guān)的 API,都要靠宿主環(huán)境提供侦啸,所以 JavaScript 只合適嵌入更大型的應(yīng)用程序環(huán)境,去調(diào)用宿主環(huán)境提供的底層 API。

目前服赎,已經(jīng)嵌入 JavaScript 的宿主環(huán)境有多種践付,最常見的環(huán)境就是瀏覽器永高,另外還有服務(wù)器環(huán)境曹傀,也就是 Node 項目嗜价。

從語法角度看久锥,JavaScript 語言是一種“對象模型”語言。各種宿主環(huán)境通過這個模型,描述自己的功能和操作接口暂氯,從而通過 JavaScript 控制這些功能。但是辣吃,JavaScript 并不是純粹的“面向?qū)ο笳Z言”,還支持其他編程范式(比如函數(shù)式編程)哩簿。這導(dǎo)致幾乎任何一個問題节榜,JavaScript 都有多種解決方法。

JavaScript 的核心語法部分相當(dāng)精簡讳窟,只包括兩個部分:基本的語法構(gòu)造(比如操作符谋右、控制結(jié)構(gòu)、語句)和標(biāo)準(zhǔn)庫(就是一系列具有各種功能的對象比如ArrayDate呢岗、Math等)。除此之外挫酿,各種宿主環(huán)境提供額外的 API(即只能在該環(huán)境使用的接口),以便 JavaScript 調(diào)用。以瀏覽器為例,它提供的額外 API 可以分成三大類藏杖。

  • 瀏覽器控制類:操作瀏覽器
  • DOM 類:操作網(wǎng)頁的各種元素
  • Web 類:實現(xiàn)互聯(lián)網(wǎng)的各種功能

如果宿主環(huán)境是服務(wù)器,則會提供各種操作系統(tǒng)的 API,比如文件操作 API误褪、網(wǎng)絡(luò)通信 API等等。這些都可以在 Node 環(huán)境中找到。

JavaScript 的基本語法

語句

JavaScript 程序的執(zhí)行單位為行帜羊,也就是一行一行地執(zhí)行。一般情況下,每一行就是一個語句痹籍。

語句(statement)是為了完成某種任務(wù)而進(jìn)行的操作,比如下面就是一行賦值語句。

var a = 1 + 3;

這條語句先用var命令渔肩,聲明了變量a,然后將1 + 3的運算結(jié)果賦值給變量a

1 + 3叫做表達(dá)式(expression)蛉艾,指一個為了得到返回值的計算式拓瞪。語句和表達(dá)式的區(qū)別在于,前者主要為了進(jìn)行某種操作,一般情況下不需要返回值泰演;后者則是為了得到返回值,一定會返回一個值。凡是 JavaScript 語言中預(yù)期為值的地方,都可以使用表達(dá)式耕突。比如,賦值語句的等號右邊,預(yù)期是一個值,因此可以放置各種表達(dá)式纸俭。

語句以分號結(jié)尾郎楼,一個分號就表示一個語句結(jié)束。多個語句可以寫在一行內(nèi)放妈。

var a = 1 + 3 ; var b = 'abc';

分號前面可以沒有任何內(nèi)容珍策,JavaScript引擎將其視為空語句。

;;;

上面的代碼就表示3個空語句。

表達(dá)式不需要分號結(jié)尾铺韧。一旦在表達(dá)式后面添加分號哈打,則JavaScript引擎就將表達(dá)式視為語句,這樣會產(chǎn)生一些沒有任何意義的語句讯壶。

1 + 3;
'abc';

上面兩行語句只是單純地產(chǎn)生一個值料仗,并沒有任何實際的意義。

變量

概念

變量是對“值”的具名引用立轧。變量就是為“值”起名,然后引用這個名字躏吊,就等同于引用這個值氛改。變量的名字就是變量名。

var a = 1;

上面的代碼先聲明變量a颜阐,然后在變量a與數(shù)值1之間建立引用關(guān)系平窘,稱為將數(shù)值1“賦值”給變量a。以后凳怨,引用變量名a就會得到數(shù)值1瑰艘。最前面的var是鬼,是變量聲明命令。它表示通知解釋引擎紫新,要創(chuàng)建一個變量a均蜜。

注意,JavaScript 的變量名區(qū)分大小寫芒率,Aa是兩個不同的變量囤耳。

變量的聲明和賦值,是分開的兩個步驟偶芍,上面的代碼將它們合在了一起充择,實際的步驟是下面這樣。

var a;
a = 1;

如果只是聲明變量而沒有賦值匪蟀,則該變量的值是undefined椎麦。undefined是一個特殊的值,表示“無定義”材彪。

var a;
a // undefined

如果變量賦值的時候观挎,忘了寫var命令,這條語句也是有效的段化。

var a = 1;
// 基本等同
a = 1;

但是嘁捷,不寫var的做法,不利于表達(dá)意圖显熏,而且容易不知不覺地創(chuàng)建全局變量雄嚣,所以建議總是使用var命令聲明變量。

如果一個變量沒有聲明就直接使用佃延,JavaScript會報錯现诀,告訴你變量未定義。

x
// ReferenceError: x is not defined

上面代碼直接使用變量x履肃,系統(tǒng)就報錯仔沿,告訴你變量x沒有聲明。

可以在同一條var命令中聲明多個變量尺棋。

var a, b;

JavaScript是一種動態(tài)類型語言封锉,也就是說,變量的類型沒有限制膘螟,變量可以隨時更改類型成福。

var a = 1;
a = 'hello';

上面代碼中,變量a起先被賦值為一個數(shù)值荆残,后來又被重新賦值為一個字符串奴艾。第二次賦值的時候,因為變量a已經(jīng)存在内斯,所以不需要使用var命令蕴潦。

如果使用var重新聲明一個已經(jīng)存在的變量像啼,是無效的。

var x = 1;
var x;
x // 1

但是潭苞,如果第二次聲明的時候還進(jìn)行了賦值忽冻,則會覆蓋掉前面的值。

var x = 1;
var x = 2;

// 等同于
var x = 1;
var x;
x = 2;

變量提升

JavaScript引擎的工作方式是此疹,先解析代碼僧诚,獲取所有被聲明的變量,然后再一行一行地運行蝗碎。這造成的結(jié)果湖笨,就是所有的變量的聲明語句,都會被提升到代碼的頭部衍菱,這就叫做變量提升(hoisting)赶么。

console.log(a);
var a = 1;

上面代碼首先使用console.log方法肩豁,在控制臺顯示變量a的值脊串。這時變量a還沒有聲明和賦值,所以這是一種錯誤的做法清钥,但是實際上不會報錯琼锋。因為存在變量提升,真正運行的是下面的代碼祟昭。

var a;
console.log(a);
a = 1;

最后的結(jié)果是顯示undefined缕坎,表示變量a已聲明,但還未賦值篡悟。

標(biāo)識符

標(biāo)識符(identifier)指的是用來識別各種值的合法名稱谜叹。最常見的標(biāo)識符就是變量名,以及后面要提到的函數(shù)名搬葬。JavaScript語言的標(biāo)識符對大小寫敏感荷腊,所以aA是兩個不同的標(biāo)識符。

標(biāo)識符有一套命名規(guī)則急凰,不符合規(guī)則的就是非法標(biāo)識符女仰。JavaScript引擎遇到非法標(biāo)識符,就會報錯抡锈。

簡單說疾忍,標(biāo)識符命名規(guī)則如下。

  • 第一個字符床三,可以是任意Unicode字母(包括英文字母和其他語言的字母)一罩,以及美元符號($)和下劃線(_)。
  • 第二個字符及后面的字符撇簿,除了Unicode字母聂渊、美元符號和下劃線推汽,還可以用數(shù)字0-9

下面這些都是合法的標(biāo)識符歧沪。

arg0
_tmp
$elem
π

下面這些則是不合法的標(biāo)識符歹撒。

1a  // 第一個字符不能是數(shù)字
23  // 同上
***  // 標(biāo)識符不能包含星號
a+b  // 標(biāo)識符不能包含加號
-d  // 標(biāo)識符不能包含減號或連詞線

中文是合法的標(biāo)識符,可以用作變量名诊胞。

var 臨時變量 = 1;

JavaScript有一些保留字暖夭,不能用作標(biāo)識符:arguments、break撵孤、case迈着、catch、class邪码、const嗽上、continue俯在、debugger、default、delete吩案、do锥忿、else患民、enum录粱、eval、export平委、extends奈虾、false、finally廉赔、for肉微、function、if蜡塌、implements碉纳、import、in岗照、instanceof村象、interface、let攒至、new厚者、null、package迫吐、private库菲、protected、public志膀、return熙宇、static鳖擒、super、switch烫止、this蒋荚、throw、true馆蠕、try期升、typeof、var互躬、void播赁、while、with吼渡、yield容为。

注釋

源碼中被JavaScript引擎忽略的部分就叫做注釋,它的作用是對代碼進(jìn)行解釋寺酪。JavaScript 提供兩種注釋的寫法:一種是單行注釋坎背,用//起頭;另一種是多行注釋房维,放在/**/之間沼瘫。

// 這是單行注釋

/*
 這是
 多行
 注釋
*/

此外,由于歷史上 JavaScript 可以兼容 HTML 代碼的注釋咙俩,所以``也被視為合法的單行注釋。

x = 1; <!-- x = 2;
--> x = 3;

上面代碼中湿故,只有x = 1會執(zhí)行阿趁,其他的部分都被注釋掉了。

需要注意的是坛猪,-->只有在行首脖阵,才會被當(dāng)成單行注釋,否則會當(dāng)作正常的運算墅茉。

function countdown(n) {
  while (n --> 0) console.log(n);
}
countdown(3)
// 2
// 1
// 0

上面代碼中命黔,n --> 0實際上會當(dāng)作n-- > 0,因此輸出2就斤、1悍募、0。

區(qū)塊

JavaScript使用大括號洋机,將多個相關(guān)的語句組合在一起坠宴,稱為“區(qū)塊”(block)。

對于var命令來說绷旗,JavaScript的區(qū)塊不構(gòu)成單獨的作用域(scope)喜鼓。

{
  var a = 1;
}
a // 1

上面代碼在區(qū)塊內(nèi)部副砍,使用var命令聲明并賦值了變量a,然后在區(qū)塊外部庄岖,變量a依然有效豁翎,區(qū)塊對于var命令不構(gòu)成單獨的作用域,與不使用區(qū)塊的情況沒有任何區(qū)別隅忿。在JavaScript語言中谨垃,單獨使用區(qū)塊并不常見,區(qū)塊往往用來構(gòu)成其他更復(fù)雜的語法結(jié)構(gòu)硼控,比如for刘陶、ifwhile牢撼、function等匙隔。

條件語句

JavaScript 提供if結(jié)構(gòu)和switch結(jié)構(gòu),完成條件判斷熏版,即只有滿足預(yù)設(shè)的條件纷责,才會執(zhí)行相應(yīng)的語句。

if 結(jié)構(gòu)

if結(jié)構(gòu)先判斷一個表達(dá)式的布爾值撼短,然后根據(jù)布爾值的真?zhèn)卧偕牛瑘?zhí)行不同的語句。

if (布爾值)
  語句;
// 或者
if (布爾值) 語句;

上面是if結(jié)構(gòu)的基本形式曲横。需要注意的是喂柒,“布爾值”往往由一個條件表達(dá)式產(chǎn)生的,必須放在圓括號中禾嫉,表示對表達(dá)式求值灾杰。如果表達(dá)式的求值結(jié)果為true,就執(zhí)行緊跟在后面的語句熙参;如果結(jié)果為false艳吠,則跳過緊跟在后面的語句。

這種寫法要求條件表達(dá)式后面只能有一個語句孽椰。如果想執(zhí)行多個語句昭娩,必須在if的條件判斷之后,加上大括號黍匾,表示代碼塊(多個語句合并成一個語句)栏渺。

if (m === 3) {
  m += 1;
}

建議總是在if語句中使用大括號,因為這樣方便插入語句膀捷。

注意迈嘹,if后面的表達(dá)式之中,不要混淆賦值表達(dá)式(=)、嚴(yán)格相等運算符(===)和相等運算符(==)秀仲。尤其是賦值表達(dá)式不具有比較作用融痛。

var x = 1;
var y = 2;
if (x = y) {
  console.log(x);
}
// "2"

上面代碼的原意是,當(dāng)x等于y的時候神僵,才執(zhí)行相關(guān)語句雁刷。但是,不小心將嚴(yán)格相等運算符寫成賦值表達(dá)式保礼,結(jié)果變成了將y賦值給變量x沛励,再判斷變量x的值(等于2)的布爾值(結(jié)果為true)。

這種錯誤可以正常生成一個布爾值炮障,因而不會報錯目派。為了避免這種情況,有些開發(fā)者習(xí)慣將常量寫在運算符的左邊胁赢,這樣的話企蹭,一旦不小心將相等運算符寫成賦值運算符,就會報錯智末,因為常量不能被賦值谅摄。

if (x = 2) { // 不報錯
if (2 = x) { // 報錯
if...else 結(jié)構(gòu)

if代碼塊后面,還可以跟一個else代碼塊系馆,表示不滿足條件時送漠,所要執(zhí)行的代碼。

if (m === 3) {
  // 滿足條件時由蘑,執(zhí)行的語句
} else {
  // 不滿足條件時闽寡,執(zhí)行的語句
}

對同一個變量進(jìn)行多次判斷時,多個if...else語句可以連寫在一起纵穿。

if (m === 0) {
  // ...
} else if (m === 1) {
  // ...
} else if (m === 2) {
  // ...
} else {
  // ...
}

else代碼塊總是與離自己最近的那個if語句配對下隧。

var m = 1;
var n = 2;

if (m !== 1)
if (n === 2) console.log('hello');
else console.log('world');

上面代碼不會有任何輸出,else代碼塊不會得到執(zhí)行谓媒,因為它跟著的是最近的那個if語句,相當(dāng)于下面這樣何乎。

if (m !== 1) {
  if (n === 2) {
    console.log('hello');
  } else {
    console.log('world');
  }
}

如果想讓else代碼塊跟隨最上面的那個if語句句惯,就要改變大括號的位置。

if (m !== 1) {
  if (n === 2) {
    console.log('hello');
  }
} else {
  console.log('world');
}
// world

switch 結(jié)構(gòu)

多個if...else連在一起使用的時候支救,可以轉(zhuǎn)為使用更方便的switch結(jié)構(gòu)抢野。

switch (fruit) {
  case "banana":
    // ...
    break;
  case "apple":
    // ...
    break;
  default:
    // ...
}

上面代碼根據(jù)變量fruit的值,選擇執(zhí)行相應(yīng)的case各墨。如果所有case都不符合指孤,則執(zhí)行最后的default部分。需要注意的是,每個case代碼塊內(nèi)部的break語句不能少恃轩,否則會接下去執(zhí)行下一個case代碼塊结洼,而不是跳出switch結(jié)構(gòu)。

var x = 1;
switch (x) {
  case 1:
    console.log('x 等于1');
  case 2:
    console.log('x 等于2');
  default:
    console.log('x 等于其他值');
}
// x等于1
// x等于2
// x等于其他值

上面代碼中叉跛,case代碼塊之中沒有break語句松忍,導(dǎo)致不會跳出switch結(jié)構(gòu),而會一直執(zhí)行下去筷厘。正確的寫法是像下面這樣鸣峭。

switch (x) {
  case 1:
    console.log('x 等于1');
    break;
  case 2:
    console.log('x 等于2');
    break;
  default:
    console.log('x 等于其他值');
}

switch語句部分和case語句部分,都可以使用表達(dá)式酥艳。

switch (1 + 3) {
  case 2 + 2:
    f();
    break;
  default:
    neverHappens();
}

上面代碼的default部分摊溶,是永遠(yuǎn)不會執(zhí)行到的。

需要注意的是充石,switch語句后面的表達(dá)式莫换,與case語句后面的表示式比較運行結(jié)果時,采用的是嚴(yán)格相等運算符(===)赫冬,而不是相等運算符(==)浓镜,這意味著比較時不會發(fā)生類型轉(zhuǎn)換。

var x = 1;
switch (x) {
  case true:
    console.log('x 發(fā)生類型轉(zhuǎn)換');
    break;
  default:
    console.log('x 沒有發(fā)生類型轉(zhuǎn)換');
}
// x 沒有發(fā)生類型轉(zhuǎn)換

上面代碼中劲厌,由于變量x沒有發(fā)生類型轉(zhuǎn)換膛薛,所以不會執(zhí)行case true的情況。這表明补鼻,switch語句內(nèi)部采用的是“嚴(yán)格相等運算符”哄啄。

三元運算符 ?:

JavaScript 還有一個三元運算符(即該運算符需要三個運算子)?:,也可以用于邏輯判斷风范。

(條件) ? 表達(dá)式1 : 表達(dá)式2

上面代碼中咨跌,如果“條件”為true,則返回“表達(dá)式1”的值硼婿,否則返回“表達(dá)式2”的值锌半。

var even = (n % 2 === 0) ? true : false;

上面代碼中,如果n可以被2整除寇漫,則even等于true刊殉,否則等于false。它等同于下面的形式州胳。

var even;
if (n % 2 === 0) {
  even = true;
} else {
  even = false;
}

這個三元運算符可以被視為if...else...的簡寫形式记焊,因此可以用于多種場合。

var myVar;
console.log(
  myVar ?
  'myVar has a value' :
  'myVar does not have a value'
)
// myVar does not have a value

var msg = '數(shù)字' + n + '是' + (n % 2 === 0 ? '偶數(shù)' : '奇數(shù)');

循環(huán)語句

循環(huán)語句用于重復(fù)執(zhí)行某個操作栓撞,它有多種形式遍膜。

while 循環(huán)

While語句包括一個循環(huán)條件和一段代碼塊碗硬,只要條件為真,就不斷循環(huán)執(zhí)行代碼塊瓢颅。

while (條件)
  語句;
// 或者
while (條件) 語句;

while語句的循環(huán)條件是一個表達(dá)式恩尾,必須放在圓括號中。代碼塊部分惜索,如果只有一條語句特笋,可以省略大括號,否則就必須加上大括號巾兆。

while (條件) {
  語句;
}
for 循環(huán)

for語句是循環(huán)命令的另一種形式猎物,可以指定循環(huán)的起點、終點和終止條件角塑。它的格式如下蔫磨。

for (初始化表達(dá)式; 條件; 遞增表達(dá)式)
  語句
// 或者
for (初始化表達(dá)式; 條件; 遞增表達(dá)式) {
  語句
}

for語句后面的括號里面,有三個表達(dá)式圃伶。

  • 初始化表達(dá)式(initialize):確定循環(huán)變量的初始值堤如,只在循環(huán)開始時執(zhí)行一次。
  • 條件表達(dá)式(test):每輪循環(huán)開始時窒朋,都要執(zhí)行這個條件表達(dá)式搀罢,只有值為真,才繼續(xù)進(jìn)行循環(huán)侥猩。
  • 遞增表達(dá)式(increment):每輪循環(huán)的最后一個操作榔至,通常用來遞增循環(huán)變量。

下面是一個例子欺劳。

var x = 3;
for (var i = 0; i < x; i++) {
  console.log(i);
}
// 0
// 1
// 2

上面代碼中唧取,初始化表達(dá)式是var i = 0,即初始化一個變量i划提;測試表達(dá)式是i < x枫弟,即只要i小于x,就會執(zhí)行循環(huán)鹏往;遞增表達(dá)式是i++淡诗,即每次循環(huán)結(jié)束后,i增大1伊履。

所有for循環(huán)袜漩,都可以改寫成while循環(huán)。上面的例子改為while循環(huán)湾碎,代碼如下。

var x = 3;
var i = 0;

while (i < x) {
  console.log(i);
  i++;
}

for語句的三個部分(initialize奠货、test介褥、increment),可以省略任何一個,也可以全部省略柔滔。

for ( ; ; ){
  console.log('Hello World');
}

上面代碼省略了for語句表達(dá)式的三個部分溢陪,結(jié)果就導(dǎo)致了一個無限循環(huán)。

do...while 循環(huán)

do...while循環(huán)與while循環(huán)類似睛廊,唯一的區(qū)別就是先運行一次循環(huán)體形真,然后判斷循環(huán)條件。

do
  語句
while (條件);
// 或者
do {
  語句
} while (條件);

不管條件是否為真超全,do...while循環(huán)至少運行一次咆霜,這是這種結(jié)構(gòu)最大的特點。另外嘶朱,while語句后面的分號注意不要省略蛾坯。

break語句和continue語句

break語句和continue語句都具有跳轉(zhuǎn)作用,可以讓代碼不按既有的順序執(zhí)行疏遏。
break語句用于跳出代碼塊或循環(huán)脉课。

var i = 0;
while(i < 100) {
  console.log('i 當(dāng)前為:' + i);
  i++;
  if (i === 10) break;
}

上面代碼只會執(zhí)行10次循環(huán),一旦i等于10财异,就會跳出循環(huán)倘零。

for循環(huán)也可以使用break語句跳出循環(huán)。

for (var i = 0; i < 5; i++) {
  console.log(i);
  if (i === 3)
    break;
}
// 0
// 1
// 2
// 3

上面代碼執(zhí)行到i等于3戳寸,就會跳出循環(huán)呈驶。

continue語句用于立即終止本輪循環(huán),返回循環(huán)結(jié)構(gòu)的頭部庆揩,開始下一輪循環(huán)俐东。

var i = 0;

while (i < 100){
  i++;
  if (i % 2 === 0) continue;
  console.log('i 當(dāng)前為:' + i);
}

上面代碼只有在i為奇數(shù)時,才會輸出i的值订晌。如果i為偶數(shù)虏辫,則直接進(jìn)入下一輪循環(huán)。

如果存在多重循環(huán)锈拨,不帶參數(shù)的break語句和continue語句都只針對最內(nèi)層循環(huán)砌庄。

標(biāo)簽(label)

JavaScript語言允許語句的前面有標(biāo)簽(label),相當(dāng)于定位符奕枢,用于跳轉(zhuǎn)到程序的任意位置娄昆,標(biāo)簽的格式如下。

label:
  語句

標(biāo)簽可以是任意的標(biāo)識符缝彬,但不能是保留字萌焰,語句部分可以是任意語句。

標(biāo)簽通常與break語句和continue語句配合使用谷浅,跳出特定的循環(huán)扒俯。

top:
  for (var i = 0; i < 3; i++){
    for (var j = 0; j < 3; j++){
      if (i === 1 && j === 1) break top;
      console.log('i=' + i + ', j=' + j);
    }
  }
// i=0, j=0
// i=0, j=1
// i=0, j=2
// i=1, j=0

上面代碼為一個雙重循環(huán)區(qū)塊奶卓,break命令后面加上了top標(biāo)簽(注意,top不用加引號)撼玄,滿足條件時夺姑,直接跳出雙層循環(huán)。如果break語句后面不使用標(biāo)簽掌猛,則只能跳出內(nèi)層循環(huán)盏浙,進(jìn)入下一次的外層循環(huán)。
標(biāo)簽也可以用于跳出代碼塊荔茬。

foo: {
  console.log(1);
  break foo;
  console.log('本行不會輸出');
}
console.log(2);
// 1
// 2

上面代碼執(zhí)行到break foo废膘,就會跳出區(qū)塊。

continue語句也可以與標(biāo)簽配合使用兔院。

top:
  for (var i = 0; i < 3; i++){
    for (var j = 0; j < 3; j++){
      if (i === 1 && j === 1) continue top;
      console.log('i=' + i + ', j=' + j);
    }
  }
// i=0, j=0
// i=0, j=1
// i=0, j=2
// i=1, j=0
// i=2, j=0
// i=2, j=1
// i=2, j=2

上面代碼中殖卑,continue命令后面有一個標(biāo)簽名,滿足條件時坊萝,會跳過當(dāng)前循環(huán)孵稽,直接進(jìn)入下一輪外層循環(huán)。如果continue語句后面不使用標(biāo)簽十偶,則只能進(jìn)入下一輪的內(nèi)層循環(huán)菩鲜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市惦积,隨后出現(xiàn)的幾起案子接校,更是在濱河造成了極大的恐慌,老刑警劉巖狮崩,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛛勉,死亡現(xiàn)場離奇詭異,居然都是意外死亡睦柴,警方通過查閱死者的電腦和手機诽凌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坦敌,“玉大人侣诵,你說我怎么就攤上這事∮剑” “怎么了杜顺?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蘸炸。 經(jīng)常有香客問我躬络,道長,這世上最難降的妖魔是什么搭儒? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任洗鸵,我火速辦了婚禮越锈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘膘滨。我一直安慰自己,他們只是感情好稀拐,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布火邓。 她就那樣靜靜地躺著,像睡著了一般德撬。 火紅的嫁衣襯著肌膚如雪铲咨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天蜓洪,我揣著相機與錄音纤勒,去河邊找鬼。 笑死隆檀,一個胖子當(dāng)著我的面吹牛摇天,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播恐仑,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼泉坐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了裳仆?” 一聲冷哼從身側(cè)響起腕让,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎歧斟,沒想到半個月后纯丸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡静袖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年觉鼻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勾徽。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡滑凉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出喘帚,到底是詐尸還是另有隱情畅姊,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布吹由,位于F島的核電站若未,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏倾鲫。R本人自食惡果不足惜粗合,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一萍嬉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧隙疚,春花似錦壤追、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至伶丐,卻和暖如春悼做,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背哗魂。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工肛走, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人录别。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓朽色,卻偏偏與公主長得像,于是被迫代替她去往敵國和親庶灿。 傳聞我的和親對象是個殘疾皇子纵搁,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355