ES6_note

ES6筆記

es6 - 解構(gòu)

數(shù)組的 解構(gòu)賦值

  • let [a, b, c] = [1, 2, 3];
    
  • 這種寫法屬于“模式匹配”憋槐,只要等號(hào)兩邊的模式相同,左邊的變量就會(huì)被賦予對(duì)應(yīng)的值贴唇。

  • let [foo, [[bar], baz]] = [1, [[2], 3]];
    foo // 1
    bar // 2
    baz // 3
    
    let [ , , third] = ["foo", "bar", "baz"];
    third // "baz"
    
    let [x, , y] = [1, 2, 3];
    x // 1
    y // 3
    
    let [head, ...tail] = [1, 2, 3, 4];
    head // 1
    tail // [2, 3, 4]
    
    let [x, y, ...z] = ['a'];
    x // "a"
    y // undefined
    z // []
    
  • 如果解構(gòu)不成功遂鹊,變量的值就等于undefined丽柿。

  • 另一種情況是不完全解構(gòu)恢准,即等號(hào)左邊的模式,只匹配一部分的等號(hào)右邊的數(shù)組甫题。這種情況下馁筐,解構(gòu)依然可以成功。

  • let [x, y] = [1, 2, 3];
    x // 1
    y // 2
    
    let [a, [b], d] = [1, [2, 3], 4];
    a // 1
    b // 2
    d // 4
    
  • 如果等號(hào)的右邊不是數(shù)組(或者嚴(yán)格地說坠非,不是可遍歷的結(jié)構(gòu) )那么將會(huì)報(bào)錯(cuò)敏沉。

  • 對(duì)于 Set 結(jié)構(gòu),也可以使用數(shù)組的解構(gòu)賦值炎码。

  • let [x, y, z] = new Set(['a', 'b', 'c']);
    x // "a"
    
  • 事實(shí)上盟迟,只要某種數(shù)據(jù)結(jié)構(gòu)具有 Iterator 接口,都可以采用數(shù)組形式的解構(gòu)賦值潦闲。

  • function* fibs() {
      let a = 0;
      let b = 1;
      while (true) {
        yield a;
        [a, b] = [b, a + b];
      }
    }
    
    let [first, second, third, fourth, fifth, sixth] = fibs();
    sixth // 5
    
  • 攒菠??歉闰?fibs是一個(gè) Generator 函數(shù) 要尔??新娜? Iterator 接口。

默認(rèn)值

  • 解構(gòu)賦值允許指定默認(rèn)值既绩。

  • let [foo = true] = [];
    foo // true
    
    let [x, y = 'b'] = ['a']; // x='a', y='b'
    let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'
    
  • 注意概龄,ES6 內(nèi)部使用嚴(yán)格相等運(yùn)算符(===),判斷一個(gè)位置是否有值饲握。所以私杜,只有當(dāng)一個(gè)數(shù)組成員嚴(yán)格等于undefined蚕键,默認(rèn)值才會(huì)生效。

  • let [x = 1] = [undefined];
    x // 1
    
    let [x = 1] = [null];
    x // null
    
  • 上面代碼中衰粹,如果一個(gè)數(shù)組成員是null锣光,默認(rèn)值就不會(huì)生效,因?yàn)?code>null不嚴(yán)格等于undefined铝耻。

  • 如果默認(rèn)值是一個(gè)表達(dá)式誊爹,那么這個(gè)表達(dá)式是惰性求值的,即只有在用到的時(shí)候瓢捉,才會(huì)求值频丘。

  • function f() {
      console.log('aaa');
    }
    
    let [x = f()] = [1];
    
  • 上面代碼中,因?yàn)?code>x能取到值泡态,所以函數(shù)f根本不會(huì)執(zhí)行搂漠。

  • 默認(rèn)值可以引用解構(gòu)賦值的其他變量,但該變量必須已經(jīng)聲明某弦。

  • let [x = 1, y = x] = [];     // x=1; y=1
    let [x = 1, y = x] = [2];    // x=2; y=2
    let [x = 1, y = x] = [1, 2]; // x=1; y=2
    let [x = y, y = 1] = [];     // ReferenceError: y is not defined
    
  • 上面最后一個(gè)表達(dá)式之所以會(huì)報(bào)錯(cuò)桐汤,是因?yàn)?code>x用y做默認(rèn)值時(shí),y還沒有聲明靶壮。

