JS基礎(chǔ)面試題

1. 一句話概括一下閉包
閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù),或者子函數(shù)在外調(diào)用夜赵,子函數(shù)所在的父函數(shù)的作用域不會被釋放。
2. 說一下類的創(chuàng)建和繼承
(1) 類的創(chuàng)建(es5):new一個function啄枕,在這個function的prototype里面增加屬性和方法膀值。
比如下面創(chuàng)建一個動物類:

    // 定義一個動物類
    function Animal(name) {
        // 屬性
        this.name = name || 'Animal';
        // 實例方法
        this.sleep = function () {
            console.log(this.name + '正在睡覺!');
        };
        // 原型方法
        Animal.prototype.eat = function (food) {
            console.log(this.name + '正在吃' + food);
        };
    }

這樣就生成了一個Animal類栅葡,實例化生成對象后茉兰,有方法有屬性。
(2) 類的繼承(具體參照繼承詳解)
a欣簇、原型鏈繼承

    function Cat() {}
    Cat.prototype = new Animal();
    Cat.prototype.name = 'Cat';
    // Test Code
    var cat = new Cat();
    console.log(cat.name); // cat
    console.log(cat.eat('fish')); // Cat正在吃fish
    console.log(cat.sleep()); // Cat正在睡覺规脸!
    console.log(cat instanceof Animal); // true
    console.log(cat instanceof Cat); // true

介紹:這里我們可以看到new了一個空對象,這個空對象指向Animal并且Cat.prototype指向了這個空對象熊咽,這種就是基于原型鏈的繼承莫鸭。
特點:基于原型鏈,既是父類的實例横殴,也是子類的實例黔龟。
缺點:無法實現(xiàn)多繼承。
b滥玷、構(gòu)造繼承:使用父類的構(gòu)造函數(shù)來增強子類實例氏身,等于是復(fù)制父類的實例屬性給子類(沒用到原型)

    function Cat(name) {
        Animal.call(this);
        this.name = name || 'Tom';
    }
    // Test Code
    var cat = new Cat();
    console.log(cat.name); // Tom
    console.log(cat.sleep()); // Tom正在睡覺!
    console.log(cat instanceof Animal); // false
    console.log(cat instanceof Cat); // true

特點:可以實現(xiàn)多繼承
缺點:只能繼承父類實例的屬性和方法惑畴,不能繼承原型上的屬性和方法蛋欣。
c、實例繼承和拷貝繼承
實例繼承:為父類實例添加新特性如贷,作為子類實例返回陷虎;
拷貝繼承:拷貝父類元素上的屬性和方法到踏。
上述兩個實用性不強,不一一舉例尚猿。
d窝稿、組合繼承:相當(dāng)于構(gòu)造函數(shù)和原型鏈繼承的組合體。通過調(diào)用父類構(gòu)造凿掂,繼承父類的屬性并保留傳參的優(yōu)點伴榔,然后通過將父類實例作為子類原型,實現(xiàn)函數(shù)復(fù)用庄萎。

    function Cat(name) {
        Animal.call(this);
        this.name = name || 'Tom';
    }
    Cat.prototype = new Animal();
    Cat.prototype.constructor = Cat;
    // Test Code
    var cat = new Cat();
    console.log(cat.name); // Tom
    console.log(cat.sleep()); // Tom正在睡覺踪少!
    console.log(cat instanceof Animal); // true
    console.log(cat instanceof Cat); // true

特點:可以繼承實例屬性/方法,也可以繼承原型屬性/方法
缺點:調(diào)用了兩次父類構(gòu)造函數(shù)糠涛,生成了兩份實例援奢。
e、寄生組合繼承:通過寄生方式忍捡,砍掉父類的實例對象集漾,這樣在調(diào)用兩次父類的構(gòu)造函數(shù)的時候,就不會初始化兩次實例方法/屬性砸脊。

    // 寄生組合繼承
    function Cat(name) {
        Animal.call(this);
        this.name = name || 'Tom';
    }
    (function () {
        // 創(chuàng)建一個沒有實例方法的類
        var Super = function () {};
        Super.prototype = Animal.prototype;
        Cat.prototype = new Super();
    })();
    // Test Code
    var cat = new Cat();
    console.log(cat.name);
    console.log(cat.sleep());
    console.log(cat instanceof Animal); // true
    console.log(cat instanceof Cat); // true

