今年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根元素。
