JavaScript面試常見問題

1.引起內(nèi)存泄漏的操作有哪些

1.全局變量引起

2.閉包引起

3.dom清空,事件未清除

4.子元素存在引用

5.被遺忘的計時器

參考:

JavaScript 常見的內(nèi)存泄漏原因

2.如何實現(xiàn)ajax請求

1.通過實例化一個XMLHttpRequest對象得到一個實例,調(diào)用實例的open方法為這次ajax請求設(shè)定相應(yīng)的http方法、相應(yīng)的地址和以及是否異步,當(dāng)然大多數(shù)情況下我們都是選異步,以異步為例,之后調(diào)用send方法ajax請求,這個方法可以設(shè)定需要發(fā)送的報文主體,然后通過監(jiān)聽readystatechange事件,通過這個實例的readyState屬性來判斷這個ajax請求的狀態(tài),其中分為0,1,2,3,4這四種狀態(tài),當(dāng)狀態(tài)為4的時候也就是接收數(shù)據(jù)完成的時候,這時候可以通過實例的status屬性判斷這個請求是否成功

3.簡要介紹ES6

ES6在變量的聲明和定義方面增加了let、const聲明變量,有局部變量的概念,賦值中有比較吸引人的結(jié)構(gòu)賦值,同時ES6對字符串、數(shù)組、正則、對象、函數(shù)等拓展了一些方法,如字符串方面的模板字符串、函數(shù)方面的默認(rèn)參數(shù)、對象方面屬性的簡潔表達(dá)方式,ES6也引入了新的數(shù)據(jù)類型symbol,新的數(shù)據(jù)結(jié)構(gòu)set和map,symbol可以通過typeof檢測出來,為解決異步回調(diào)問題,引入了promise和generator,還有最為吸引人了實現(xiàn)Class和模塊,通過Class可以更好的面向?qū)ο缶幊蹋褂媚K加載方便模塊化編程,當(dāng)然考慮到瀏覽器兼容性,我們在實際開發(fā)中需要使用babel進(jìn)行編譯。

4.對js原型的理解

我們知道在es6之前,js沒有類和繼承的概念,js是通過原型來實現(xiàn)繼承的。在js中一個構(gòu)造函數(shù)默認(rèn)自帶有一個prototype屬性,這個的屬性值是一個對象,同時這個prototype對象自帶有一個constructor屬性,這個屬性指向這個構(gòu)造函數(shù),同時每一個實例都有一個proto屬性指向這個prototype對象,我們可以將這個叫做隱式原型,我們在使用一個實例的方法的時候,會先檢查這個實例中是否有這個方法,沒有則會繼續(xù)向上查找這個prototype對象是否有這個方法,剛剛我們說到prototype是一個對象,那么也即是說這個是一個對象的實例,那么這個對象同樣也會有一個proto屬性指向?qū)ο蟮膒rototype對象。

5.對js模塊化的理解

在ES6出現(xiàn)之前,js沒有標(biāo)準(zhǔn)的模塊化概念,這也就造成了js多人寫作開發(fā)容易造成全局污染的情況,以前我們可能會采用立即執(zhí)行函數(shù)、對象等方式來盡量減少變量這種情況,后面社區(qū)為了解決這個問題陸續(xù)提出了AMD規(guī)范和CMD規(guī)范,這里不同于Node.js的CommonJS的原因在于服務(wù)端所有的模塊都是存在于硬盤中的,加載和讀取幾乎是不需要時間的,而瀏覽器端因為加載速度取決于網(wǎng)速,因此需要采用異步加載,AMD規(guī)范中使用define來定義一個模塊,使用require方法來加載一個模塊,現(xiàn)在ES6也推出了標(biāo)準(zhǔn)的模塊加載方案,通過export和import來導(dǎo)出和導(dǎo)入模塊。

6.如何實現(xiàn)一個JS的AMD模塊加載器

