一些常見面試題

遞歸實現階乘

function factorial(a) {
    if (a == 1) {
        return 1;
    }
    return a * factorial(a - 1);
}
var res = factorial(3);
console.log(res);

實現 add(2)(3) add(2, 3) 都可以求出結果5的add函數()

function add(a, b) {
    if (b != undefined) {
        return a + b;
    }
    return function (c) {
        return a + c;
    }
}
console.log(add(2)(3));
console.log(add(2, 3));

提供數組[5, 2, 1, 38],獲得結果字符串"53821"

var arr = [5, 1, 2, 38];
var str = arr.sort().reverse().join('')
console.log(str);
Array(2).join(); // ,
Array(3).join(); // ,,
Array(2, 3).join(); // 2,3
const a = (x) => x + 1;
const b = (x) => x * 2;
const c = (x) => x * x;

// const compose = (...fns) => (x) => fns.reduce((accumulate, fn) => fn(accumulate), x);

const compose = (...fns) => { // fns = [a, b, c]

    return (x) => { // x = 4

        return fns.reduce((accumulate, fn) => { // return 100
            // 4   x + 1
            // 5   x * 2
            // 10  x * x
            return fn(accumulate)
        }, x) // x = 4
    }
}

const composedFn = compose(a, b, c);
const result = composedFn(4);
console.log(result);

1~9隨機組合,可以組成三位數,每個數字智能使用一次,例如a=198 b = 243 c=567,這樣的組合有很多,請編程找出所有這些組中中,滿足a=b*2,b=c*2。(只寫程序,不必給出結果),并寫出算法復雜度


  1. Promise與bind與箭頭函數的問題?

    class Foo {
        constructor (name) {
            this.name = name
        }
        greet () {
            console.log('hello, this is ', this.name)
        }
        someThingAsync () {
            return Promise.resolve()
        }
        asyncGreet () {
            this.someThingAsync().then(this.greet)
    
            // bind綁定
            // this.someThingAsync().then(this.greet.bind(this))
    
            // 使用箭頭函數
            // this.someThingAsync().then(() => this.greet())
        }
    }
    new Foo('dog').asyncGreet()
    
  2. 作用域問題

    var arr = [];
    for (var i = 0; i < 10; i++) {
        arr.push(function () {
            console.log(i);
        })
    }
    
    arr[0]();
    arr[1]();
    arr[2]();
    // 解決辦法 let
    // 使用bind實現 console.log.bind(null, this)
    
  3. 排序算法:冒泡排序、快速排序

    ?

  4. 如何判斷一個對象的類型

    Object.prototype.type = function () {
        // 使用Object原型上的方法,將對象轉為字符串
        var res = Object.prototype.toString.call(this);
        // 從第8位開始截取,然后刪除最后一位
        res = res.substring(8).slice(0, -1);
        // 返回結果
        return res;
    };
    
  5. 閉包的使用,構造函數內部變量私有化

const Person = function (name) {
    this.name = name;
    let gender = 'F';
    function genderFunc() {
        return gender;
    }
    this.gender = genderFunc();
}

var p = new Person('xiaoming');
console.log(p.gender);
  1. 使用new關鍵字構建對象的本質?