對(duì)象的 解構(gòu)賦值

  • 解構(gòu)不僅可以用于數(shù)組怔毛,還可以用于對(duì)象。

  • let { foo, bar } = { foo: "aaa", bar: "bbb" };
    foo // "aaa"
    bar // "bbb"
    
  • 對(duì)象的解構(gòu)與數(shù)組有一個(gè)重要的不同亮钦。數(shù)組的元素是按次序排列的馆截,變量的取值由它的位置決定;而對(duì)象的屬性沒有次序蜂莉,變量必須與屬性同名蜡娶,才能取到正確的值。

  • let { bar, foo } = { foo: "aaa", bar: "bbb" };
    foo // "aaa"
    bar // "bbb"
    
    let { baz } = { foo: "aaa", bar: "bbb" };
    baz // undefined
    
    • 上面代碼的第一個(gè)例子映穗,等號(hào)左邊的兩個(gè)變量的次序窖张,與等號(hào)右邊兩個(gè)同名屬性的次序不一致,但是對(duì)取值完全沒有影響蚁滋。第二個(gè)例子的變量沒有對(duì)應(yīng)的同名屬性宿接,導(dǎo)致取不到值,最后等于undefined辕录。
  • 如果變量名與屬性名不一致睦霎,必須寫成下面這樣。

    • let { foo: baz } = { foo: 'aaa', bar: 'bbb' };
      baz // "aaa"
      
      let obj = { first: 'hello', last: 'world' };
      let { first: f, last: l } = obj;
      f // 'hello'
      l // 'world'
      
  • 也可以簡(jiǎn)寫成這樣

    • let { foo: foo, bar: bar } = { foo: "aaa", bar: "bbb" };
      
  • 也就是說走诞,對(duì)象的解構(gòu)賦值的內(nèi)部機(jī)制副女,是先找到同名屬性,然后再賦給對(duì)應(yīng)的變量蚣旱。真正被賦值的是后者碑幅,而不是前者戴陡。

    • let { foo: baz } = { foo: "aaa", bar: "bbb" };
      baz // "aaa"
      foo // error: foo is not defined
      
    • 上面代碼中,foo是匹配的模式沟涨,baz才是變量恤批。真正被賦值的是變量baz,而不是模式foo裹赴。

  • 與數(shù)組一樣喜庞,解構(gòu)也可以用于嵌套結(jié)構(gòu)的對(duì)象。

    • let obj = {
        p: [
          'Hello',
          { y: 'World' }
        ]
      };
      
      let { p: [x, { y }] } = obj;
      x // "Hello"
      y // "World"
      
    • 注意篮昧,這時(shí)p是模式赋荆,不是變量,因此不會(huì)被賦值懊昨。如果p也要作為變量賦值窄潭,可以寫成下面這樣。

    • let obj = {
        p: [
          'Hello',
          { y: 'World' }
        ]
      };
      
      let { p, p: [x, { y }] } = obj;
      x // "Hello"
      y // "World"
      p // ["Hello", {y: "World"}]
      
    • 下面是另一個(gè)例子酵颁。

    • const node = {
        loc: {
          start: {
            line: 1,
            column: 5
          }
        }
      };
      
      let { loc, loc: { start }, loc: { start: { line }} } = node;
      line // 1
      loc  // Object {start: Object}
      start // Object {line: 1, column: 5}
      
    • 上面代碼有三次解構(gòu)賦值嫉你,分別是對(duì)locstart躏惋、line三個(gè)屬性的解構(gòu)賦值幽污。注意,最后一次對(duì)line屬性的解構(gòu)賦值之中簿姨,只有line是變量距误,locstart都是模式,不是變量扁位。

  • 下面是嵌套賦值的例子准潭。

    • let obj = {};
      let arr = [];
      
      ({ foo: obj.prop, bar: arr[0] } = { foo: 123, bar: true });
      
      obj // {prop:123}
      arr // [true]
      
  • 對(duì)象的解構(gòu)也可以指定默認(rèn)值。

    • var {x = 3} = {};
      x // 3
      
      var {x, y = 5} = {x: 1};
      x // 1
      y // 5
      
      var {x: y = 3} = {};
      y // 3
      
      var {x: y = 3} = {x: 5};
      y // 5
      
      var { message: msg = 'Something went wrong' } = {};
      msg // "Something went wrong"
      
    • 默認(rèn)值生效的條件是域仇,對(duì)象的屬性值嚴(yán)格等于undefined刑然。

    • var {x = 3} = {x: undefined};
      x // 3
      
      var {x = 3} = {x: null};
      x // null
      
    • 上面代碼中,屬性x等于null暇务,因?yàn)?code>null與undefined不嚴(yán)格相等泼掠,所以是個(gè)有效的賦值,導(dǎo)致默認(rèn)值3不會(huì)生效垦细。

    • 如果解構(gòu)失敗择镇,變量的值等于undefined

    • let {foo} = {bar: 'baz'};
      foo // undefined
      
    • 如果解構(gòu)模式是嵌套的對(duì)象括改,而且子對(duì)象所在的父屬性不存在腻豌,那么將會(huì)報(bào)錯(cuò)。

    • // 報(bào)錯(cuò)
      let {foo: {bar}} = {baz: 'baz'};
      

      上面代碼中,等號(hào)左邊對(duì)象的foo屬性饲梭,對(duì)應(yīng)一個(gè)子對(duì)象。該子對(duì)象的bar屬性焰檩,解構(gòu)時(shí)會(huì)報(bào)錯(cuò)憔涉。原因很簡(jiǎn)單,因?yàn)?code>foo這時(shí)等于undefined析苫,再取子屬性就會(huì)報(bào)錯(cuò)兜叨,請(qǐng)看下面的代碼。

    • let _tmp = {baz: 'baz'};
      _tmp.foo.bar // 報(bào)錯(cuò)
      
    • 如果要將一個(gè)已經(jīng)聲明的變量用于解構(gòu)賦值衩侥,必須非常小心国旷。

    • // 錯(cuò)誤的寫法
      let x;
      {x} = {x: 1};
      // SyntaxError: syntax error
      
    • 上面代碼的寫法會(huì)報(bào)錯(cuò),因?yàn)?JavaScript 引擎會(huì)將{x}理解成一個(gè)代碼塊茫死,從而發(fā)生語(yǔ)法錯(cuò)誤跪但。只有不將大括號(hào)寫在行首,避免 JavaScript 將其解釋為代碼塊峦萎,才能解決這個(gè)問題屡久。

    • // 正確的寫法
      let x;
      ({x} = {x: 1});
      
    • 對(duì)象的解構(gòu)賦值,可以很方便地將現(xiàn)有對(duì)象的方法爱榔,賦值到某個(gè)變量被环。

    • let { log, sin, cos } = Math;
      
    • 上面代碼將Math對(duì)象的對(duì)數(shù)、正弦详幽、余弦三個(gè)方法筛欢,賦值到對(duì)應(yīng)的變量上,使用起來就會(huì)方便很多唇聘。

    • 由于數(shù)組本質(zhì)是特殊的對(duì)象版姑,因此可以對(duì)數(shù)組進(jìn)行對(duì)象屬性的解構(gòu)。

    • let arr = [1, 2, 3];
      let {0 : first, [arr.length - 1] : last} = arr;
      first // 1
      last // 3
      
    • 上面代碼對(duì)數(shù)組進(jìn)行對(duì)象解構(gòu)雳灾。數(shù)組arr0鍵對(duì)應(yīng)的值是1漠酿,[arr.length - 1]就是2鍵,對(duì)應(yīng)的值是3谎亩。方括號(hào)這種寫法炒嘲,屬于“屬性名表達(dá)式”(參見《對(duì)象的擴(kuò)展》一章)。