AMD是解決JS模塊化的規(guī)范,實現(xiàn)這樣的一個模塊加載器的關(guān)鍵在于解決每個模塊依賴的解析。首先我們需要有一個模塊的入口,也就是主模塊,比如我們使用一個use方法作為入口,之后以數(shù)組的形式列出了主模塊的依賴,這時候我們要想到的是如何解析這一個一個的依賴,也就是如何解析出一個個js文件的絕對地址,我們可以制定一個規(guī)則,如默認(rèn)為主模塊的路徑為基準(zhǔn),也可以像requirejs一樣使用一個config方法來指定一個baseurl和為每一個模塊指定一個path,最后就是模塊的問題,我們需要暴露一個define方法來定義模塊,也就是模塊名,依賴以及每個模塊的各自代碼。其中每個模塊的代碼都應(yīng)該在依賴加載完之后執(zhí)行,這就是一個回調(diào)函數(shù),模塊的依賴、回調(diào)函數(shù)、狀態(tài)、名字、模塊導(dǎo)出等可以看做是一個模塊的屬性,因此我們可以使用一個對象來保存所有的模塊,然后每個模塊的各個屬性存放在一個對象中。最后我們來考慮一下模塊加載的問題,上面我們說到use方法,use方法的邏輯就是遍歷依賴,然后對每個模塊進(jìn)行加載,也就是解析地址然后使用插入script,我們假設(shè)使用loadModule方法來加載依賴,那么這個函數(shù)的邏輯就應(yīng)該是檢查我們的模塊是否已經(jīng)加載過來判斷是否需要加載,如果這個模塊還有依賴則調(diào)用use方法繼續(xù)解析,模塊依賴中我們還沒有提到的問題就是每個模塊的依賴是需要被傳進(jìn)模塊里來使用的,解決方法就是每個模塊的callback方法執(zhí)行后的返回的export記錄下來然后使用apply之類的方法將這些參數(shù)傳遞進(jìn)去。大致就是這樣子的。

參考:

動手實現(xiàn)一個AMD模塊加載器(一)

動手實現(xiàn)一個AMD模塊加載器(二)

動手實現(xiàn)一個AMD模塊加載器(三)

7.簡要介紹事件代理,以及什么時候使用,事件代理發(fā)生在事件處理流程的哪個階段,有什么好處?

事件代理就是說我們將事件添加到本來要添加事件的父節(jié)點,將事件委托給父節(jié)點來觸發(fā)處理函數(shù),這通常會在這通常會使用在大量的同級元素需要添加同一類事件的時候,比如一個動態(tài)的非常多的列表,需要為每個列表項都添加點擊事件,這時可以使用事件代理,通過判斷e.target.nodeName來判斷發(fā)生的具體元素,從而判斷是否是在列表項中觸發(fā),這樣的好處是可以減少事件綁定,同時動態(tài)的DOM結(jié)構(gòu)仍然可以監(jiān)聽。事件代理發(fā)生在冒泡階段。

參考:

事件代理

淺析JavaScript的事件代理和委托

8.使用new操作符實例化一個對象的具體步驟

1.構(gòu)造一個新的對象

2.將構(gòu)造函數(shù)的作用域賦給新對象(也就是說this指向了新的對象)

3.執(zhí)行構(gòu)造函數(shù)中的代碼

4.返回新對象

9.js如何判斷網(wǎng)頁中圖片加載成功或者失敗

使用onload事件運行加載成功,使用onerror事件判斷失敗

10.遞歸和迭代的區(qū)別是什么,各有什么優(yōu)缺點?

程序調(diào)用自身稱為遞歸,利用變量的原值推出新值稱為迭代,遞歸的優(yōu)點大問題轉(zhuǎn)化為小問題,可以減少代碼量,同時應(yīng)為代碼精簡,可讀性好,缺點就是,遞歸調(diào)用浪費了空間,而且遞歸太深容易造成堆棧的溢出。迭代的好處就是代碼運行效率好,因為時間只因循環(huán)次數(shù)增加而增加,而且沒有額外的空間開銷,缺點就是代碼不如遞歸簡潔

參考:

深究遞歸和迭代的區(qū)別、聯(lián)系、優(yōu)缺點及實例對比

「遞歸」和「迭代」有哪些區(qū)別?

11.策略模式是什么,說一下你的理解?

策略模式就是說我們將一系列的算法封裝起來,使其相互之間可以替換,封裝的算法具有一定的獨立性,不會隨客戶端的變化而變化,比較常見的使用常見就是類似于表單驗證這種多場景的情況,我們使用策略模式就可以避免使用一堆的if...else。

12.什么是事件循環(huán)(EVENT LOOP)?

