《JavaScript 權威指南(第六版)》一——詞法、類型、值、變量

第一章:JavaScript概述
第二章:詞法結構
第三章:類型、值和變量

2017.02.16-2017.02.20

JavaScript 概述

JavaScript 是一門高端的、動態的、弱類型的編程語言,適合面向對象和函數式的編程風格。

JavaScript 語法源自 Java,一等函數(first-class function)來自于Scheme,基于原型(prototype-based)的繼承來自于Self。

JavaScript 語言核心

var a=[];//創建一個空數組
a.push(1,2,3);//push()方法向數組中添加元素
a.reverse();//將數組元素次序反轉

當函數和對象合寫在一起時,函數就變成了”方法“。

points.dist=function(){
    var p1=this[0];
    var p2=this[1];
    var a=p2.x-p1.x;
    var b=p2.y-p1.y;
    return Math.sqrt(a*a+b*b); //勾股定理計算兩點之間距離
}
points.dist();

面向對象編程 【示例】

//定義構造函數以初始化一個新的Point對象
function Point(x,y){
    this.x=x;
    this.y=y;
};
//使用new關鍵字和構造函數創建一個實例
var p=new Point(2,1);//p Point {x: 2, y: 1}
//通過給構造函數的prototype對象賦值來給Point定義方法
Point.prototype.r=function(){
    return Math.sqrt(this.x*this.x+this.y*this.y);
};
//Point的實例對象p以及所有的Point實例對象繼承了方法 r()
p.r();

客戶端 JavaScript

JavaScript 語言核心

語法結構

字符集

JS 用 Unicode 字符集編寫。Unicode和UTF-8有何區別?-知乎

區分大小寫

html不區分大小寫(xhtml區分大小寫),標簽和屬性名可以使用大寫也可以是小寫。也可以是大小寫混搭。比如<buTTon>123</button>,不過不推薦,除了屬性值全部小寫就好了。

空格、換行符、格式控制符

Unicode 轉義序列

使用6個ASCII自負代表任意16位Unicode內碼。轉義序列以\u為前綴,其后跟隨4個十六進制數。

//café 小實例
cafe\u0301=1// cafe添加音調
1
caf\u00e9=2
2
café
2 //"café"==="caf\u00e9"
"café"==="caf\u00e9"
true
"café"==="cafe\u0301"
false

標準化

Unicode 允許使用多種方法對一個字符進行編碼。如上述實例中的字符é,其兩種編碼顯示結果一樣,但是二進制編碼不同,在計算機里也不想等。

Unicode標準為所有字符定義了一個首選的編碼格式,并給出了一個標準化的處理方式將文本轉換為一種適合比較的標準格式,js會認為它正在解析的程序編碼已經是這種標準格式,不會再對其標志符、字符串或正則表達式做標準化處理。

注釋

//注釋當前行
/**/注釋段。不能嵌套注釋。

直接量

直接量 (literal) 就是程序中直接使用的數據值。

標志符和保留字

標識符

字母、下換線、美元符開頭。

保留字

【關鍵字】

break   delete  function    return  typeof
case    do  if  switch  var
catch   else    in  this    void    
continue    false   instanceof  throw   while
debugger    finally new true    with
default for null    try

【保留字】

class   const   enum    export  extends import  super

下面是 普通JavaScript合法。嚴格模式下是保留字的

implements  let private public  yield   
interface   package protected   static

嚴格模式同樣對下面的標識符的使用做了嚴格限制,它們不完全是保留字,但不能用做變量名、函數名或參數名:

arguments   eval

ES3 將 Java 所有關鍵字列為保留字,盡管這些保留字在 ES5 上放寬了限制,如果希望代碼能在 ES3實現的解釋器上運行,應當避免間使用下面關鍵字:

abstract    double  goto    native  static
boolean enum    implements  package super
byte    export  import  private synchronized
char    extends int protected   throws
class   final   interface   public  transient
const   float   long    short   volatile

