持續更新直到找到合適工做爲止!-_-!javascript
日期:20180420css
前端性能優化這個問題能夠回答的比較多,我本身的答案:
前端性能優化能夠從:html
減小HTTP請求的數量:前端
不詳細贅述了vue
圖片預加載的主要思路: 圖片預加載的主要思路就是把稍後須要用到的圖片悄悄的提早加載到本地,由於瀏覽器有緩存的緣由,若是稍後用到這個url的圖片了,瀏覽器會優先從本地緩存找該url對應的圖片,若是圖片沒過時的話,就使用這個圖片。html5
圖片預加載實現的方法:java
Image對象是專門用於處理圖片加載的,就至關於內存中的img標籤。react
參考: 圖片預加載的方法git
使用XMLHttpRequest對象:建立XHR對象、配置header、發送請求!經過設置回調來接受服務器響應!面試
Promise的優勢:
若是咱們組合使用Promise,就能夠把不少異步任務以並行和串行的方式組合起來執行。
ES5: 函數做用域(局部)和全局做用域
ES6: 多出了一個塊級做用域,也就是{}花括號裏聲明的單獨的做用域
使用原型繼承的方式實現類!
淺拷貝: 將原對象或原數組的引用直接賦給新對象,新數組,新對象/數組只是原對象的一個引用
深拷貝: 建立一個新的對象和數組,將原對象的各項屬性的「值」(數組的全部元素)拷貝過來,是「值」而不是「引用」
深拷貝對象(不討論數組的狀況):
參考:https://www.cnblogs.com/pengh...
stringObject.substr(start,length):在字符串中抽取從 start 下標開始的指定數目的字符 stringObject.substring(start,stop): 用於提取字符串中介於兩個指定下標之間的字符
沒用過,從預編譯語言的優勢回答的
使用的優勢:
缺點:
同源指的是:URL由協議、域名、端口和路徑組成,若是兩個URL的協議、域名和端口相同,則表示他們同源。
同源策略:瀏覽器的同源策略,限制了來自不一樣源的"document"或腳本,對當前"document"讀取或設置某些屬性(可是容許當前源執行其餘源的腳本)
前端跨域實現方式:
服務端跨域實現方式:
this值在四種狀況下:
CommonJs: 模塊的加載方式是同步的(服務器端模塊加載)
AMD: 異步方式加載模塊,模塊的加載不影響它後面語句的運行。全部依賴這個模塊的語句,都定義在一個回調函數中,等到加載完成以後,這個回調函數纔會運行。(瀏覽器端模塊加載) AMD的方式比較適合瀏覽器(require.js 遵循的是AMD規範實現的模塊加載)
CMD: CMD至關於按需加載,定義一個模塊的時候不須要當即制定依賴模塊,在須要的時候require就能夠了,比較方便;而AMD則相反,定義模塊的時候須要制定依賴模塊,並以形參的方式引入factory中
AMD 與 CMD 的區別:
一樣都是異步加載模塊,AMD在加載模塊完成後就會執行改模塊,全部模塊都加載執行完後會進入require的回調函數,執行主邏輯,這樣的效果就是依賴模塊的執行順序和書寫順序不必定一致,看網絡速度,哪一個先下載下來,哪一個先執行,可是主邏輯必定在全部依賴加載完成後才執行
CMD加載完某個依賴模塊後並不執行,只是下載而已,在全部依賴模塊加載完成後進入主邏輯,遇到require語句的時候才執行對應的模塊,這樣模塊的執行順序和書寫順序是徹底一致的
這也是不少人說AMD用戶體驗好,由於沒有延遲,依賴模塊提早執行了,CMD性能好,由於只有用戶須要的時候才執行的緣由
require.js 遵循AMD規範,主要爲了解決下面兩個問題:
參考: http://www.ruanyifeng.com/blo... https://www.jianshu.com/p/042...
這道題的代碼具體不清了,考查的是數組相似下面這樣
var a = [,1], b = [,1,,1], c = [1,]; console.log(a.length); console.log(b.length); console.log(c.length);
打印: 2 2 1
A eval
B parseFloat
C setTimeout
D alert
E enscape
答案: ABCDE
A var a = () B var b = {} C var c = [] D var d =
答案: A
A JSONP
B script 標籤
C iframe 和 location.hash
D flash
E postMessage
答案: ABCDE
參考:http://www.cnblogs.com/rainma...
var foo = 1; function(){ console.log(foo); var foo = 2; console.log(foo); }
輸出undefined 和 2
console.log(1 && 2);
輸出: 2
console.log(1+"2"+"2"); console.log(1+ +"2"+"2"); console.log(1+ -"1"+2); console.log(1+ -"1"+"2"); console.log(+"1"+2); console.log(1+ "2"); console.log("A"-"B"+"2"); console.log("A"-"B"+2);
輸出: 122 32 2 02 3 12 NaN2 NaN
頁面插入DOM會引發迴流和重繪。儘可能減小回流和重繪的次數爲主要思路。
參考: http://developer.51cto.com/ar...
主要從四個方面來回答:
區別:
淺拷貝: 將原對象或原數組的引用直接賦給新對象,新數組,新對象/數組只是原對象的一個引用
深拷貝: 建立一個新的對象和數組,將原對象的各項屬性的「值」(數組的全部元素)拷貝過來,是「值」而不是「引用」
深拷貝對象(不討論數組的狀況):
爲何須要深拷貝: 個人回答是 咱們拷貝的初衷是,建立一個新對象,該新對象擁有原有對象的全部屬性和方法。若是淺拷貝,那原對象改變,表面上看就是咱們拷貝的對象也變了。
方法:
/* * 給傳入數組排序,排序後相同值相鄰, * 而後遍歷時,新數組只加入不與前一值重複的值。 * 會打亂原來數組的順序 * */ function uniq(array){ array.sort(); var temp=[array[0]]; for(var i = 1; i < array.length; i++){ if( array[i] !== temp[temp.length-1]){ temp.push(array[i]); } } return temp; } var aa = [1,2,"2",4,9,"a","a",2,3,5,6,5]; console.log(uniq(aa));
/* * * 仍是得調用「indexOf」性能跟方法1差很少, * 實現思路:若是當前數組的第i項在當前數組中第一次出現的位置不是i, * 那麼表示第i項是重複的,忽略掉。不然存入結果數組。 * */ function uniq(array){ var temp = []; for(var i = 0; i < array.length; i++) { //若是當前數組的第i項在當前數組中第一次出現的位置是i,才存入數組;不然表明是重複的 if(array.indexOf(array[i]) == i){ temp.push(array[i]) } } return temp; } var aa = [1,2,"2",4,9,"a","a",2,3,5,6,5]; console.log(uniq(aa));
// 思路:獲取沒重複的最右一值放入新數組 /* * 推薦的方法 * * 方法的實現代碼至關酷炫, * 實現思路:獲取沒重複的最右一值放入新數組。 * (檢測到有重複值時終止當前循環同時進入頂層循環的下一輪判斷)*/ function uniq(array){ var temp = []; var index = []; var l = array.length; for(var i = 0; i < l; i++) { for(var j = i + 1; j < l; j++){ if (array[i] === array[j]){ i++; j = i; } } temp.push(array[i]); index.push(i); } console.log(index); return temp; } var aa = [1,2,2,3,5,3,6,5]; console.log(uniq(aa));
/* * 速度最快, 佔空間最多(空間換時間) * * 該方法執行的速度比其餘任何方法都快, 就是佔用的內存大一些。 * 現思路:新建一js對象以及新數組,遍歷傳入數組時,判斷值是否爲js對象的鍵, * 不是的話給對象新增該鍵並放入新數組。 * 注意點:判斷是否爲js對象鍵時,會自動對傳入的鍵執行「toString()」, * 不一樣的鍵可能會被誤認爲同樣,例如n[val]-- n[1]、n["1"]; * 解決上述問題仍是得調用「indexOf」。*/ function uniq(array){ var temp = {}, r = [], len = array.length, val, type; for (var i = 0; i < len; i++) { val = array[i]; type = typeof val; if (!temp[val]) { temp[val] = [type]; r.push(val); } else if (temp[val].indexOf(type) < 0) { temp[val].push(type); r.push(val); } } return r; } var aa = [1,2,"2",4,9,"a","a",2,3,5,6,5]; console.log(uniq(aa));
// ES6 function unique (arr) { const seen = new Map() return arr.filter((a) => !seen.has(a) && seen.set(a, 1)) }