我們常常說js是單線程的,是指js執(zhí)行引擎是單線程的,除了這個單線程,還有一個任務(wù)隊列,在執(zhí)行js代碼的過程中,執(zhí)行引擎遇到注冊的延時方法,如定時器,DOM事件,會將這些方法交給相應(yīng)的瀏覽器模塊處理,當(dāng)這些延時方法有觸發(fā)條件去觸發(fā)的時候,這些延時方法會被添加至任務(wù)隊列,而這些任務(wù)隊列中的方法只有js的主線程空閑了才會執(zhí)行,這也就是說我們常常用的定時器定的時間參數(shù)只是一個觸發(fā)條件,具體多少時間后執(zhí)行其實還需要看js主線程空閑與否

參考:

【轉(zhuǎn)向Javascript系列】從setTimeout說事件循環(huán)模型

深入淺出Javascript事件循環(huán)機(jī)制(上)

深入淺出JavaScript事件循環(huán)機(jī)制(下)

并發(fā)模型與事件循環(huán)

13.原生JS操作DOM的方法有哪些?

獲取節(jié)點的方法getElementById、getElementsByClassName、getElementsByTagName、getElementsByName、querySelector、querySelectorAll,對元素屬性進(jìn)行操作的 getAttribute、setAttribute、removeAttribute方法,對節(jié)點進(jìn)行增刪改的appendChild、insertBefore、replaceChild、removeChild、createElement等

14.typeof操作符返回值有哪些,對undefined、null、NaN使用這個操作符分別返回什么

typeof的返回值有undefined、boolean、string、number、object、function、symbol。對undefined使用返回undefined、null使用返回object,NaN使用返回number

15.實現(xiàn)一個類型判斷函數(shù),需要鑒別出基本類型、function、null、NaN、數(shù)組、對象?

只需要鑒別這些類型那么使用typeof即可,要鑒別null先判斷雙等判斷是否為null,之后使用typeof判斷,如果是obejct的話,再用Array.isArray判斷是否為數(shù)組,如果是數(shù)字再使用isNaN判斷是否為NaN,(需要注意的是NaN并不是JavaScript數(shù)據(jù)類型,而是一種特殊值)如下:


16.javascript做類型判斷的方法有哪些?

typeof、instanceof 、 Object.prototype.toString()(待續(xù))

17.JavaScript嚴(yán)格模式下有哪些不同?

不允許不使用var關(guān)鍵字去創(chuàng)建全局變量,拋出ReferenceError

不允許對變量使用delete操作符,拋ReferenceError

不可對對象的只讀屬性賦值,不可對對象的不可配置屬性使用delete操作符,不可為不可拓展的對象添加屬性,均拋TypeError

對象屬性名必須唯一

函數(shù)中不可有重名參數(shù)

在函數(shù)內(nèi)部對修改參數(shù)不會反映到arguments中

淘汰arguments.callee和arguments.caller

不可在if內(nèi)部聲明函數(shù)

拋棄with語句

參考:

1.javascript高級程序設(shè)計

18.setTimeout和setInterval的區(qū)別,包含內(nèi)存方面的分析?

setTimeout表示間隔一段時間之后執(zhí)行一次調(diào)用,而setInterval則是每間隔一段時間循環(huán)調(diào)用,直至clearInterval結(jié)束。內(nèi)存方面,setTimeout只需要進(jìn)入一次隊列,不會造成內(nèi)存溢出,setInterval因為不計算代碼執(zhí)行時間,有可能同時執(zhí)行多次代碼,導(dǎo)致內(nèi)存溢出。

參考:

JS 中settimeout和setinterval函數(shù)的區(qū)別

setTimeout() 和 setInterval() 本質(zhì)區(qū)別在哪里?

19.同源策略是什么?

同源策略是指只有具有相同源的頁面才能夠共享數(shù)據(jù),比如cookie,同源是指頁面具有相同的協(xié)議、域名、端口號,有一項不同就不是同源。有同源策略能夠保證web網(wǎng)頁的安全性。

參考:

前端必備HTTP技能之同源策略詳解

瀏覽器同源政策及其規(guī)避方法

瀏覽器的同源策略

20.ES6之前JavaScript如何實現(xiàn)繼承?