JavaScript 預定義了很多全局變量和函數,應當避免把它們的名字 用作變量名和函數名:

arguments   encodeURI   Infinity    Number  RegExp
Array   encodeURIComponent  isFinite    Object  String
Boolean Error   isNan   parseFloat  SyntaxError
Date    eval    JSON    parseInt    TypeError
decodeURI   EvalError   Math    RangeError  undefined
decodeURIComponent  Funcgtion   NaN ReferenceError  URIError 

可選的分號

  • 如果當前語句和下一行語句無法合并解析,JS則在第一行后填補分號(return,break,continue除外,如果這三個關鍵字緊跟著換行,則JS會在換行出填補分號)。
  • 涉及++,--運算符時,如果將其作為后綴,應該放在同一行。

【示例】

x
++
y
解析為x;++y;而不是x++;y

類型、值、變量

JavaScript數據類型分類:

  • 原始類型(primitive type):數字、字符串、布爾值、null、undefined
  • 對象類型(object type):屬性的幾個。每個屬性都由“名/值對”構成。普通的js對象是“命名值”的無序集合。js定義了一種特殊對象數組,表示帶編號的值得有序集合。js還定義了一種特殊對象函數。函數是具有與它相關聯的可執行代碼的對象,通過調用函數來運行可執行代碼,并返回計算結果。

如果函數用來初始化(new)一個新建的對象,稱之為構造函數(constructor)。每個構造函數定義一類(class)對象——由構造函數初始化的對象組成的集合。除了數組,函數外,JS定義了其他三種有用的類。日期(Date)類定義了代表日期的對象。正則(RegExp)類定義了表示正則表達式的對象。錯誤(Error)類定義了表示JS程序中運行時錯誤和語法錯誤的對象。可以通過定義自己的構造函數來定義需要的類。

JavaScript 解釋器有自己的內存管理機制,可以自動對內存進行垃圾回收(garbage collection)。

數字

JavaScript 中的所有數字均用浮點數值表示。JS采用IEEE754標準定義的64位浮點格式表示數字,這意味著它能表示的最大值是±1.7976031348623157×10308,最小值是±5×10-324

按照JS中的數字格式,能夠表示的整數范圍是-9007199254740992~9007199254740992(即 -253~253)。如果使用了超過此范圍的整數,則無法保證低位數字的精度。然而需要注意的是,JS中實際的操作(比如數組索引,位操作符)則是基于32位整數。

當一個數字直接出現在JS中,我們稱之為數字直接量。

整型直接量

//十進制
123456
// 十六進制
0xff
// 八進制,某些可能不支持,在ES6嚴格模式下,八進制是禁止的
0377

浮點型直接量

[digits][.digits][(E|e)(+|-)digits]

例如:

3.14
.333
6.2e23
1.4E-32

算術運算

Math.pow(2,3) //8;2的3次冪
Math.round(.6) //1.0;四舍五入
Math.ceil(.6) //1.0;向上取整
Math.floor(.6) //0.0;向下取整
Math.abs(-5) //5;求絕對值
Math.max(x,y,z) //返回最大值
Math.min(x,y,z) //返回最小值
Math.random() //生成一個大于等于0小于1.0的偽隨機數
Math.PI //π;圓周率
Math.E //e;自然對數的底數
Math.sqrt(3) //3的平方根
Math.pow(3,1/3) //3的立方根
Math.sin(0) //三角函數。Math.cos(),Math.tan(),Math.sin(30/180*Math.PI) 
Math.log(10) //10的自然對數
Math.log(100)/Math.LN10 //以10為底100的對數
Math.log(512)/Math.LN2 //以2為底512的對數
Math.exp(3) //e的3次冪

JS的算術運算在溢出(overflow)、下溢(underflow)或被零整除時不會報錯.