較為推薦
3. 如何解決異步回調(diào)地獄
promise帆竹、generator、async/await
4. 說說前端中的事件流
詳細(xì)可參照JS中的事件順序
HTML中與JS交互是通過事件驅(qū)動來實現(xiàn)的脓规,例如鼠標(biāo)點擊事件click、頁面的滾動事件onscroll等等险领,可以向文檔或文檔中的元素添加事件偵聽器來預(yù)訂事件侨舆。想要知道這些事件是在什么時候進(jìn)行調(diào)用的,就需要了解“事件流”這個概念绢陌。
什么是事件流:事件流描述的是從頁面中接收事件的順序挨下,DOM2級事件流包括以下幾個階段:
事件捕獲階段 → 處于目標(biāo)階段 → 事件冒牌階段
addEventListener:addEventListener是DOM2級事件新增的指定事件處理程序的操作。這個方法接收3個參數(shù):要處理的事件名脐湾、作為事件處理程序的函數(shù)和一個布爾值臭笆。最后的布爾值參數(shù)如果是true,表示在捕獲階段調(diào)用事件處理程序秤掌;如果是false愁铺,表示在冒泡階段調(diào)用事件處理程序。
IE只支持事件冒泡闻鉴。
如下例:

<html>
    <input type="button" id="doit" onclick="doit()">
</html>
<script>
    function doit(){
        console.log('我是點擊事件');
    }
    document.getElementById('doit').addEventListener('click',function () {
        console.log('目前處于事件捕獲階段');
    },true);
    document.getElementById('doit').addEventListener('click',function () {
        console.log('目前處于事件冒泡階段');
    },false);
</script>

點擊按鈕時輸出結(jié)果為:

image.png

5. 如何讓事件先冒泡后捕獲
在DOM標(biāo)準(zhǔn)事件模型中茵乱,是先捕獲后冒泡。但是如果要實現(xiàn)先冒泡后捕獲的效果孟岛,對于同一個事件瓶竭,監(jiān)聽捕獲和冒泡督勺,分別對應(yīng)相應(yīng)的處理函數(shù),監(jiān)聽到捕獲事件斤贰,先暫緩執(zhí)行智哀,直到冒泡事件被捕獲之后再執(zhí)行捕獲事件。
6. 什么是事件委托
事件委托是指不在事件的發(fā)生地(直接DOM)上設(shè)置監(jiān)聽函數(shù)荧恍,而是在其父元素上設(shè)置監(jiān)聽函數(shù)瓷叫。通過事件冒泡,父元素可以監(jiān)聽到子元素上事件的觸發(fā)块饺,通過判斷事件發(fā)生元素DOM的類型赞辩,來做出不同的相應(yīng)。
舉例:最經(jīng)典的就是ul和li標(biāo)簽的事件監(jiān)聽授艰。比如我們在添加事件時辨嗽,采用事件委托機制,不會在li標(biāo)簽上直接添加淮腾,而是在ul父元素上添加糟需。
好處:比較適合動態(tài)元素的綁定,新添加的子元素也會有監(jiān)聽函數(shù)谷朝,也可以有事件觸發(fā)機制洲押。
7. 什么是圖片的懶加載和預(yù)加載
預(yù)加載:提前加載圖片,當(dāng)用戶需要查看時可直接從本地緩存中渲染圆凰。
懶加載:懶加載的主要目的是作為服務(wù)器前端的優(yōu)化杈帐,減少請求數(shù)或延遲請求數(shù)。