ES6之前的繼承是通過原型來實現(xiàn)的,也就是每一個構(gòu)造函數(shù)都會有一個prototype屬性,然后如果我們調(diào)用一個實例的方法或者屬性,首先會在自身尋找,然后在構(gòu)造函數(shù)的prototype上尋找,而prototype本質(zhì)上就是一個實例,因此如果prototype上還沒有則會往prototype上的構(gòu)造函數(shù)的prototype尋找,因此實現(xiàn)繼承可以讓構(gòu)造函數(shù)的prototype是父級的一個實例就是以實現(xiàn)繼承。

21.如何阻止事件冒泡和默認(rèn)事件?

標(biāo)準(zhǔn)的DOM對象中可以使用事件對象的stopPropagation()方法來阻止事件冒泡,但在IE8以下中IE的事件對象通過設(shè)置事件對象的cancelBubble屬性為true來阻止冒泡;默認(rèn)事件的話通過事件對象的preventDefault()方法來阻止,而IE通過設(shè)置事件對象的returnValue屬性為false來阻止默認(rèn)事件。

22.addEventListener有哪些參數(shù)?

有三個參數(shù),第一個是事件的類型,第二個是事件的回調(diào)函數(shù),第三個是一個表示事件是冒泡階段還是捕獲階段捕獲的布爾值,true表示捕獲,false表示冒泡

23.介紹一下Promise,底層如何實現(xiàn)?

24.如何實現(xiàn)懶加載?

懶加載就是根據(jù)用戶的瀏覽需要記載內(nèi)容,也就是在用戶即將瀏覽完當(dāng)前的內(nèi)容時進(jìn)行繼續(xù)加載內(nèi)容,這種技術(shù)常常用來加載圖片的時候使用。我們判斷用戶是否即將瀏覽到底部之后進(jìn)行在家內(nèi)容這時候可能會需要加載大量的內(nèi)容,可以使用fragment來優(yōu)化一下,因為大部分是使用滑動和滾輪來觸發(fā)的,因此很有可能會不斷觸發(fā),可以使用函數(shù)節(jié)流做一個優(yōu)化,防止用戶不斷觸發(fā)。

25.函數(shù)節(jié)流是什么?

函數(shù)節(jié)流就是讓一個函數(shù)無法在很短的時間間隔內(nèi)連續(xù)調(diào)用,而是間隔一段時間執(zhí)行,這在我們?yōu)樵亟壎ㄒ恍┦录臅r候經(jīng)常會用到,比如我們?yōu)閣indow綁定了一個resize事件,如果用戶一直改變窗口大小,就會一直觸發(fā)這個事件處理函數(shù),這對性能有很大影響。

什么是函數(shù)節(jié)流?

26.瀏覽器內(nèi)核有哪些?分別對應(yīng)哪些瀏覽器?

常見的瀏覽器內(nèi)核有Trident、Gecko、WebKit、Presto,對應(yīng)的瀏覽器為Trident對應(yīng)于IE,Gecko對應(yīng)于火狐瀏覽器,Webkit有chrome和safari,Presto有Opera。

27.什么是深拷貝,什么是淺拷貝?

淺拷貝是指僅僅復(fù)制對象的引用,而不是復(fù)制對象本身;深拷貝則是把復(fù)制對象所引用的全部對象都復(fù)制一遍。

28.原生js字符串方法有哪些?

簡單分為獲取類方法,獲取類方法有charAt方法用來獲取指定位置的字符,獲取指定位置字符的unicode編碼的charCodeAt方法,與之相反的fromCharCode方法,通過傳入的unicode返回字符串。查找類方法有indexof()、lastIndexOf()、search()、match()方法。截取類的方法有substring、slice、substr三個方法,其他的還有replace、split、toLowerCase、toUpperCase方法。

29.原生js字符串截取方法有哪些?有什么區(qū)別?

js字符串截取方法有substring、slice、substr三個方法,substring和slice都是指定截取的首尾索引值,不同的是傳遞負(fù)值的時候substring會當(dāng)做0來處理,而slice傳入負(fù)值的規(guī)則是-1指最后一個字符,substr方法則是第一個參數(shù)是開始截取的字符串,第二個是截取的字符數(shù)量,和slice類似,傳入負(fù)值也是從尾部算起的。

30.SVG和Canvas的區(qū)別?

31.介紹一下ES6的暫時性死區(qū)和塊級作用域