下溢,當運算結果無限接近于零并比JavaScript能表示的最小值還小的時候發生的情形。這時候,JavaScript會返回0,負數的下溢會返回-0。

無窮大除以無窮大、給負數開放、算術運算符與非數字或無法轉換位數字的操作數一起使用時都會返回NaN。

無窮大(Infinity),負無窮大(-Infinity),負零(-0),NaN(not a number)

二進制浮點數和四舍五入錯誤

JavaScript 采用IEEE-754浮點數表示法。可以精確地表示分數 1/2,1/8等,但不能精確地表示十進制分數。

.3-.2
0.09999999999999998
.2-.1
0.1
0.5-0.125
0.375

日期和時間

Date()構造函數,用于創建表示日期和時間的對象。

var then=new Date(2017,0,1);//2017年1月1日
var later=new Date(2017,0,1,17,10,30);//2017年1月1日 17:10:30
var now=new Date();//當前日期和時間
var elapsed=now-then;//日期減法,計算時間間隔的毫秒數
later.getFullYear();//獲取年份
later.getMonth();//獲取月份,從0開始計數,一月份是0
later.getDate();//獲取日期,從1開始計數,一號是1
later.getDay();//星期幾,0是星期日,5是星期五
later.getHours();//獲取小時
later.getMinutes();//獲取分鐘
later.getSeconds();//獲取秒
later.getUTCHours();//獲取使用UTC表示的小時的時間

文本

字符串string是一組由16位值組成的不可變的有序序列,每個字符通常來自于Unicode字符集。JavaScript通過字符串類型來表示文本。字符串的長度是其所含16位值得個數。

字符串直接量

由單引號或雙引號括起來的字符序列。單引號定界的字符串中可以包含雙引號,雙引號定界的字符串中可以包含單引號。

ES3中字符串直接量必須寫在一行中,ES5中字符串可以拆分為數行,每行必須以反斜線\結束。

var str="Hello\
World"
"Hello    World"http://tab鍵等都會計算進字符串中

轉義字符

\

\o NULL字符(\u0000)
\b 退格符(\u0008)
\t 水平制表符(\u0009)
\n 換行符(\u000A)
\v 垂直制表符(\u000B)
\f 換頁符(\u000C)
\r 回車符(\u000D)
\" 雙引號(\u0022)
\' 撇號 單引號 (\u0027)
\\ 反斜線(\u005C)
\xXX 由兩位十六進制數XX指定的Latin-1字符
\uXXXX 由四位十六進制數XXXX指定的Unicode字符

字符串的使用

+用于數字,表示兩數相加。用于字符串表示字符串連接。

var s="hello,world";
s.charAt(0);//"h";第一個字符
s[0];
s.charAt(s.length-1);//"d";最后一個字符
s[s.length-1]
s.substring(1,4);//"ell";第二到四個字符
s.slice(1,4);//"ell";同上
s.slice(-4);//"orld";最后四個字符
s.indexOf("l");//2;字符l首次出現的位置
s.lastIndexOf("l");//9;字符l最后出現的位置
s.indexOf("l",3);//3;在位置3及之后首次出現l的位置
s.split(",");//["hello","world"];通過逗號分隔成子串
s.replace("h","H");//"Hello,world";全文文本替換
s.toUpperCase();//"HELLO,WORLD";大寫

模式匹配

RegExp()構造函數,用于創建表示文本匹配模式的對象。”正則表達式“(regular expression),JavaScript采用Perl中的正則表達式語法。String和RegExp對象均定義了利用正則表達式進行模式匹配和查找替換的函數。

var text="testing:1,2,3";
var pattern=/\d+/g;//匹配所有包含一個或多個數字的實例
pattern.test(test);//true;匹配成功
text.search(pattern);//9;首次匹配成功的位置
text.match(pattern);//["1","2","3"];所有匹配組成的數組
text.replace(pattern,"#");//"testing:#,#,#"
text.spilt(/\D+/);//["","1","2","3"];用非數字字符截取字符串