字符串的結(jié)構(gòu)賦值

  • 字符串也可以解構(gòu)賦值匈庭。這是因?yàn)榇藭r(shí)夫凸,字符串被轉(zhuǎn)換成了一個(gè)類似數(shù)組的對(duì)象。

  • const [a, b, c, d, e] = 'hello';
    a // "h"
    b // "e"
    c // "l"
    d // "l"
    e // "o"
    
  • 類似數(shù)組的對(duì)象都有一個(gè)length屬性阱持,因此還可以對(duì)這個(gè)屬性解構(gòu)賦值夭拌。

    • let {length : len} = 'hello';
      len // 5
      

數(shù)值和布爾值的解構(gòu)賦值

  • 解構(gòu)賦值時(shí),如果等號(hào)右邊是數(shù)值和布爾值,則會(huì)先轉(zhuǎn)為對(duì)象鸽扁。

    • let {toString: s} = 123;
      s === Number.prototype.toString // true
      
      let {toString: s} = true;
      s === Boolean.prototype.toString // true
      
  • 上面代碼中蒜绽,數(shù)值和布爾值的包裝對(duì)象都有toString屬性,因此變量s都能取到值桶现。

  • 解構(gòu)賦值的規(guī)則是躲雅,只要等號(hào)右邊的值不是對(duì)象或數(shù)組,就先將其轉(zhuǎn)為對(duì)象骡和。由于undefinednull無法轉(zhuǎn)為對(duì)象相赁,所以對(duì)它們進(jìn)行解構(gòu)賦值,都會(huì)報(bào)錯(cuò)慰于。