兩種技術(shù)的本質(zhì):兩者的行為是相反的专钉,一個是提前加載挑童,一個是遲緩甚至不加載。
懶加載對服務(wù)器有一定的緩解壓力作用跃须,預(yù)加載則會增加服務(wù)器前端的壓力站叼。
8. mouseover和mouseenter的區(qū)別
mouseover:當(dāng)鼠標(biāo)移入元素或其子元素都會觸發(fā)事件,所以有一個重復(fù)觸發(fā)菇民、冒泡的過程尽楔。對應(yīng)的移出事件是mouseout。
mouseenter:當(dāng)鼠標(biāo)移出元素本身(不包含元素的子元素)會觸發(fā)事件第练,也就是不會冒泡阔馋,對應(yīng)的移除事件是mouseleave。
9. JS的new操作符做了哪些事娇掏?
為函數(shù)創(chuàng)建新的實例垦缅,即fun = new Fun(),大致可以分為四個部分:
a驹碍、新生成了一個對象 → b壁涎、這個對象原型指向構(gòu)造函數(shù)的prototype(this指向這個新對象) → c凡恍、執(zhí)行構(gòu)造函數(shù)中的代碼(為新對象添加屬性) → d、返回新對象
根據(jù)其原理怔球,可以自己實現(xiàn)一個new操作符:

    function Person(name) {
        this.name = name;
    }
    var p = new Person('小明');
    console.log(p.name); // 小明
    console.log(p instanceof Person); // true

    function _new() {
        console.log(args);
        // 1嚼酝、創(chuàng)建新對象
        let target = {};
        let [constructor, ...args] = [...arguments]; // 第一個參數(shù)是構(gòu)造函數(shù)
        // 2、原型鏈連接
        target.__proto__ = constructor.prototype;
        // 3竟坛、將構(gòu)造函數(shù)的屬性和方法添加到這個新對象上
        let result = constructor.apply(target, args);
        if (result && typeof result == 'object' || typeof result == 'function'){
            // 如果構(gòu)造函數(shù)返回的結(jié)果是一個對象闽巩,就返回這個對象
            return result;
        }
        // 如果構(gòu)造函數(shù)返回的不是一個對象,就返回創(chuàng)建的新對象
        return target;
    }

    let p2 = _new(Person,'小花');
    console.log(p2.name); // 小花
    console.log(p2 instanceof Person); // true

10. 改變函數(shù)內(nèi)部this指針的指向函數(shù)(bind担汤、apply涎跨、call的區(qū)別)
詳細(xì)請參考:JavaScript中call、apply與bind方法
通過apply和call改變函數(shù)的this指向崭歧,他們兩個函數(shù)的第一個參數(shù)都是要改變指向的那個函數(shù)隅很,第二個參數(shù),apply是數(shù)組率碾,而call則是arg1,arg2...這種形式叔营。
通過bind改變this作用域會返回一個新的函數(shù),這個函數(shù)不會馬上執(zhí)行所宰。
11. JS的各種位置绒尊,比如clientHeight、offsetHeight仔粥、scrollTop婴谱、offsetTop、clientTop的區(qū)別
clientHeight:表示的是可視區(qū)域的高度躯泰,不包含border和滾動條谭羔;
offsetHeight:表示可視區(qū)域的高度,包含了border和滾動條斟冕;
scrollHeight:表示了所有區(qū)域的高度,包含了因為滾動而被隱藏的部分缅阳;
clientTop:表示邊框border的厚度磕蛇,在未指定的情況下一般為0;
scrollTop:滾動后被隱藏的高度十办,獲取對象相對于有offsetParent屬性指定的父坐標(biāo)(css定位的元素或body元素)距離頂端的高度秀撇。
12. JS實現(xiàn)拖拽功能
首先是三個事件,分別是mousedown向族,mousemove呵燕,mouseup。
當(dāng)鼠標(biāo)點擊按下的時候件相,需要一個tag標(biāo)識此時已經(jīng)按下再扭,可以執(zhí)行mousemove里面的具體方法氧苍。
clientX,clientY表示鼠標(biāo)的坐標(biāo)泛范,分別表示橫坐標(biāo)和縱坐標(biāo)让虐,并且我們用offsetX和offsetY來表示元素的初始坐標(biāo),移動的距離應(yīng)該是:鼠標(biāo)移動時候的坐標(biāo) - 鼠標(biāo)按下去時候的坐標(biāo)罢荡。
也就是說定位信息為:鼠標(biāo)移動時候的坐標(biāo) - 鼠標(biāo)按下去時候的坐標(biāo) + 元素初始情況下的offsetLeft赡突。
還有一點也是原理性的東西,就是拖拽的同時是絕對定位区赵,我們改變的是絕對定位條件下的left以及top等值惭缰。
當(dāng)然,也可以使用html5的拖放(drag和drop)來實現(xiàn)拖拽笼才。
13. Ajax解決瀏覽器緩存問題
在ajax發(fā)送請求前加上 anyAjaxObj.setRequestHeader("If-Modified-Since","0")漱受。
在ajax發(fā)送請求前加上 anyAjaxObj.setRequestHeader("Cache-Control","no-cache")。
在URL后面加上一個隨機數(shù): "fresh=" + Math.random()患整。
在URL后面加上時間搓:"nowtime=" + new Date().getTime()拜效。
如果是使用jQuery,直接這樣就可以了 $.ajaxSetup({cache:false})各谚。這樣頁面的所有ajax都會執(zhí)行這條語句就是不需要保存緩存記錄紧憾。
14. JS中的垃圾回收機制
垃圾回收的必要性:由于字符串、對象和數(shù)組沒有固定大小昌渤,所以當(dāng)他們的大小已知時赴穗,才能對他們進(jìn)行動態(tài)的存儲分配。JS程序每次創(chuàng)建字符串膀息、數(shù)組或?qū)ο髸r般眉,解釋器都必須分配內(nèi)存來存儲那個實體。只要像這樣動態(tài)分配了內(nèi)存潜支,最終都要釋放這些內(nèi)存以便他們能夠被再用甸赃,否則JS的解釋器將會消耗完系統(tǒng)中所有可用的內(nèi)存,造成系統(tǒng)崩潰冗酿。
JS不像C++埠对,他有自己的一套垃圾回收機制(Garbage Collection)。JS的解釋器可以檢測到何時程序不再使用一個對象了裁替,當(dāng)他確定了一個對象是無用的時候项玛,他就知道不再需要這個對象,可以把它所占用的內(nèi)存釋放掉弱判。例如:

  var a = "hello world";
  var b = "world";
  var a = b; // 這時會釋放掉"hello world"所占據(jù)的內(nèi)存以便再用