布爾值

true,false

任意JavaScript的值都可以轉換為布爾值。下面這些值會被轉換成false:

undefined
null
0
-0
NaN
""

所有其他值,包括對象數組都會轉換成true

null undefined

null是JavaScript的關鍵字,表示一個特殊值“空值”。typeof(null)返回object。可以將其認為是一個特殊的對象值,含義是非對象。實際上,通常認為null是它自由類型的唯一一個成員,可以表示數字、字符串、對象是“無值”的。

JavaScript用過未定義的值表示更深層次的“空值”。它是變量的一種取值,表示變量沒有初始化,如果要查詢對象屬性或數組元素的值時返回undefined則說明這個屬性或元素不存在。如果函數沒有返回任何職,則返回undefined。引用沒有提供實參的函數形參的值也只會得到undefined。undefined是預定義的全局變量。typeof(undefined)返回undefined,表明這個值是這個類型的唯一成員 。

二者都表示“值的空缺”,兩者往往可以互換。“==”認為二者相等(嚴格區分需要使用“===”)。

如果想賦值給變量或者屬性,或是將其作為參數傳入函數,最佳選擇是使用null。

全局對象

全局對象(global object)

  • 全局屬性,比如undefined、Infinity、NaN
  • 全局函數,比如 isNaN()、parseInt()、eval()
  • 構造函數,比如Date()、RegExp()、String()、Object()、Array()
  • 全局對象,比如Math、JSON

在代碼最頂級,this代表全局對象。在客戶端JavaScript中,Windows對象充當了全局對象。Window對象定義了核心全局屬性,也針對Web瀏覽器和客戶端JavaScript定義了以少部分其他全局屬性,如果代碼中聲明了全局變量,那么這個全局變量就是全局對象的一個屬性。

包裝對象

JavaScript對象是一種復合值:它是屬性或已命名值得集合。通過.引用屬性值。當屬性值是一個函數的時候,稱其為方法。

關于字符串的屬性:只要引用了字符串s的屬性,JavaScript就會將字符串值通過調用new String(s)的方式轉換成對象,這個對象集成了字符串的方法,并被用來處理屬性的引用。一旦屬性引用結束,這個新創建的對象就會銷毀。

同樣,數字和布爾值也有各自的方法Number()和Boolean()。

null和undefined沒有包裝對象:訪問他們的屬性會造成一個類型錯誤。

【示例】

var s="test";
s.len=4;//創建臨時對象并給其len屬性賦值隨即銷毀對象。
var t=s.len;//返回undefined,訪問原始字符串的對象,所以不存在
var s="test",n=1,b=true;//一個字符串,一個數字,一個布爾值  typeof分別是string,number,boolean
var S=new String(s);//一個字符串對象  typeof是object
var N=new String(N);//一個數值對象  typeof是object
var B=new Boolean(b);//一個布爾對象  typeof是object

不可變的原始值和可變的對象引用

  • 原始值的比較是值的比較:只有在值相等時它們才相等。
  • 對象的比較并非值的比較:即使兩個對象包含同樣的屬性和值,它們也不是相等的。當且僅當它們引用同一個基對象時,它們才相等。

類型轉換

JavaScript 類型轉換

轉換和相等性

顯性類型轉換

Number("3") //3
String(false) //"false"
Boolean([]) //true
Object(3) //new Number(3)

如果+的一個操作數是字符串,它將會把另一個操作數轉換成字符串。一元+運算符將其操作數轉換為數字。一元!將其操作數轉換為布爾值并取反。

轉換類型的慣用法:

x+"" //等價于String(x)
+x //等價于Number(x)
!!x //等價于Boolean(x),注意是雙嘆號
數字轉字符串

toString(),參數可選,如果不指定參數,轉換規則將是基于十進制。同樣,亦可以將數字轉換為其他進制數。

