摘要:為了解決這些問題,就可以使用定時(shí)器對函數(shù)進(jìn)行節(jié)流。當(dāng)?shù)诙握{(diào)用該函數(shù)時(shí),它會清除前一次的定時(shí)器并設(shè)置另一個(gè)。如果前一個(gè)定時(shí)器已經(jīng)執(zhí)行過了,這個(gè)操作就沒有任何意義。然而,如果前一個(gè)定時(shí)器尚未執(zhí)行,其實(shí)就是將其替換為一個(gè)新的定時(shí)器。
2017面試分享(js面試題記錄) 1. 最簡單的一道題
"11" * 2 "a8" * 32. 一道this的問題
var num = 10; var obj = { num:8, inner: { num: 6, print: function () { console.log(this.num); } } } num = 888; obj.inner.print(); // 6 var fn = obj.inner.print; fn(); //888 (obj.inner.print)(); //6 (obj.inner.print = obj.inner.print)(); //888 這個(gè)點(diǎn)沒有太理解,雖然答對了3. var和function的預(yù)解析問題,以及變量和function的先后順序的問題
// 以下代碼執(zhí)行輸出結(jié)果是什么 function b () { console.log(a); var a = 10; function a() {}; a = 100; console.log(a); } b(); function c () { console.log(a); function a() {}; var a = 10; a = 100; console.log(a); } c(); (function d (num) { console.log(num); var num = 10; }(100)) (function e (num) { console.log(num); var num = 10; function num () {}; }(100)) (function f (num) { function num () {}; console.log(num); var num =10 console.log(num); }(100)) //仍然是預(yù)解析(在與解析過程中還要考慮一下當(dāng)前變量的作用于) function m () { console.log(a1); // underfined console.log(a2); // underfined console.log(b1); // underfined console.log(b2); // underfined if(false) { function b1 (){}; var a1 = 10; } if(true) { function b2 (){}; var a2 = 10; } console.log(a1); // underfined console.log(a2); // 10 console.log(b1); // underfined console.log(b2); // function } m(); function n() { if(2>1) { arr = 10; brr = 10; let arr; var brr; console.log(arr); console.log(brr); } } n(); // ReferenceError
此階段瀏覽器只是對var、function、函數(shù)形參進(jìn)行一個(gè)解析的準(zhǔn)備過程。而且在這個(gè)“預(yù)解析”過程中,有一個(gè)預(yù)解析先后順序,即函數(shù)的形參 -> function -> var。而且重名時(shí)預(yù)留函數(shù)、后來者覆蓋前者。預(yù)解析結(jié)果形參如果有值則解析到值,沒有則為underfined,函數(shù)則解析到整個(gè)函數(shù)體,變量都為underfined;這道題目中沒有參數(shù)出現(xiàn),所以先不討論。所以這道題在“預(yù)解析”時(shí),函數(shù)聲明權(quán)重優(yōu)先會被提升
4. 一個(gè)算法問題有一個(gè)已經(jīng)排序的數(shù)組,比方[1,4,6,9,11,15,18],給你一個(gè)新的數(shù),插入到數(shù)組中,寫一個(gè)function
5. 函數(shù)節(jié)流是什么,有什么優(yōu)點(diǎn)(之前沒有了解過這個(gè)概念,懵逼了) 函數(shù)節(jié)流的目的從字面上就可以理解,函數(shù)節(jié)流就是用來節(jié)流函數(shù)從而一定程度上優(yōu)化性能的。例如,DOM 操作比起非DOM 交互需要更多的內(nèi)存和CPU 時(shí)間。連續(xù)嘗試進(jìn)行過多的DOM 相關(guān)操作可能會導(dǎo)致瀏覽器掛起,有時(shí)候甚至?xí)罎ⅰS绕湓贗E 中使用onresize 事件處理程序的時(shí)候容易發(fā)生,當(dāng)調(diào)整瀏覽器大小的時(shí)候,該事件會連續(xù)觸發(fā)。在onresize 事件處理程序內(nèi)部如果嘗試進(jìn)行DOM 操作,其高頻率的更改可能會讓瀏覽器崩潰。又例如,我們常見的一個(gè)搜索的功能,我們一般是綁定keyup事件,每按下一次鍵盤就搜索一次。但是我們的目的主要是每輸入一些內(nèi)容搜索一次而已。為了解決這些問題,就可以使用定時(shí)器對函數(shù)進(jìn)行節(jié)流。
函數(shù)節(jié)流的原理某些代碼不可以在沒有間斷的情況連續(xù)重復(fù)執(zhí)行。第一次調(diào)用函數(shù),創(chuàng)建一個(gè)定時(shí)器,在指定的時(shí)間間隔之后運(yùn)行代碼。當(dāng)?shù)诙握{(diào)用該函數(shù)時(shí),它會清除前一次的定時(shí)器并設(shè)置另一個(gè)。如果前一個(gè)定時(shí)器已經(jīng)執(zhí)行過了,這個(gè)操作就沒有任何意義。然而,如果前一個(gè)定時(shí)器尚未執(zhí)行,其實(shí)就是將其替換為一個(gè)新的定時(shí)器。目的是只有在執(zhí)行函數(shù)的請求停止了一段時(shí)間之后才執(zhí)行。
http://www.cnblogs.com/LuckyW...
事件捕獲 處于目標(biāo)階段 事件冒泡
8. dom事件委托什么原理,有什么優(yōu)缺點(diǎn) 事件委托原理:事件冒泡機(jī)制 優(yōu)點(diǎn)1.可以大量節(jié)省內(nèi)存占用,減少事件注冊。比如ul上代理所有l(wèi)i的click事件就很不錯(cuò)。
2.可以實(shí)現(xiàn)當(dāng)新增子對象時(shí),無需再對其進(jìn)行事件綁定,對于動態(tài)內(nèi)容部分尤為合適
事件代理的常用應(yīng)用應(yīng)該僅限于上述需求,如果把所有事件都用事件代理,可能會出現(xiàn)事件誤判。即本不該被觸發(fā)的事件被綁定上了事件。
9. http的cache機(jī)制,以及200狀態(tài)下怎么實(shí)現(xiàn) from cache(表示接觸最多的就是304的from cache)(用于優(yōu)化,沒有接觸過,需要理解) 含義定義:瀏覽器緩存(Browser Caching)是為了加速瀏覽,瀏覽器在用戶磁盤上對最近請求過的文檔進(jìn)行存儲,當(dāng)訪問者再次請求這個(gè)頁面時(shí),瀏覽器就可以從本地磁盤顯示文檔,這樣就可以加速頁面的閱覽。
作用cache的作用:
1、減少延遲,讓你的網(wǎng)站更快,提高用戶體驗(yàn)。
2、避免網(wǎng)絡(luò)擁塞,減少請求量,減少輸出帶寬。
Cache-Control中的max-age是實(shí)現(xiàn)內(nèi)容cache的主要手段,共有3種常用策略:max-age和Last-Modified(If-Modified-Since)的組合、僅max-age、max-age和ETag的組合。
對于強(qiáng)制緩存,服務(wù)器通知瀏覽器一個(gè)緩存時(shí)間,在緩存時(shí)間內(nèi),下次請求,直接用緩存,不在時(shí)間內(nèi),執(zhí)行比較緩存策略。
對于比較緩存,將緩存信息中的Etag和Last-Modified通過請求發(fā)送給服務(wù)器,由服務(wù)器校驗(yàn),返回304狀態(tài)碼時(shí),瀏覽器直接使用緩存。
// 有一個(gè)構(gòu)造函數(shù)A,寫一個(gè)函數(shù)B,繼承A function A (num) { this.titileName = num; } A.prototype = { fn1: function () {}, fn2: function () {} }
這個(gè)問題的關(guān)注點(diǎn)是B繼承的A的靜態(tài)屬性,同時(shí)B的原型鏈中不存在A實(shí)例的titleName屬性
11. 什么是虛擬domReact為啥這么大?因?yàn)樗鼘?shí)現(xiàn)了一個(gè)虛擬DOM(Virtual DOM)。虛擬DOM是干什么的?這就要從瀏覽器本身講起
如我們所知,在瀏覽器渲染網(wǎng)頁的過程中,加載到HTML文檔后,會將文檔解析并構(gòu)建DOM樹,然后將其與解析CSS生成的CSSOM樹一起結(jié)合產(chǎn)生愛的結(jié)晶——RenderObject樹,然后將RenderObject樹渲染成頁面(當(dāng)然中間可能會有一些優(yōu)化,比如RenderLayer樹)。這些過程都存在與渲染引擎之中,渲染引擎在瀏覽器中是于JavaScript引擎(JavaScriptCore也好V8也好)分離開的,但為了方便JS操作DOM結(jié)構(gòu),渲染引擎會暴露一些接口供JavaScript調(diào)用。由于這兩塊相互分離,通信是需要付出代價(jià)的,因此JavaScript調(diào)用DOM提供的接口性能不咋地。各種性能優(yōu)化的最佳實(shí)踐也都在盡可能的減少DOM操作次數(shù)。
而虛擬DOM干了什么?它直接用JavaScript實(shí)現(xiàn)了DOM樹(大致上)。組件的HTML結(jié)構(gòu)并不會直接生成DOM,而是映射生成虛擬的JavaScript DOM結(jié)構(gòu),React又通過在這個(gè)虛擬DOM上實(shí)現(xiàn)了一個(gè) diff 算法找出最小變更,再把這些變更寫入實(shí)際的DOM中。這個(gè)虛擬DOM以JS結(jié)構(gòu)的形式存在,計(jì)算性能會比較好,而且由于減少了實(shí)際DOM操作次數(shù),性能會有較大提升
12. js基礎(chǔ)數(shù)據(jù)類型和引用類型分別是什么?這個(gè)前提條件下寫一個(gè)getType,返回相應(yīng)的類型1.基本數(shù)據(jù)類型(自身不可拆分的):Undefined、Null、Boolean、Number、String
2.引用數(shù)據(jù)類型(對象):Object (Array,Date,RegExp,F(xiàn)unction)
function gettype(nm){ return Object.prototype.toString.call(nm); }13. dom選擇器優(yōu)先級是什么,以及權(quán)重值計(jì)算(一道老問題了)
1.行內(nèi)樣式 1000
2.id 0100
3.類選擇器、偽類選擇器、屬性選擇器[type="text"] 0010
4.標(biāo)簽選擇器、偽元素選擇器(::first-line) 0001
5.通配符*、子選擇器、相鄰選擇器 0000
首先傳輸對象的雙向數(shù)據(jù)綁定 Object.defineProperty(target, key, decription),在decription中設(shè)置get和set屬性(此時(shí)應(yīng)注意description中g(shù)et和set不能與描述屬性共存)
數(shù)組的實(shí)現(xiàn)與對象不同。
同時(shí)運(yùn)用觀察者模式實(shí)現(xiàn)wather,用戶數(shù)據(jù)和view視圖的更新
1 component層面,web component和virtual dom
2 數(shù)據(jù)綁定(vue雙向,react的單向)等好多
3 計(jì)算屬性 vue 有,提供方便;而 react 不行
4 vue 可以 watch 一個(gè)數(shù)據(jù)項(xiàng);而 react 不行
5 vue 由于提供的 direct 特別是預(yù)置的 directive 因?yàn)閳鼍皥鼍伴_發(fā)更容易;react 沒有
6 生命周期函數(shù)名太長 directive
git stash //將本次修改存到暫存區(qū)(緊急切換分支時(shí)) git stash pop //將所有暫存區(qū)的內(nèi)容取出來17. postcss的使用 18. 網(wǎng)頁布局有哪幾種,有什么區(qū)別
靜態(tài)、自適應(yīng)、流式、響應(yīng)式四種網(wǎng)頁布局
靜態(tài)布局:意思就是不管瀏覽器尺寸具體是多少,網(wǎng)頁布局就按照當(dāng)時(shí)寫代碼的布局來布置;
自適應(yīng)布局:就是說你看到的頁面,里面元素的位置會變化而大小不會變化;
流式布局:你看到的頁面,元素的大小會變化而位置不會變化——這就導(dǎo)致如果屏幕太大或者太小都會導(dǎo)致元素?zé)o法正常顯示。
自適應(yīng)布局:每個(gè)屏幕分辨率下面會有一個(gè)布局樣式,同時(shí)位置會變而且大小也會變。
var a = {}; var b = {key: "b"}; var c = {key: "c"}; var d = [3,5,6]; a[b] = 123; a[c] = 345; a[d] = 333; console.log(a[b]); // 345 console.log(a[c]); // 345 console.log(a[d]); // 33319.
var R = (function() { var u = {a:1,b:2}; var r = { fn: function(k) { return u[k]; } } return r; }()); R.fn("a"); // 1
上述代碼中如何獲取匿名函數(shù)中的u
20. 不適用循環(huán)語句(包括map、forEach方法)實(shí)現(xiàn)一個(gè)100長度的數(shù)組,索引值和值相同的數(shù)組[0,1,2,3,4,5........99]var arr = new Array(100); //方法1 [...arr.keys()]; //方法二 Array.from(arr.keys()); //方法三 Array.from({length: 100}); // 方法四 借助string var arr1 = new Array(101); var str = arr1.join("1,"); str = str.replace(/(1,)/g, function ($0, $1, index) { var start = "" + Math.ceil(index/2); if(index < str.length - 2) { start += "," } return start; }); return str.split(","); // 方法五(函數(shù)式變成,參考網(wǎng)絡(luò)) function reduce(arr, val) { if(Object.prototype.toString.apply(val)){ return; } if(val >= 100) { return arr; } arr.push(val); return reduce(arr, val+1); } var res = reduce([], 0)21. 下面語句執(zhí)行結(jié)果輸出
var a = function (val, index) { console.log(index); return { fn: function (name) { return a(name, val); } } } var b = a(0); // underfined b.fn(1); // 0 b.fn(2); // 0 b.fn(3); // 022. 科普
1) dom節(jié)點(diǎn)的根節(jié)點(diǎn)是不是body
回答: 不是,dom節(jié)點(diǎn)的根節(jié)點(diǎn)是html(包含head和body,head中分為meta、title等。body又分為一組)
2)dom元素都會有offsetParent嗎
回答: offsetParent屬性返回一個(gè)對象的引用,這個(gè)對象是距離調(diào)用offsetParent的元素最近的(在包含層次中最靠近的),并且是已進(jìn)行過CSS定位的容器元素。 如果這個(gè)容器元素未進(jìn)行CSS定位, 則offsetParent屬性的取值為根元素(在標(biāo)準(zhǔn)兼容模式下為html元素;在怪異呈現(xiàn)模式下為body元素)的引用。 當(dāng)容器元素的style.display 被設(shè)置為 "none"時(shí)(譯注:IE和Opera除外),offsetParent屬性 返回 null。
3) [1,3,5]轉(zhuǎn)譯成字符串是什么
回答: "1,3,5"
調(diào)用toString方法,生成該字符串
4)li標(biāo)簽的祖級元素可以為li,父級元素也可以為例
回答: 錯(cuò)誤
在同源策略下;在某個(gè)服務(wù)器下的頁面是無法獲取到該服務(wù)器以外的數(shù)據(jù)的;Jquery中ajax 的核心是通過 XmlHttpRequest獲取非本頁內(nèi)容,而jsonp的核心則是動態(tài)添加