垃圾回收的方法:標(biāo)記清除襟沮、計數(shù)引用。
a、標(biāo)記清除:
這是最常見的垃圾回收方式开伏,當(dāng)變量進(jìn)入環(huán)境時膀跌,就標(biāo)記這個變量為“進(jìn)入環(huán)境”,從邏輯上講硅则,永遠(yuǎn)不能釋放進(jìn)入環(huán)境的變量所占的內(nèi)存淹父,只要執(zhí)行流程進(jìn)入相應(yīng)的環(huán)境,就可能用到他們怎虫。當(dāng)離開環(huán)境時暑认,就標(biāo)記離開環(huán)境。
垃圾回收器在運行的時候會給存儲在內(nèi)存中的變量都加上標(biāo)記(所有都加)大审,然后去掉環(huán)境變量中的變量蘸际,以及被環(huán)境變量中的變量所引用的變量(條件性去除標(biāo)記),刪除所有被標(biāo)記的變量徒扶,刪除的變量無法在環(huán)境變量中被訪問粮彤,所以會被刪除。最后垃圾回收器完成了內(nèi)存的清除工作姜骡,并回收它們所占用的內(nèi)存导坟。
b、引用計數(shù)法:
另一種不太常見的就是引用計數(shù)法圈澈,引用計數(shù)意思就是每個值被引用的次數(shù)惫周,當(dāng)聲明了一個變量,并用一個引用類型的值賦值給變量康栈,則這個值的引用次數(shù)為1了相反的递递,如果包含了對這個值引用的變量又取得了另外一個值,則原先的引用次數(shù)減1啥么,當(dāng)這個值的引用次數(shù)為0時登舞,說明沒有對象需要這個值了,因此就把所占的內(nèi)存給回收進(jìn)來悬荣,這樣垃圾收集器再次運行的時候菠秒,就會釋放引用次數(shù)為0的這些值。
用引用計數(shù)法會存在內(nèi)存泄漏氯迂,看下面的例子:

    function problem() {
        var objA = new Object();
        var objB = new Object();
        objA.someOtherObject = objB;
        objB.someOtherObject = objA;
    }

在這個例子中践叠,objA和objB通過各自的屬性相互引用,這樣的話兩個對象的引用次數(shù)均為2囚戚,在采用引用計數(shù)的時候酵熙,由于函數(shù)執(zhí)行之后轧简,這兩個對象都離開了作用域驰坊,函數(shù)執(zhí)行完成之后,因為引用次數(shù)不為0哮独,便不會釋放其內(nèi)存拳芙,這樣的相互引用如果大量存在察藐,就會導(dǎo)致內(nèi)存泄漏。
特別是在DOM對象中舟扎,也容易存在這種問題:

    var element = document.getElementById('test');
    var myObj = new Object();
    myObj.element = element;
    element.someObject = myObj;