var n=17;
binary_string=n.toString(2);//"10001"
octal_string="0"+n.toString(8);//"021"
hex_string="0x"+n.String(16);//"0x11"
  • toFixed()根據小數點后的指定位數將數字轉換為字符串,不使用指數計數法。
  • toExponential()使用指數計數法將數字轉換成指數形式的字符串,其中小數點前只有一位,小數點后的位數則有參數指定(也就是說有效數字位數比指定的位數要多一位)。
  • toPrecision()根據指定的有效數字位數將數字轉換成字符串。如果有效數字的位數少于數字證書部分的位數,則轉換成指數形式。

【示例】

var n=123456.789;
n.toFixed(0);//"123457"
n.toFixed(2);//"123456.79"
n.toExponential(1);//"1.2e+5"
n.toExponential(3);//"1.235e+5"
n.toPrecision(7);//"123456.8"
n.toPrecision(10);//"123456.7890"

字符串轉數字

Number() 將其轉換為一個整數或浮點數直接量,只能給予十進制數進行轉換,并且不能出現非法的尾隨字符。

parseInt()函數之解析整數。如果前綴是0x0X,parseInt()將其解釋為16進制數(parseFloat()不支持)。
parseFloat()函數解析整數和浮點數。
parseInt和parseFloat都會跳過任意數量的前導空格,盡可能解析更多數值字符,并忽略后面的內容。如果第一個非空格字符是非法的數字直接量,并最終返回NaN。

parseInt("3 zdy go");//3
parseFloat(" 3.14 miles");//3.14
parseInt("-12.32");//-12
parseInt("0xFF");//255
parseInt("0xff");//255
parseInt("-0xFF");//-255
parseFloat("0xff");//0。只解析到0。
parseFloat(".1");//0.1
parseInt("0.1");//0
parseInt(".1");//NaN
parseFloat("$34.33");//NaN

parseInt()可以接受第二個可選參數,這個參數指定數字轉換的基數,合法的取值范圍是2~36。

parseInt("11",2);//3 1*2+1
parseInt("ff",16);// 255 15*16+15
parseInt("zz",36);//1295 35*36+35
parseInt("077",8);//63 7*8+7
parseInt("077",10);//77 7*10+7

對象轉換為原始值

對象到布爾值

所有對象都轉換為true。對于包裝對象亦是如此,new Boolean(false)是一個對象,將轉換為true。

對象到字符串
toString()

數組類(Array Class)的toString()將每個數組元素轉換為一個字符串,并在元素之間添加逗號后合并成結果字符串。

函數類(Function Class)的toString()返回這個函數的實際定義的表示方式。實際上,這里實現的方式通常是將用戶定義的函數轉換成JavaScript源代碼字符串。

日期類(Date Class)的toString()方法返回了一個可讀的(可悲JavaScript解析的)日期和時間字符串。

RegExp類(RegExp class)定義的toString()方法將RegExp對象轉換為表示正則表達式直接量的字符串。

({x:1,y:2}).toString()//[object Object]"
[1,2,3].toString();//"1,2,3"
(function(x) { f(x); }).toString();//實際測試:"function (x) { f(x); }",原書:"function (x) {\n f(x);\n }"
/\d+/g.toString();//    /\\d+/g
new Date(2000,0,1).toString();// "Sat Jan 01 2000 00:00:00 GMT+0800 (CST)"
valueOf()

如果存在任意原始值,它將默認將對象轉換為表示它的原始值。對象是復合值,而且大多數對象無法真正表示一個原始值,因此默認的valueOf()方法簡單地返回對象本身,而不是返回一個原始值。數組、函數和正則表達式簡單地繼承了這個默認的方法,調用這些類型的實例的valueOf()方法只是簡單返回對象本身。日期類定義的valueOf()方法會返回它的一個內部表示:1970年1月1日以來的毫秒數。