函數(shù)參數(shù)的解構(gòu)賦值

  • 函數(shù)的參數(shù)也可以使用解構(gòu)賦值钮科。

    • function add([x, y]){
        return x + y;
      }
      
      add([1, 2]); // 3
      
    • 上面代碼中,函數(shù)add的參數(shù)表面上是一個(gè)數(shù)組婆赠,但在傳入?yún)?shù)的那一刻绵脯,數(shù)組參數(shù)就被解構(gòu)成變量xy。對(duì)于函數(shù)內(nèi)部的代碼來說页藻,它們能感受到的參數(shù)就是xy桨嫁。

  • [[1, 2], [3, 4]].map(([a, b]) => a + b);
    // [ 3, 7 ]
    
    • 函數(shù)參數(shù)的解構(gòu)也可以使用默認(rèn)值。

    • function move({x = 0, y = 0} = {}) {
        return [x, y];
      }
      
      move({x: 3, y: 8}); // [3, 8]
      move({x: 3}); // [3, 0]
      move({}); // [0, 0]
      move(); // [0, 0]
      
    • 上面代碼中份帐,函數(shù)move的參數(shù)是一個(gè)對(duì)象璃吧,通過對(duì)這個(gè)對(duì)象進(jìn)行解構(gòu),得到變量xy的值废境。如果解構(gòu)失敗畜挨,xy等于默認(rèn)值。

    • 注意噩凹,下面的寫法會(huì)得到不一樣的結(jié)果巴元。

    • function move({x, y} = { x: 0, y: 0 }) {
        return [x, y];
      }
      
      move({x: 3, y: 8}); // [3, 8]
      move({x: 3}); // [3, undefined]
      move({}); // [undefined, undefined]
      move(); // [0, 0]
      
    • 上面代碼是為函數(shù)move的參數(shù)指定默認(rèn)值,而不是為變量xy指定默認(rèn)值驮宴,所以會(huì)得到與前一種寫法不同的結(jié)果逮刨。

    • undefined就會(huì)觸發(fā)函數(shù)參數(shù)的默認(rèn)值。

    • [1, undefined, 3].map((x = 'yes') => x);
      // [ 1, 'yes', 3 ]
      

圓括號(hào)問題

  • 解構(gòu)賦值雖然很方便堵泽,但是解析起來并不容易修己。對(duì)于編譯器來說,一個(gè)式子到底是模式迎罗,還是表達(dá)式睬愤,沒有辦法從一開始就知道,必須解析到(或解析不到)等號(hào)才能知道纹安。

  • 由此帶來的問題是尤辱,如果模式中出現(xiàn)圓括號(hào)怎么處理砂豌。ES6 的規(guī)則是,只要有可能導(dǎo)致解構(gòu)的歧義光督,就不得使用圓括號(hào)阳距。

  • 但是,這條規(guī)則實(shí)際上不那么容易辨別结借,處理起來相當(dāng)麻煩娄涩。因此,建議只要有可能映跟,就不要在模式中放置圓括號(hào)。

  • 可以使用圓括號(hào)的情況

    • 可以使用圓括號(hào)的情況只有一種:賦值語(yǔ)句的非模式部分扬虚,可以使用圓括號(hào)努隙。

    • [(b)] = [3]; // 正確
      ({ p: (d) } = {}); // 正確
      [(parseInt.prop)] = [3]; // 正確
      
    • 上面三行語(yǔ)句都可以正確執(zhí)行,因?yàn)槭紫人鼈兌际琴x值語(yǔ)句辜昵,而不是聲明語(yǔ)句荸镊;其次它們的圓括號(hào)都不屬于模式的一部分。第一行語(yǔ)句中堪置,模式是取數(shù)組的第一個(gè)成員躬存,跟圓括號(hào)無關(guān);第二行語(yǔ)句中舀锨,模式是p岭洲,而不是d;第三行語(yǔ)句與第一行語(yǔ)句的性質(zhì)一致坎匿。