簡單來說分飞,只要存在相互引用,則引用計數(shù)法就容易出現(xiàn)內(nèi)存泄漏睹限。
15. eval的作用
eval方法的作用是將對應(yīng)的字符串解析成js并執(zhí)行譬猫。應(yīng)盡量避免使用eval,因為比較消耗性能(一次解析成js羡疗,一次執(zhí)行染服,要經(jīng)過兩次過程)
16. 什么是前端模塊化
前端模塊化指的是復(fù)雜的文件變成一個一個獨立的模塊,如js文件等叨恨,分成獨立的模塊有利于重用(復(fù)用性)和維護(hù)(版本迭代)柳刮,這樣會引來模塊之間相互依賴的問題,所以有了commonJS規(guī)范痒钝、AMD規(guī)范秉颗、CMD規(guī)范等等,以及用于js打包(編譯等處理)的工具webpack送矩。
17. 說一說CommonJS蚕甥、AMD和CMD
參考淺析JS模塊規(guī)范:AMD,CMD益愈,CommonJS
三者是目前常用的模塊化書寫規(guī)范梢灭。
CommonJS:
誕生較早,NodeJS就采用的是CommonJS蒸其,是這樣加載模塊的:

var clock = require('clock');
clock.start();

這種寫法更適合于服務(wù)器端敏释,因為服務(wù)器端請求本地磁盤中的文件速度很快。但如果是在客戶端摸袁,就有可能出現(xiàn)“假死”钥顽。如上面的例子,客戶端請求clock模塊靠汁,必須等clock.js請求成功蜂大,加載完畢才可以。
AMD:
即異步模塊定義(Asynchronous Module Definition)蝶怔,這種規(guī)范是異步的加載模塊奶浦,requireJs應(yīng)用了這一規(guī)范。先定義所有依賴踢星,然后在加載完成后的回調(diào)函數(shù)中執(zhí)行:require ([module], callback)
用AMD寫一個模塊:

require(['clock'], function(clock) {
  clock.start;
});

AMD雖然實現(xiàn)了異步加載澳叉,但是開始就把所有依賴寫出來是不符合書寫的邏輯順序的,能不能像commonJS那樣用的時候再require,而且還支持異步加載后再執(zhí)行呢成洗?
CMD:
CMD (Common Module Definition), 是seajs推崇的規(guī)范五督,CMD則是依賴就近,用的時候再require瓶殃。它寫起來是這樣的:

define(function(require, exports, module) {
   var clock = require('clock');
   clock.start();
});

AMD和CMD都是異步加載模塊充包,區(qū)別在于AMD依賴前置,js可以方便知道依賴模塊是誰遥椿,立即加載基矮;CMD則是就近依賴,需要把模塊變成字符串解析一遍才知道是依賴了哪些模塊冠场。這也是CMD缺點之一愈捅,即犧牲了部分性能帶來開發(fā)的便利。然而在實際情況下字符串解析時間可以忽略不計慈鸠。
18. 實現(xiàn)一種簡單的深度克隆
ES5常用的對象克隆的一種方式蓝谨。注意數(shù)組是對象,但是跟對象又有一定區(qū)別青团,所以一開始需要判斷類型譬巫,來決定newObj是對象還是數(shù)組。

    function deepClone(obj) {
        var newObj = obj instanceof Array? []: {}; // 判斷克隆對象是數(shù)組還是對象督笆,是數(shù)組則創(chuàng)建空數(shù)組芦昔,是對象則創(chuàng)建空對象
        for (var item in obj) {
            var temple = typeof obj[item] == 'object'? deepClone(obj[item]): obj[item]; // 判斷對象內(nèi)元素是不是對象,是對象則再調(diào)用一次deepClone
            newObj[item] = temple;
        }
        return newObj;
    }

19. JS監(jiān)聽對象屬性的變化
假設(shè)有一個user對象:
(1) 在ES5中可以通過Object.defineProperty來實現(xiàn)已有屬性的監(jiān)聽

Object.defineProperty(user,'name',{
set:function(key,value){
}
})

缺點:如果name不在user對象中娃肿,則不能監(jiān)聽其變化(即 強調(diào)是已有屬性)
(2) 在ES6中可以通過Proxy來實現(xiàn)

var  user = new Proxy({}咕缎,{
set:function(target,key,value,receiver){
}
})

這樣即使有屬性在user中不存在,通過user.id來定義也可以監(jiān)聽這個屬性的變化料扰。
20. 實現(xiàn)一個私有變量凭豪,用getName方法可以訪問,不能直接訪問
通過函數(shù)的創(chuàng)建形式:

    function product() {
        var name = 'Novis';
        this.getName = function () {
            return name;
        };
    }
    var obj = new product();

21. ==晒杈、===以及Object.is的區(qū)別
(1) ==
存在隱式類型轉(zhuǎn)換

    " "==0; //true
    "0"==0; //true
    " " !="0"; //true
    123=="123"; //true
    null==undefined; //true