32.請介紹一下裝飾者模式,并實現(xiàn)

在不改變元對象的基礎(chǔ)上,對這個對象進(jìn)行包裝和拓展(包括添加屬性和方法),從而使這個對象可以有更復(fù)雜的功能。

33.介紹一下職責(zé)鏈模式?

將一個流程進(jìn)行分解,讓這個流程在多個對象中進(jìn)行傳遞,由最后一個對象完成這個流程。通過職責(zé)鏈模式能夠?qū)⒘鞒踢M(jìn)行分解,從而解耦。

33.介紹一下桶排序和基數(shù)排序、快速排序

34.請說一下實現(xiàn)jsonp的實現(xiàn)思路?

jsonp的原理是使用script標(biāo)簽來實現(xiàn)跨域,因為script標(biāo)簽的的src屬性是不受同源策略的影響的,因此可以使用其來跨域。一個最簡單的jsonp就是創(chuàng)建一個script標(biāo)簽,設(shè)置src為相應(yīng)的url,在url之后添加相應(yīng)的callback,格式類似于url?callback=xxx,服務(wù)端根據(jù)我們的callback來返回相應(yīng)的數(shù)據(jù),類似于res.send(req.query.callback + '('+ data + ')'),這樣就實現(xiàn)了一個最簡單的jsonp

參考:

動手實現(xiàn)一個JSONP

jsonp的原理與實現(xiàn)

fetch-jsonp源碼

35.如何實現(xiàn)一個雙向數(shù)據(jù)綁定?

36.如何實現(xiàn)一個前端模板引擎?

37.請簡要介紹一下PWA?

38.chrome瀏覽器的JS引擎是哪個?這個引擎做了哪些優(yōu)化?

chrome的JS引擎是V8,V8是谷歌公司使用C++開發(fā)的

參考:

為什么V8引擎這么快?

39.請介紹一下你所了解的函數(shù)式編程?

40.let和const的異同有哪些?

let和const都是對變量的聲明,都有塊級作用域的概念,不同的是const是對常量的聲明,因此聲明同時必須賦值,且之后不能更改,而let則可以。

41.將靜態(tài)資源放在其他域名的目的是什么?

這樣做的主要目的是在請求這些靜態(tài)資源的時候不會發(fā)送cookie,節(jié)省了流量,需要注意的是cookie是會發(fā)送給子域名的(二級域名),所以這些靜態(tài)資源是不會放在子域名下的,而是單獨放在一個單獨的主域名下。同時還有一個原因就是瀏覽器對于一個域名會有請求數(shù)的限制,這種方法可以方便做CDN。

參考:

為什么淘寶、騰訊等會把靜態(tài)資源放在另外一個主域名下?

為什么很多網(wǎng)站的靜態(tài)資源會使用獨立的域名?

42.前端如何實現(xiàn)PV和UV的統(tǒng)計?

43.簡要介紹一下RSA

44.如何實現(xiàn)對一個DOM元素的深拷貝,包括元素的綁定事件?

45.canvas性能優(yōu)化的方法有哪些?

46.介紹一下KMP算法?

47.簡要介紹一下WebPack的底層實現(xiàn)原理?

48.簡要介紹一下gulp的底層實現(xiàn)原理?

49.ajax的readyState有哪幾個狀態(tài),含義分別是什么?

ajax的readyState共有5個狀態(tài),分別是0-4,其中每個數(shù)字的含義分別是0代表還沒調(diào)用open方法,1代表的是未調(diào)用send方法,也就是還沒發(fā)送數(shù)據(jù)給服務(wù)器2代表的是還沒有接收到響應(yīng),3代表的是開始接收到了部分?jǐn)?shù)據(jù),4代表的是接收完成,數(shù)據(jù)可以在客戶端使用了。

50.對于ES7你了解多少?

51.請簡要介紹一下service worker?

52.SPA的路由是如果實現(xiàn)的,如果你來做一個前端路由,你會怎么做?

53.AMD與CMD的區(qū)別有哪些?

54.聽說過UMD嗎?可以簡要介紹一下嗎?

55.百度的構(gòu)建工具FIS你了解嗎?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,001評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,786評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,986評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,204評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,964評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,354評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,410評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,554評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,106評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,918評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,093評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,648評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,342評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,755評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,009評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,839評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,107評論 2 375