用途

  1. 交換變量的值

    1. let x = 1;
      let y = 2;
      
      [x, y] = [y, x];
      
    2. 上面代碼交換變量xy的值盾剩,這樣的寫法不僅簡(jiǎn)潔,而且易讀替蔬,語(yǔ)義非常清晰告私。

  2. 從函數(shù)返回多個(gè)值

    1. 函數(shù)只能返回一個(gè)值,如果要返回多個(gè)值承桥,只能將它們放在數(shù)組或?qū)ο罄锓祷刈に凇S辛私鈽?gòu)賦值,取出這些值就非常方便凶异。

    2. // 返回一個(gè)數(shù)組
      
      function example() {
        return [1, 2, 3];
      }
      let [a, b, c] = example();
      
      // 返回一個(gè)對(duì)象
      
      function example() {
        return {
          foo: 1,
          bar: 2
        };
      }
      let { foo, bar } = example();
      
  3. 函數(shù)參數(shù)的定義

    1. 解構(gòu)賦值可以方便地將一組參數(shù)與變量名對(duì)應(yīng)起來蜀撑。

    2. // 參數(shù)是一組有次序的值
      function f([x, y, z]) { ... }
      f([1, 2, 3]);
      
      // 參數(shù)是一組無次序的值
      function f({x, y, z}) { ... }
      f({z: 3, y: 2, x: 1});
      
  4. 提取 JSON 數(shù)據(jù)

    1. 解構(gòu)賦值對(duì)提取 JSON 對(duì)象中的數(shù)據(jù),尤其有用唠帝。

    2. let jsonData = {
        id: 42,
        status: "OK",
        data: [867, 5309]
      };
      
      let { id, status, data: number } = jsonData;
      
      console.log(id, status, number);
      // 42, "OK", [867, 5309]
      
      上面代碼可以快速提取 JSON 數(shù)據(jù)的值屯掖。
      
  5. 函數(shù)參數(shù)的默認(rèn)值

    1. jQuery.ajax = function (url, {
        async = true,
        beforeSend = function () {},
        cache = true,
        complete = function () {},
        crossDomain = false,
        global = true,
        // ... more config
      } = {}) {
        // ... do stuff
      };
      
    2. 指定參數(shù)的默認(rèn)值,就避免了在函數(shù)體內(nèi)部再寫var foo = config.foo || 'default foo';這樣的語(yǔ)句襟衰。

  6. 遍歷 Map 結(jié)構(gòu)

    1. const map = new Map();
      map.set('first', 'hello');
      map.set('second', 'world');
      
      for (let [key, value] of map) {
        console.log(key + " is " + value);
      }
      // first is hello
      // second is world
      
    2. 任何部署了 Iterator 接口的對(duì)象贴铜,都可以用for...of循環(huán)遍歷。Map 結(jié)構(gòu)原生支持 Iterator 接口,配合變量的解構(gòu)賦值绍坝,獲取鍵名和鍵值就非常方便徘意。

    3. 如果只想獲取鍵名,或者只想獲取鍵值轩褐,可以寫成下面這樣椎咧。

    4. // 獲取鍵名
      for (let [key] of map) {
        // ...
      }
      
      // 獲取鍵值
      for (let [,value] of map) {
        // ...
      }
      
  7. 輸入模塊的指定方法

    1. const { SourceMapConsumer, SourceNode } = require("source-map");
      
    2. 加載模塊時(shí),往往需要指定輸入哪些方法把介。解構(gòu)賦值使得輸入語(yǔ)句非常清晰勤讽。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拗踢,隨后出現(xiàn)的幾起案子脚牍,更是在濱河造成了極大的恐慌,老刑警劉巖巢墅,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诸狭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡君纫,警方通過查閱死者的電腦和手機(jī)驯遇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蓄髓,“玉大人叉庐,你說我怎么就攤上這事』岷龋” “怎么了眨唬?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)好乐。 經(jīng)常有香客問我匾竿,道長(zhǎng),這世上最難降的妖魔是什么蔚万? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任岭妖,我火速辦了婚禮,結(jié)果婚禮上反璃,老公的妹妹穿的比我還像新娘昵慌。我一直安慰自己,他們只是感情好淮蜈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布斋攀。 她就那樣靜靜地躺著,像睡著了一般梧田。 火紅的嫁衣襯著肌膚如雪淳蔼。 梳的紋絲不亂的頭發(fā)上侧蘸,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音鹉梨,去河邊找鬼讳癌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛存皂,可吹牛的內(nèi)容都是我干的晌坤。 我是一名探鬼主播坑鱼,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼睡毒,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼沪伙!你這毒婦竟也來了番宁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤尉尾,失蹤者是張志新(化名)和其女友劉穎缘薛,沒想到半個(gè)月后泛粹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胰柑,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年爬泥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了柬讨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡袍啡,死狀恐怖踩官,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情境输,我是刑警寧澤蔗牡,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站嗅剖,受9級(jí)特大地震影響辩越,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜信粮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一黔攒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧强缘,春花似錦督惰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至商虐,卻和暖如春觉阅,著一層夾襖步出監(jiān)牢的瞬間崖疤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工留拾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留戳晌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓痴柔,卻偏偏與公主長(zhǎng)得像沦偎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子咳蔚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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