function Person(name) {
    this.name = name;
}
var p = new Person('xiaoming');
console.log(p);
// 代碼解析
function Person(name) {
 // 1. 創建對象,并賦值給this
 this = {};
 // 2. 修改constructor
 this.constructor = Person;
 // 3. 設置屬性
 this.name = name;
 // 4. 返回this
 return this;
}
  1. new關鍵字寫與不寫都可以構建對象,如何實現該構造函數?

    function Person(name, age) {
        // 判斷this是否為當前的構造函數
        if (!(this instanceof Person)) {
            return new Person(name, age);
        }
        this.name = name;
        this.age = age;
    }
    
    var p1 = new Person('xiaoming', 19);
    var p2 = Person('xiaoming', 20);
    
    console.log('-------------');
    console.log(p1);
    console.log(p2);
    
  2. 寫出結果:

    alert(1 && 2); // 
    alert(1 || 2); // 
    
  3. 寫出結果:

    var obj = {
        a: 1,
        b: function () {
            console.log(this.a)
        }
    };
    
    var a = 2;
    var objb = obj.b;
    
    obj.b(); // 1
    objb(); // 2
    obj.b.call(window); // 2
    
  4. 寫出結果:

    function A() {
    
    }
    function B(a) {
        this.a = a;
    }
    function C(a) {
        if (a) {
            this.a = a;
        }
    }
    
    A.prototype.a = 1;
    B.prototype.a = 1;
    C.prototype.a = 1;
    
    console.log(new A()); // 原型上面有a = 1
    console.log(new B()); // 自身和原型上都有a 自身 a = undefined  原型 a = 1
    console.log(new C(2)); // 自身和原型上都有a 自身 a = 2 原型 a = 1
    
  5. 寫出結果:

    var a = 1;
    function b() {
        var a = 2;
        function c() {
            console.log(a);
        }
        return c;
    }
    
    b()(); // 2
    var res = b();
    res(); // 2
    

    閉包,內層函數持有外層函數的變量,即便在外部調用,也會使用內部的a

  6. 解釋下作用域鏈?

    當執行一段JavaScript代碼(全局代碼或函數)時,JavaScript引擎會創建為其創建一個作用域又稱為執行上下文(Execution Context),在頁面加載后會首先創建一個全局的作用域,然后每執行一個函數,會建立一個對應的作用域,從而形成了一條作用域鏈。每個作用域都有一條對應的作用域鏈,鏈頭是全局作用域,鏈尾是當前函數作用域。
    
    作用域鏈的作用是用于解析標識符,當函數被創建時(不是執行),會將this、arguments、命名參數和該函數中的所有局部變量添加到該當前作用域中,當JavaScript需要查找變量X的時候(這個過程稱為變量解析),它首先會從作用域鏈中的鏈尾也就是當前作用域進行查找是否有X屬性,如果沒有找到就順著作用域鏈繼續查找,直到查找到鏈頭,也就是全局作用域鏈,仍未找到該變量的話,就認為這段代碼的作用域鏈上不存在x變量,并拋出一個引用錯誤(ReferenceError)的異常。
    
  7. AJAX并發問題?

    
    
  8. 解釋下原型鏈?

    JavaScript中的每個對象都有一個prototype屬性,我們稱之為原型,而原型的值也是一個對象,因此它也有自己的原型,這樣就串聯起來了一條原型鏈,原型鏈的鏈頭是object,它的prototype比較特殊,值為null。
    
    原型鏈的作用是用于對象繼承,函數A的原型屬性(prototype property)是一個對象,當這個函數被用作構造函數來創建實例時,該函數的原型屬性將被作為原型賦值給所有對象實例,比如我們新建一個數組,數組的方法便從數組的原型上繼承而來。
    
    當訪問對象的一個屬性時, 首先查找對象本身, 找到則返回; 若未找到, 則繼續查找其原型對象的屬性(如果還找不到實際上還會沿著原型鏈向上查找, 直至到根). 只要沒有被覆蓋的話, 對象原型的屬性就能在所有的實例中找到,若整個原型鏈未找到則返回undefined;
    
  9. body中的onload()函數和jQuery中的document.ready()有什么區別?

    1、我們可以在頁面中使用多個document.ready(),但只能使用一次onload()。
    2、document.ready()函數在頁面DOM元素加載完以后就會被調用,而onload()函數則要在所有的關聯資源(包括圖像、音頻)加載完畢后才會調用。
    
  10. 什么情況下會遇到內存泄露?如何解決?

    內存泄漏指任何對象在您不再擁有或需要它之后仍然存在。
    
    setTimeout 的第一個參數使用字符串而非函數的話,會引發內存泄漏
    閉包、控制臺日志、循環(在兩個對象彼此引用且彼此保留時,就會產生一個循環)
    

    ?

    ?

    ?

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

推薦閱讀更多精彩內容

  • 工廠模式類似于現實生活中的工廠可以產生大量相似的商品,去做同樣的事情,實現同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 7,796評論 2 17
  • 單例模式 適用場景:可能會在場景中使用到對象,但只有一個實例,加載時并不主動創建,需要時才創建 最常見的單例模式,...
    Obeing閱讀 2,085評論 1 10
  • var a = 1; console.log(typeof a);// 'number' var b = '1';...
    zdnexus閱讀 333評論 0 0
  • 繼承 一、混入式繼承 二、原型繼承 利用原型中的成員可以被和其相關的對象共享這一特性,可以實現繼承,這種實現繼承的...
    magic_pill閱讀 1,071評論 0 3
  • 寒假時畫了許多家人的小像,當然不是全部家人,只是能見上面取得照片的。 一直就想,會畫畫了得先給家里人畫,哪知一天推...
    解小花XIE閱讀 4,128評論 9 33