Web大前端天天5道面試題

1.apply, call和bind有什麼區別?
複製代碼
三者均可以把一個函數應用到其餘對象上,注意不是自身對象.
apply,call是直接執行函數調用,bind是綁定,執行須要再次調用.
apply和call的區別是apply接受數組做爲參數,而call是接受逗號分隔的無限多個參數列表.

代碼以下:
    function Person() {
    }
    Person.prototype.sayName() { alert(this.name); }

    var obj = {name: 'michaelqin'}; // 注意這是一個普通對象,它不是Person的實例
    1) apply
    Person.prototype.sayName.apply(obj, [param1, param2, param3]);

    2) call
    Person.prototype.sayName.call(obj, param1, param2, param3);

    3) bind
    var liaoke = Person.prototype.sayName.bind(obj);    
    liaoke ([param1, param2, param3]); // bind須要先綁定,再執行 
    liaoke (param1, param2, param3); // bind須要先綁定,再執行
複製代碼
 

2.defineProperty, hasOwnProperty, isEnumerable都是作什麼用的?
Object.defineProperty(obj, prop, descriptor)用來給對象定義屬性,
有value,writable,configurable,enumerable,set/get等.hasOwnProerty用於檢查某一屬性是否是存在於對象自己,繼承來的父親的屬性不算.
isEnumerable用來檢測某一屬性是否可遍歷,也就是能不能用for..in循環來取到.
 

3. js經常使用設計模式的實現思路,單例,工廠,代理,裝飾,觀察者模式等?
複製代碼
 1) 單例: 任意對象都是單例,無須特別處理
    var obj = {name: 'michaelqin', age: 30};

 2) 工廠: 就是一樣形式參數返回不一樣的實例
    function Person() { this.name = 'Person1'; }
    function Animal() { this.name = 'Animal1'; }

    function Factory() {}
    Factory.prototype.getInstance = function(className) {
        return eval('new ' + className + '()');
    }

    var factory = new Factory();
    var obj1 = factory.getInstance('Person');
    var obj2 = factory.getInstance('Animal');
    console.log(obj1.name); // Person1
    console.log(obj2.name); // Animal1

 3) 代理: 就是新建個類調用老類的接口,包一下
    function Person() { }
    Person.prototype.sayName = function() { console.log('michaelqin'); }
    Person.prototype.sayAge = function() { console.log(30); }

    function PersonProxy() { 
        this.person = new Person();
        var that = this;
        this.callMethod = function(functionName) {
            console.log('before proxy:', functionName);
            that.person[functionName](); // 代理
            console.log('after proxy:', functionName);
        }
    }

    var pp = new PersonProxy();
    pp.callMethod('sayName'); // 代理調用Person的方法sayName()
    pp.callMethod('sayAge'); // 代理調用Person的方法sayAge() 

 4) 觀察者: 就是事件模式,好比按鈕的onclick這樣的應用.
    function Publisher() {
        this.listeners = [];
    }
    Publisher.prototype = {
        'addListener': function(listener) {
            this.listeners.push(listener);
        },

        'removeListener': function(listener) {
            delete this.listeners[listener];
        },

        'notify': function(obj) {
            for(var i = 0; i < this.listeners.length; i++) {
                var listener = this.listeners[i];
                if (typeof listener !== 'undefined') {
                    listener.process(obj);
                }
            }
        }
    }; // 發佈者

    function Subscriber() {

    }
    Subscriber.prototype = {
        'process': function(obj) {
            console.log(obj);
        }
    }; // 訂閱者

    var publisher = new Publisher();
    publisher.addListener(new Subscriber());
    publisher.addListener(new Subscriber());
    publisher.notify({name: 'michaelqin', ageo: 30}); // 發佈一個對象到全部訂閱者
    publisher.notify('2 subscribers will both perform process'); // 發佈一個字符串到全部訂閱者
複製代碼
 

4.promise只有2個狀態,成功和失敗,怎麼讓一個函數不管成功仍是失敗都能被調用?
複製代碼
使用promise.all()

Promise.all方法用於將多個Promise實例,包裝成一個新的Promise實例。

Promise.all方法接受一個數組做爲參數,數組裏的元素都是Promise對象的實例,
若是不是,就會先調用下面講到的Promise.resolve方法,將參數轉爲Promise實例,再進一步處理。
(Promise.all方法的參數能夠不是數組,但必須具備Iterator接口,且返回的每一個成員都是Promise實例。)

示例:
var p =Promise.all([p1,p2,p3]);
p的狀態由p一、p二、p3決定,分爲兩種狀況。
當該數組裏的全部Promise實例都進入Fulfilled狀態:Promise.all**返回的實例纔會變成Fulfilled狀態。
並將Promise實例數組的全部返回值組成一個數組,傳遞給Promise.all返回實例的回調函數**。

當該數組裏的某個Promise實例都進入Rejected狀態:
Promise.all返回的實例會當即變成Rejected狀態。
並將第一個rejected的實例返回值傳遞給Promise.all返回實例的回調函數。
複製代碼
 

5.說說字符串經常使用的十個函數?
複製代碼
charAt() 返回在指定位置的字符。
concat() 鏈接字符串。
fromCharCode() 從字符編碼建立一個字符串。
indexOf() 檢索字符串。
match() 找到一個或多個正則表達式的匹配。
replace() 替換與正則表達式匹配的子串。
search() 檢索與正則表達式相匹配的值。
slice() 提取字符串的片段,並在新的字符串中返回被提取的部分。
split() 把字符串分割爲字符串數組。
substr() 從起始索引號提取字符串中指定數目的字符。
substring() 提取字符串中兩個指定的索引號之間的字符。
toLocaleLowerCase() 把字符串轉換爲小寫。
toLocaleUpperCase() 把字符串轉換爲大寫。
toLowerCase() 把字符串轉換爲小寫。
toUpperCase() 把字符串轉換爲大寫。
toString() 返回字符串。
valueOf() 返回某個字符串對象的原始值。
相關文章
相關標籤/搜索