var fun=function (a,b){return a+b;}
fun.valueOf()//輸出是:function (a,b){return a+b;}
var now=new Date();
now.valueOf()//輸出是:1487555446043
JavaScript 中對象到字符串的轉換
  • 如果對象具有toString()方法,則調用這個方法。如果它返回一個原始值,JavaScript將這個值轉換為字符串(如果本身不是字符串),并返回這個字符串結果。
  • 如果對象沒有toString()方法,或者這個方法不返回一個原始值,那么JavaScript會調用valueOf()方法。如果存在這個方法,則調用它。如果返回值是原始值,JavaScript將這個值轉換為字符串(如果本身不是字符串),并返回這個字符串結果。
  • 否則,拋出類型錯誤異常。
JavaScript 中對象到數字的轉換
  • 如果對象具有ValueOf()方法,如果返回一個原始值,則JavaScript將原始值轉換為數字(如果需要)并返回這個數字。
  • 如果對象具有toString()方法,如果返回一個原始值(字符串直接量),則JavaScript將其轉換并返回。

3.8.3看的懵懵的,部分內容截圖如下。

JavaScript 權威指南 3.8.3

變量聲明

var i;
var sum;
var i,sum;
var message="hello";
var i=0,j=0,str="hello world",sign=false;

動態語言類型。

var i=10;
i="ten";//合法

變量作用域

var scope="global";
function checkscope() {
    var scope = "local";
    function nested() {
        var scope = "nested";
        return scope;
    }
    return nested();
}
checkscope();//"nested"
函數作用域和聲明提前

類似C語言的編程語言中,花括號內的每一段代碼都具有各自的作用域,而且變量在聲明它們的代碼段之外是不可見的,我們稱之為塊級作用域(block scope)。

JavaScript中沒有塊級作用域,使用函數作用域(function scope):變量在聲明它們的函數體以及這個函數體嵌套的任意函數體內都有定義。

即if for while等循環內聲明的變量實際作用域也是整個函數內。

function test(o){
    var i=0;//i在函數體內均有定義
    if(typeof(o)=="object"){
        var j=0;//j在函數體內均有定義,不僅僅是在代碼段
        for(var k=0;k<10;k++){//k在函數體內均有定義,不僅僅是在循環內
            console.log(k);//打印0-9
        }
        console.log(k);//k已經定義了,打印10
    }
    console.log(j);//j已經定義了,可能沒有初始化。如果o是對象,打印0。否則打印undefined。
}

JavaScript的函數作用域是指在函數內聲明的所有變量在函數體內始終是可見的。這個特性是聲明提前,即JavaScript函數內聲明的所有變量(但不涉及賦值)都被提前到函數體的頂部,變量初始化保留在原來的位置。

var scope = "global";
function f() {
    console.log(scope);
    var scope = "local";
    console.log(scope);
}
f();//打印undefined local

作為屬性的變量

當使用var聲明一個變量時,創建的這個屬性是不可配置的,即這個變量無法通過delete刪除。如果沒有使用嚴格模式并給一個未命名的變量賦值的話,JavaScript會自動創建一個全局變量。以這種方式創建的變量是全局對象的正常的可配置屬性,并可以刪除它們。

var trueval=1;
fakeval=2;
this.fakevar2=3;
delete trueval;//false,變量并沒有刪除
delete fakeval;//true,變量被刪除
delete this.fakeval2;//true,變量被刪除

作用域鏈

在JavaScript的最頂層代碼中,作用域鏈由一個全局對象組成。

在不包含嵌套的函數體內,作用域鏈上有兩個對象,第一個是定義函數參數和局部變量的對象,第二個是全局對象。

在一個嵌套的函數體內,作用域鏈至少有三個對象。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,428評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,024評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,285評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,548評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,328評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,878評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,971評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,098評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,616評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,554評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,725評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,243評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,971評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,361評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,613評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,339評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,695評論 2 370

推薦閱讀更多精彩內容