(2) ===
不存在類型轉(zhuǎn)換嫂伞,因此對比時會將類型也包括在內(nèi):"2" === 2 // false
(3) Object.is
判斷兩個值是否相同:Object(value1, value2)返回值:表示兩個參數(shù)是否相同的布爾值。比較類似與===拯钻,但還是有一些不同帖努,比===有了些許改進(jìn)。比如:

// 使用 ‘===’
+0 === -0 //true
NaN === NaN // false
// 使用 Object.is()
Object.is(+0, -0) // false
Object.is(NaN, NaN) // true

22. JS怎么控制一次加載一張圖片粪般,加載完后再加載下一張
新建Image對象拼余,利用onload屬性來動態(tài)加載圖片。

    var obj = new Image();
    obj.src = "http://www.phpernote.com/uploadfiles/editor/201107240502201179.jpg";
    obj.onload = function () {
        alert('圖片的寬度為:' + obj.width + ' 圖片的高度為' + obj.height);
        document.getElementById('mypic').innerHTML="<img src='"+this.src+"' />";
    }

23. 重排(reflow)和重繪(repaint)
重排:當(dāng)渲染樹中的一部分(或全部)因為元素的規(guī)模尺寸亩歹,布局匙监,隱藏等改變而需要重新構(gòu)建寡润,這就稱為回流(reflow)。每個頁面至少需要一次回流舅柜,就是在頁面第一次加載的時候。
重繪:當(dāng)盒子的位置躲惰、大小以及其他屬性致份,例如顏色、字體大小等都確定下來之后础拨,瀏覽器便把這些原色都按照各自的特性繪制一遍氮块,將內(nèi)容呈現(xiàn)在頁面上。重繪是指一個元素外觀的改變所觸發(fā)的瀏覽器行為诡宗,瀏覽器會根據(jù)元素的新屬性重新繪制滔蝉,使元素呈現(xiàn)新的外觀。
觸發(fā)重繪的條件:改變元素的外觀屬性塔沃,如color蝠引、background-color等。
注意:table及其內(nèi)部元素可能需要多次計算才能確定好其在渲染樹中節(jié)點的屬性值蛀柴,比同等元素要多花費時間螃概,這就是我們盡量避免使用table布局頁面的原因之一。
重繪和重排的關(guān)系:在重排(回流)的時候鸽疾,瀏覽器會使渲染樹中受到影響的部分失效吊洼,并重新構(gòu)造這部分渲染樹,完成回流制肮,瀏覽器會重新繪制受影響的部分到屏幕中冒窍,該過程即為重繪。所以重排必定會引發(fā)重繪豺鼻,但重繪不一定會引發(fā)重排综液。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市儒飒,隨后出現(xiàn)的幾起案子意乓,更是在濱河造成了極大的恐慌,老刑警劉巖约素,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件届良,死亡現(xiàn)場離奇詭異,居然都是意外死亡圣猎,警方通過查閱死者的電腦和手機士葫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來送悔,“玉大人慢显,你說我怎么就攤上這事爪模。” “怎么了荚藻?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵屋灌,是天一觀的道長。 經(jīng)常有香客問我应狱,道長共郭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任疾呻,我火速辦了婚禮除嘹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘岸蜗。我一直安慰自己尉咕,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布璃岳。 她就那樣靜靜地躺著年缎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铃慷。 梳的紋絲不亂的頭發(fā)上晦款,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音枚冗,去河邊找鬼缓溅。 笑死,一個胖子當(dāng)著我的面吹牛赁温,可吹牛的內(nèi)容都是我干的坛怪。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼股囊,長吁一口氣:“原來是場噩夢啊……” “哼袜匿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起稚疹,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤灵妨,失蹤者是張志新(化名)和其女友劉穎雷滋,沒想到半個月后屁柏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唤蔗,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年柳沙,在試婚紗的時候發(fā)現(xiàn)自己被綠了岩灭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡赂鲤,死狀恐怖噪径,靈堂內(nèi)的尸體忽然破棺而出柱恤,到底是詐尸還是另有隱情,我是刑警寧澤找爱,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布梗顺,位于F島的核電站,受9級特大地震影響车摄,放射性物質(zhì)發(fā)生泄漏寺谤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一练般、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锈候,春花似錦薄料、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至获列,卻和暖如春谷市,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背击孩。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工迫悠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人巩梢。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓创泄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親括蝠。 傳聞我的和親對象是個殘疾皇子鞠抑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348