說明:剛經歷過面試不久,之前總是不總結的我,這回總結一下我常常遇到的面試題,留個回憶~
這裏只是作個簡單的介紹,給本身提個醒,根據面試題延伸出本身須要補哪一塊的知識。
下面,開始個人表演html
本地對象和單體內置對象統稱爲「內置對象」前端
undefined/number/string/boolean/object/functionvue
typeof undefined // undefined typeof 'abc' // string typeof 123 // number typeof true // Boolean typeof {} // object typeof [] // object typeof null // object typeof console.log // function
if (obj.a == null) { // 這裏至關於obj.a === null || obj.a === undefined的簡寫形式 // jquery源碼推薦寫法 }
除了這個,其餘一概使用全等.java
值類型
把數值分塊存儲在內存中,存儲在棧內存中node
引用類型
存儲在堆內存,變量只存了變量名和指針(用於找到堆內存的位置)jquery
JSON只不過是一個JS對象,也是一種數據格式webpack
JSON.stringify({a: 10, b: 20}) JSON.parse("{"a": 10, "b": 20}")
數據格式:簡單值,對象,數組ios
JSON跟對象字面量的寫法很像,JSON屬性必須加雙引號。git
簡單判斷:es6
var arr = []; arr instanceof Array // true typeof arr // object。 typeof 是沒法判斷是不是數組
更準確的判斷:
function isArray(value) { return Object.prototype.toString.call(value) === '[object Array]'; } isArray([1, 2, 3]);
function Elem(id) { this.elem = document.getElementById(id) } Elem.prototype.html = function(val) { var elem = this.elem; if (val) { elem.innerHtml = val; return this; // 鏈式調用 } else { return elem.innerHtml; } } Elem.prototype.on = function(type, fn){ var elem = this.elem; elem.addEventListener(type, fn); return this; } var div1 = new Elem('div1'); div1.html('<p>顯示出來了</p>').on('click', function() { console.log('ok'); }).html('<p>kaopu</p>')
變量定義和函數聲明(函數表達式)都會被提到前面,即變量提高。
單線程:只有一個線程,同一時間只能作一件事,兩段JS不能同時執行
緣由:避免DOM渲染的衝突
解決方案:異步算是一種「無奈」的解決方案,雖然有不少問題
異步是單線程的解決方案
避免DOM渲染的衝突:
異步存在的兩個問題:
實現方式:event loop
使用異步的場景
總結當前異步的解決方案
同步和異步的區別
同步會阻塞代碼執行,而異步不會
alert是同步,setTimeout是異步
property只是一個js對象的屬性修改,它們會在初始化的時候再DOM對象上建立。
Attribute是對html標籤屬性的修改,attributes是屬於property的一個子集。
cookie: 自己用於客戶端和服務器端通訊,可是它有本地存儲的功能,因而就被「借用」,使用document.cookie = … 獲取和修改便可。
缺點:存儲量過小,只有4kb,全部http請求都帶着,會影響獲取資源的效率,API簡單,須要封裝才能用。
sessionStorage, localStorage:HTML5專門爲存儲而設計,最大容量5M,API簡單易用: localStorage.setItem(key, value) localStorage.getItem(key)
localStorage在IOS safari隱藏模式下,localStorage.getItem會報錯
sessionStorage關閉瀏覽器後數據也會跟着清掉,而localStorage不會。
區別:容量,是否會攜帶到ajax中,API易用性
${}
首先從名字來看,MVVM即Model, View ViewModel,Model對應的是data數據部分,View對應的是html視圖部分,ViewModel對應的是new Vue實例部分,View經過事件綁定的方式影響到Model,Model經過數據綁定影響到View。
對ViewModel的理解:鏈接器,用於鏈接View和Model
MVVM不是一個從零開始的創新,是由以前的MVC發展過來的,由於MVC是應用到後端的,並非前端的,爲了適用前端的場景,把C換成了VM
MVVM實現的三要素也是vue的三要素:
方法一: let arr = [6, 8, 9, 9, 12, 13, 14, 1, 3]; function removeArr(arr) { let arrayResult = []; for (let i = 0, len = arr.length; i < len; i++) { if (arrayResult.indexOf(arr[i]) === -1) { arrayResult.push(arr[i]); } } return arrayResult; } removeArr(arr);
方法二: var arr = [6, 8, 9, 9, 12, 13, 14, 1, 3]; function removeArr(arr) { var i = 0, len = arr.length, j; for (i; i < len; i++) { for (j= i+1; j < len; j++) { if(arr[i] == arr[j]) { arr.splice(j, 1); j--; } } } return arr; } removeArr(arr);
方法三: let arr = [6, 8, 9, 9, 12, 13, 14, 1, 3]; function removeArr(arr) { return Array.from(new Set(arr)) } removeArr(arr);
方法四: let arr = [6, 8, 9, 9, 12, 13, 14, 1, 3]; function removeArr(arr) { let arrayResult = []; arr.reduce((s1, s2) => { if(s1 !== s2) { arrayResult.push(s1); } return s2 }); arrayResult.push(arr[arr.length-1]) return arrayResult; } removeArr(arr);
fetch:
號稱是AJAX的替代品.。
優點:
缺點:
beforeCreate和created在vue實例化的時候就執行了,此處可請求數據,可是不能進行dom操做,由於拿不到組件對應的dom節點,以下圖。
給實例賦值最先要在created裏面操做。
beforeMount和mounted這裏是把組件生成的html內容掛在到dom上面的一個過程,若是不指定el或者是$mount()的話,數據是不會掛在到頁面上的,由於它不知道該掛載到哪裏去。因此dom應該在mounted這裏纔去操做。
beforeMount()是渲染前的,mounted()是經過render函數渲染後拿到的,mounted以後實例就建立完成了.
說明:上述4個鉤子都是隻會被調用一次。beforeMount和mounted在服務端渲染的時候不會被調用。服務端渲染的時候會調用的只有beforeCreate和created。
在.vue文件裏開發的過程當中,是都沒有template的,在.vue裏面寫的template都通過vue-loader處理直接變成了render函數放在vue-loader解析過的文件裏面。
beforeUpdate和updated是有數據更新的時候纔會去執行的。
beforeDestroy和destroyed組件被銷燬的時候纔會去執行。
$destroy() // 組件銷燬的一個方法,解除全部的事件監聽和全部的watch。
activated和deactivated和keep-alive有關係,該鉤子在服務器端渲染期間不被調用。activated是在keep-alive 組件激活時調用。
deactivated在keep-alive 組件停用時調用。
render(h)和renderError(),有render的時候就不須要template了,由於template處理後最終也是變成render函數的返回vnode的,renderError是在render報錯以後纔會觸發,報錯以後渲染出來的就是報錯的信息,只有在本組件的render函數出現錯誤的時候纔會被調用,只關心本身有沒有渲染成功,無論子組件。
errorCaptured() 正式環境可使用,收集線上環境的一些錯誤。全部子組件的錯誤均可以捕捉到,除非子組件把冒泡事件中止掉。