? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?js面試題
.你能描述一下漸進(jìn)增強和優(yōu)雅降級之間的不同嗎?
優(yōu)雅降級:Web站點在所有新式瀏覽器中都能正常工作扛点,如果用戶使用的是老式瀏覽器,則代碼會檢查以確認(rèn)它們是否能正常工作。由于IE獨特的盒模型布局問題,針對不同版本的IE的hack實踐過優(yōu)雅降級了,為那些無法支持功能的瀏覽器增加候選方案娜谊,使之在舊式瀏覽器上以某種形式降級體驗卻不至于完全失效.
漸進(jìn)增強:從被所有瀏覽器支持的基本功能開始彼城,逐步地添加那些只有新式瀏覽器才支持的功能,向頁面增加無害于基礎(chǔ)瀏覽器的額外樣式和功能的涧至。當(dāng)瀏覽器支持時腹躁,它們會自動地呈現(xiàn)出來并發(fā)揮作用。
.css?動畫和?js?動畫的差異
代碼復(fù)雜度南蓬,js?動畫代碼相對復(fù)雜一些
動畫運行時纺非,對動畫的控制程度上,js?能夠讓動畫赘方,暫停烧颖,取消,終止窄陡,css?動畫不能添加事件
動畫性能看炕淮,js?動畫多了一個?js?解析的過程,性能不如?css?動畫好
遞歸函數(shù)
?說說寫JavaScript的基本規(guī)范泳梆?
1) 不要在同一行聲明多個變量
2) 使用 ===或!==來比較true/false或者數(shù)值
3) switch必須帶有default分支
4) 函數(shù)應(yīng)該有返回值
5) for if else 必須使用大括號
6) 語句結(jié)束加分號
7) 命名要有意義,使用駝峰命名法
JavaScript有幾種類型的值榜掌?你能畫一下他們的內(nèi)存圖嗎优妙?
基本數(shù)據(jù)類型存儲在棧中,引用數(shù)據(jù)類型(對象)存儲在堆中憎账,指針放在棧中套硼。
兩種類型的區(qū)別是:存儲位置不同;原始數(shù)據(jù)類型直接存儲在棧中的簡單數(shù)據(jù)段胞皱,占據(jù)空間小邪意、大小固定,屬于被頻繁使用數(shù)據(jù)反砌,所以放入棧中存儲雾鬼;引用數(shù)據(jù)類型存儲在堆中的對象,占據(jù)空間大、大小不固定,如果存儲在棧中宴树,將會影響程序運行的性能
引用數(shù)據(jù)類型在棧中存儲了指針策菜,該指針指向堆中該實體的起始地址。當(dāng)解釋器尋找引用值時酒贬,會首先檢索其在棧中的地址又憨,取得地址后從堆中獲得實體。
?eval是做什么的锭吨?
它的功能是把對應(yīng)的字符串解析成JS代碼并運行蠢莺;應(yīng)該避免使用eval,不安全零如,非常耗性能(2次躏将,一次解析成js語句锄弱,一次執(zhí)行)。
什么是window對象? 什么是document對象?
window對象代表瀏覽器中打開的一個窗口耸携。document對象代表整個html文檔棵癣。實際上,document對象是window對象的一個屬性夺衍。
null狈谊,undefined的區(qū)別?
null表示一個對象被定義了沟沙,但存放了空指針河劝,轉(zhuǎn)換為數(shù)值時為0。
undefined表示聲明的變量未初始化矛紫,轉(zhuǎn)換為數(shù)值時為NAN赎瞎。
typeof(null) -- object;
typeof(undefined) -- undefined
?new操作符具體干了什么呢?
1) 創(chuàng)建一個空對象,并且 this 變量引用該對象颊咬,同時還繼承了該函數(shù)的原型务甥。
2) 屬性和方法被加入到 this 引用的對象中。
3) 新創(chuàng)建的對象由 this 所引用喳篇,并且最后隱式的返回 this 敞临。
Javascript中,執(zhí)行時對象查找時麸澜,永遠(yuǎn)不會去查找原型的函數(shù)挺尿?
Object.hasOwnProperty(proName):是用來判斷一個對象是否有你給出名稱的屬性。不過需要注意的是炊邦,此方法無法檢查該對象的原型鏈中是否具有該屬性编矾,該屬性必須是對象本身的一個成員。
JS延遲加載的方式有哪些馁害?
JS的延遲加載有助與提高頁面的加載速度窄俏。
defer和async、動態(tài)創(chuàng)建DOM方式(用得最多)碘菜、按需異步載入JS
defer:延遲腳本裆操。立即下載,但延遲執(zhí)行(延遲到整個頁面都解析完畢后再運行)炉媒,按照腳本出現(xiàn)的先后順序執(zhí)行踪区。
async:異步腳本。下載完立即執(zhí)行吊骤,但不保證按照腳本出現(xiàn)的先后順序執(zhí)行缎岗。
同步和異步的區(qū)別?
同步的概念在操作系統(tǒng)中:不同進(jìn)程協(xié)同完成某項工作而先后次序調(diào)整(通過阻塞、喚醒等方式)白粉,同步強調(diào)的是順序性传泊,誰先誰后鼠渺。異步不存在順序性。
同步:瀏覽器訪問服務(wù)器眷细,用戶看到頁面刷新拦盹,重新發(fā)請求,等請求完溪椎,頁面刷新普舆,新內(nèi)容出現(xiàn),用戶看到新內(nèi)容之后進(jìn)行下一步操作校读。
異步:瀏覽器訪問服務(wù)器請求沼侣,用戶正常操作,瀏覽器在后端進(jìn)行請求歉秫。等請求完蛾洛,頁面不刷新,新內(nèi)容也會出現(xiàn)雁芙,用戶看到新內(nèi)容轧膘。
call和apply
call()方法和apply()方法的作用相同,動態(tài)改變某個類的某個方法的運行環(huán)境兔甘。他們的區(qū)別在于接收參數(shù)的方式不同谎碍。在使用call()方法時,傳遞給函數(shù)的參數(shù)必須逐個列舉出來裂明。使用apply()時椿浓,傳遞給函數(shù)的是參數(shù)數(shù)組太援。
回流與重繪
當(dāng)渲染樹中的一部分(或全部)因為元素的規(guī)模尺寸闽晦,布局,隱藏等改變而需要重新構(gòu)建提岔。這就稱為回流(reflow)仙蛉。每個頁面至少需要一次回流,就是在頁面第一次加載的時候碱蒙。在回流的時候荠瘪,瀏覽器會使渲染樹中受到影響的部分失效,并重新構(gòu)造這部分渲染樹赛惩。完成回流后哀墓,瀏覽器會重新繪制受影響的部分到屏幕中,該過程成為重繪
?DOM操作
(1)創(chuàng)建新節(jié)點
createDocumentFragment() //創(chuàng)建一個DOM片段
createElement() //創(chuàng)建一個具體的元素
createTextNode() //創(chuàng)建一個文本節(jié)點
(2)添加喷兼、移除篮绰、替換、插入
appendChild()
removeChild()
replaceChild()
insertBefore() //在已有的子節(jié)點前插入一個新的子節(jié)點
(3)查找
getElementsByTagName() //通過標(biāo)簽名稱
getElementsByName() //通過元素的Name屬性的值(IE容錯能力較強季惯,會得到一個數(shù)組吠各,其中包括id等于name值的)
getElementById()?
數(shù)組對象有哪些原生方法臀突,列舉一下
pop、push贾漏、shift候学、unshift、splice纵散、reverse梳码、sort、concat困食、join边翁、slice、toString硕盹、indexOf符匾、lastIndexOf、reduce瘩例、reduceRight
forEach啊胶、map、filter垛贤、every焰坪、some
?flash和js通過什么類如何交互?
Flash提供了ExternalInterface接口與JavaScript通信,ExternalInterface有兩個方法聘惦,call和addCallback某饰,call的作用是讓Flash調(diào)用js里的方法,addCallback是用來注冊flash函數(shù)讓js調(diào)用善绎。
漸進(jìn)增強與優(yōu)雅降級
漸進(jìn)增強:針對低版本瀏覽器進(jìn)行構(gòu)建頁面,保證最基本的功能禀酱,然后再針對高級瀏覽器進(jìn)行效果炬守、交互等改進(jìn),達(dá)到更好的用戶體驗剂跟。
優(yōu)雅降級:一開始就構(gòu)建完整的功能减途,然后再針對低版本瀏覽器進(jìn)行兼容。
attribute與property的區(qū)別曹洽?
attribute是dom元素在文檔中作為html標(biāo)簽擁有的屬性
property是dom元素在js中作為對象擁有的屬性鳍置。
所以,對于html的標(biāo)準(zhǔn)屬性來說送淆,attribute和property是同步的税产,是會自動更新的。但對于自定義屬性,他們不同步砖第。
map():
對數(shù)組的所有成員依次調(diào)用一個函數(shù)撤卢,返回值是一個新數(shù)組。
forEach():
與map方法很相似梧兼,也是遍歷數(shù)組的所有成員放吩,執(zhí)行某種操作。注意:forEach方法一般沒有返回值
閉包是什么羽杰,有什么特性渡紫,對頁面有什么影響
就是函數(shù)a的內(nèi)部函數(shù)b,被函數(shù)a外部的一個變量引用的時候考赛,就創(chuàng)建了一個閉包
閉包的特性:
①.封閉性:外界無法訪問閉包內(nèi)部的數(shù)據(jù)惕澎,如果在閉包內(nèi)聲明變量,外界是無法訪問的颜骤,除非閉包主動向外界提供訪問接口唧喉;
②.持久性:一般的函數(shù),調(diào)用完畢之后忍抽,系統(tǒng)自動注銷函數(shù)八孝,而對于閉包來說,在外部函數(shù)被調(diào)用之后鸠项,閉包結(jié)構(gòu)依然保存在
系統(tǒng)中干跛,閉包中的數(shù)據(jù)依然存在,從而實現(xiàn)對數(shù)據(jù)的持久使用祟绊。
優(yōu)點:
① 減少全局變量楼入。
② 減少傳遞函數(shù)的參數(shù)量
③ 封裝;
缺點:
使用閉包會占有內(nèi)存資源牧抽,過多的使用閉包會導(dǎo)致內(nèi)存溢出等.
如何阻止默認(rèn)事件
(1)return false嘉熊;(2) ev.preventDefault();
?冒泡排序算法