58同城2018提前批前端筆試題總結


今年58同城的題目出的不深,大多是考點基本概念,范圍比較廣。

有一點值得注意的是,58的筆試不支持在線編譯,代碼靠手寫。所以平時練習的時候要多重視手寫代碼的能力,因為編輯器編寫和手寫還是有很大區別的,面試也有很大概率讓你手寫代碼。

題型:10道填空,5個問答,2個應用,一道編程。

1.編程題

實現對象的深復制deepclone函數。

//利用 遞歸 來實現深復制,對屬性中所有引用類型的值,遍歷到是基本類型的值為止。
function deepclone(src){
    if(!src && typeof src !== 'object'){
        return;
    }
    var dst = src.constructor === Array ? []:{};
    for(key in src){
        if(src.hasOwnProperty(key)){
            if(src[key] && typeof src[key] === 'object'){
                dst[key] = src[key].constructor === Array ? []:{};
                dst[key] = deepclone(src[key]);
            }else{
                dst[key] = src[key];
            }
        }
    }
    return dst;
}
var a = {
    name : 'orange',
    age : '24',
    arr : [1,2,3,{a:2, b:'hello'},[4,5]],
    clone: function(){
        console.log('helloworld');
    }
}
a.clone(); //helloworld
console.log(typeof a.clone);  //function
console.log(deepclone(a));
// { name: 'orange',
//   age: '24',
//   arr: [ 1, 2, 3, { a: 2, b: 'hello' }, [ 4, 5 ] ],
//   clone: [Function: clone] }

2.應用題

(1)判斷一個字符串是不是回文串

//判斷是否是回文串
function isPalindrome(str) {
    str = str.replace(/\W/g, '').toLowerCase();
    return (str == str.split('').reverse().join(''));
}

(2)定義一個含10個隨機數的數組,並去重

var arr = [];
for(var i=0; i<100; i++){
    var num = parseInt(Math.random()*100);
    arr[i] = num;
}
function unique(arr){
    var newArr = [];
    for(var i=0; i<arr.length; i++){
        if(newArr.indexOf(arr[i]) == -1){
            newArr.push(arr[i]);
        }
    }
    return newArr;
}
console.log(arr);
console.log(unique(arr));

3.問答題

(1)prototype和_proto_的原理和區別

_proto_是每個對象都有的一個屬性,而prototype是函數才會有的屬性。

在JS里,萬物皆對象。方法(Function)是對象,方法的原型(Function.prototype)是對象。因此,它們都會具有對象共有的特點。

對象具有屬性__proto__,可稱為隱式原型,一個對象的隱式原型指向構造該對象的構造函數的原型,這也保證了實例能夠訪問在構造函數原型中定義的屬性和方法。

方法這個特殊的對象,除了和其他對象一樣有上述_proto_屬性之外,還有自己特有的屬性——原型屬性(prototype),這個屬性是一個指針,指向一個對象,這個對象的用途就是包含所有實例共享的屬性和方法(我們把這個對象叫做原型對象)。原型對象也有一個屬性,叫做constructor,這個屬性包含了一個指針,指回原構造函數。

總結:
1.對象有屬性__proto__,指向該對象的構造函數的原型對象。
2.方法除了有屬性__proto__,還有屬性prototype,prototype指向該方法的原型對象。

(2)事件捕獲和冒泡應該如何管理?怎么阻止?

addEventListener      false:事件冒泡  true:事件捕獲

//阻止事件冒泡
function stopBubble(event){
    if(window.event){//兼容IE
        window.event.cancelBubble=true;
    }else{
        event.stopPropagation();
    }
}

//阻止默認事件
function stopDefaultEvent(event){
    if(window.event){//兼容IE
        window.event.returnValue=false;
    }else{
        event.preventDefault()
    }
    return false;
}

(3)閉包的原理和應用

當函數可以記住並訪問所在的詞法作用域時就產生了閉包,即使函數是在當前詞法作用域之外執行。

//手寫一個閉包
function outer(){
    var a = 2;
    function inner(){
        console.log(a);
    }
    return inner;
}
var result = outer();//result引用內部函數outer
result(); //2

閉包的特點:函數嵌套函數、內部函數可以引用外部函數的參數和變量(詞法作用域)、參數和變量不會被垃圾回收機制收回

好處:希望一個變量長期駐扎在內存中、避免全局變量的污染、私有成員的存在

應用:閉包通常用來創建內部變量,使得這些變量不能被外部隨意修改,同時又可以通過指定的函數接口來操作。 代碼封裝、模塊化

(4)js的異步編程方法

回調函數、promise對象、事件監聽、發布/訂閱     Javascript異步編程的4種方法

(5)react的setState是同步還是異步?執行setState之后發生了什么?

4.填空題

(1)3+true = 4

(2)http協議的前端緩存的四種方法

(3)Node.js的核心模塊   nodejs常用核心模塊介紹

HTTP模塊:處理客戶端的網絡請求

URL模塊:處理客戶端請求過來的URL

Query Strings模塊:處理客戶端通過`get/post`請求傳遞過來的參數

File System模塊:在服務端來操作文件,可能是需要將瀏覽器上傳的圖片保存到服務器,也可能是需要將服務器的資源讀取之后返回給瀏覽器

Path模塊:操作文件的路徑,為文件操作服務

Global模塊:全局共享的,不需要導入模塊即可以使用

(4)html5的本地存儲     cookie、localStorage、sessionStorage

(5)寫出四種設計模式   工廠模式、單例模式、觀察者模式、原型模式        設計模式

(6)css中的單位 rem和em分別相對於什么?

px像素(Pixel)。相對長度單位。像素px是相對於顯示器屏幕分辨率而言的。

em是相對長度單位。相對於當前對象內文本的字體尺寸。如當前對行內文本的字體尺寸未被人為設置,則相對於瀏覽器的默認字體尺寸。

rem為元素設定字體大小時,仍然是相對大小,但相對的只是HTML根元素

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM