前端面試那些坑之JavaScript(二)

JavaScript面試題第二彈


21颜凯、如何判斷一個對象是否屬于某個類?

使用instanceof

if(a instanceof Person){

alert('yes');

}

22艘虎、new操作符具體干了什么呢?

(1)創(chuàng)建一個空對象,并且this變量引用該對象咒吐,同時還繼承了該函數(shù)的原型野建。

(2)屬性和方法被加入到this引用的對象中属划。

(3)新創(chuàng)建的對象由this所引用,并且最后隱式的返回this候生。

var obj?= {};

obj.__proto__ = Base.prototype;

Base.call(obj);

23同眯、Javascript中,有一個函數(shù)唯鸭,執(zhí)行時對象查找時须蜗,永遠(yuǎn)不會去查找原型,這個函數(shù)是目溉?

hasOwnProperty

javaScript中hasOwnProperty函數(shù)方法是返回一個布爾值明肮,指出一個對象是否具有指定名稱的屬性。此方法無法檢查該對象的原型鏈中是否具有該屬性缭付;該屬性必須是對象本身的一個成員柿估。

使用方法:

object.hasOwnProperty(proName)

其中參數(shù)object是必選項。一個對象的實例陷猫。

proName是必選項秫舌。一個屬性名稱的字符串值。

如果object具有指定名稱的屬性烙丛,那么JavaScript中hasOwnProperty函數(shù)方法返回true舅巷,反之則返回false。

24河咽、JSON的了解钠右?

JSON(JavaScript Object Notation)是一種輕量級的數(shù)據(jù)交換格式。

它是基于JavaScript的一個子集忘蟹。數(shù)據(jù)格式簡單,易于讀寫,占用帶寬小

如:{"age":"12", "name":"back"}

JSON字符串轉(zhuǎn)換為JSON對象:

var obj =eval('('+ str +')');

var obj = str.parseJSON();

var obj = JSON.parse(str);

JSON對象轉(zhuǎn)換為JSON字符串:

var last=obj.toJSONString();

var last=JSON.stringify(obj);

[].forEach.call($$("*"),function(a){a.style.outline="1pxsolid #"+(~~(Math.random()*(1<<24))).toString(16)})能解釋一下這段代碼的意思嗎飒房?

25、js延遲加載的方式有哪些媚值?

defer和async狠毯、動態(tài)創(chuàng)建DOM方式(用得最多)、按需異步載入js

26褥芒、Ajax是什么?如何創(chuàng)建一個Ajax嚼松?

ajax的全稱:AsynchronousJavascript And XML。

異步傳輸+js+xml锰扶。

所謂異步献酗,在這里簡單地解釋就是:向服務(wù)器發(fā)送請求的時候,我們不必等待結(jié)果坷牛,而是可以同時做其他的事情罕偎,等到有了結(jié)果它自己會根據(jù)設(shè)定進(jìn)行后續(xù)操作,與此同時京闰,頁面是不會發(fā)生整頁刷新的颜及,提高了用戶體驗甩苛。

(1)創(chuàng)建XMLHttpRequest對象,也就是創(chuàng)建一個異步調(diào)用對象

(2)創(chuàng)建一個新的HTTP請求,并指定該HTTP請求的方法、URL及驗證信息

(3)設(shè)置響應(yīng)HTTP請求狀態(tài)變化的函數(shù)

(4)發(fā)送HTTP請求

(5)獲取異步調(diào)用返回的數(shù)據(jù)

(6)使用JavaScript和DOM實現(xiàn)局部刷新

27俏站、Ajax解決瀏覽器緩存問題讯蒲?

(1)在ajax發(fā)送請求前加上anyAjaxObj.setRequestHeader("If-Modified-Since","0")。

(2)在ajax發(fā)送請求前加上anyAjaxObj.setRequestHeader("Cache-Control","no-cache")乾翔。

(3)在URL后面加上一個隨機(jī)數(shù):"fresh=" + Math.random();爱葵。

(4)在URL后面加上時間搓:"nowtime=" + new Date().getTime();施戴。

(5)如果是使用jQuery反浓,直接這樣就可以了$.ajaxSetup({cache:false})。這樣頁面的所有ajax都會執(zhí)行這條語句就是不需要保存緩存記錄赞哗。

28雷则、同步和異步的區(qū)別?

同步的概念應(yīng)該是來自于OS中關(guān)于同步的概念:不同進(jìn)程為協(xié)同完成某項工作而在先后次序上調(diào)整(通過阻塞,喚醒等方式).同步強(qiáng)調(diào)的是順序性.誰先誰后.異步則不存在這種順序性.

同步:瀏覽器訪問服務(wù)器請求,用戶看得到頁面刷新肪笋,重新發(fā)請求,等請求完月劈,頁面刷新,新內(nèi)容出現(xiàn)藤乙,用戶看到新內(nèi)容,進(jìn)行下一步操作猜揪。

異步:瀏覽器訪問服務(wù)器請求,用戶正常操作坛梁,瀏覽器后端進(jìn)行請求而姐。等請求完,頁面不刷新划咐,新內(nèi)容也會出現(xiàn)拴念,用戶看到新內(nèi)容。

29褐缠、如何解決跨域問題?

jsonp政鼠、iframe、window.name队魏、window.postMessage公般、服務(wù)器上設(shè)置代理頁面

30、模塊化開發(fā)怎么做胡桨?

立即執(zhí)行函數(shù),不暴露私有成員

var module1 = (function(){

var_count = 0;

var m1 =function(){

//...

};

var m2 =function(){

//...

};

return {

m1 :m1,

m2 : m2

};

})();

31官帘、AMD(Modules/Asynchronous-Definition)、CMD(CommonModule Definition)規(guī)范區(qū)別登失?

Asynchronous Module Definition遏佣,異步模塊定義,所有的模塊將被異步加載揽浙,模塊加載不影響后面語句運(yùn)行状婶。所有依賴某些模塊的語句均放置在回調(diào)函數(shù)中意敛。

區(qū)別:

(1)對于依賴的模塊,AMD是提前執(zhí)行膛虫,CMD是延遲執(zhí)行草姻。不過RequireJS從2.0開始,也改成可以延遲執(zhí)行(根據(jù)寫法不同稍刀,處理方式不同)撩独。CMD推崇as lazy as possible.

(2)CMD推崇依賴就近,AMD推崇依賴前置账月∽郯颍看代碼:

// CMD

define(function(require, exports, module) {

var a = require('./a')

a.doSomething()

//此處略去100行

var b = require('./b') //依賴可以就近書寫

b.doSomething()

// ...

})

// AMD默認(rèn)推薦

define(['./a', './b'], function(a, b) { //依賴必須一開始就寫好

a.doSomething()

//此處略去100行

b.doSomething()

// ...

})

32、異步加載JS的方式有哪些局齿?

(1)defer剧劝,只支持IE

(2)async:

(3)創(chuàng)建script,插入到DOM中抓歼,加載完畢后callBack

33讥此、documen.write和innerHTML的區(qū)別

document.write只能重繪整個頁面

innerHTML可以重繪頁面的一部分

34、DOM操作——怎樣添加谣妻、移除萄喳、移動、復(fù)制蹋半、創(chuàng)建和查找節(jié)點?

(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容錯能力較強(qiáng)闻蛀,會得到一個數(shù)組,其中包括id等于name值的)

getElementById()??? //通過元素Id您市,唯一性

35觉痛、.call()和.apply()的區(qū)別?

例子中用add來替換sub茵休,add.call(sub,3,1)== add(3,1)薪棒,所以運(yùn)行結(jié)果為:alert(4);

注意:js中的函數(shù)其實是對象,函數(shù)名是對Function對象的引用榕莺。

function add(a,b)

{

alert(a+b);

}

function sub(a,b)

{

alert(a-b);

}

add.call(sub,3,1);

36俐芯、jquery.extend與jquery.fn.extend的區(qū)別?

* jquery.extend為jquery類添加類方法钉鸯,可以理解為添加靜態(tài)方法

* jquery.fn.extend:

源碼中jquery.fn= jquery.prototype吧史,所以對jquery.fn的擴(kuò)展,就是為jquery類添加成員函數(shù)

使用:

jquery.extend擴(kuò)展唠雕,需要通過jquery類來調(diào)用贸营,而jquery.fn.extend擴(kuò)展吨述,所有jquery實例都可以直接調(diào)用。

37钞脂、Jquery與jQuery UI有啥區(qū)別揣云?

*jQuery是一個js庫,主要提供的功能是選擇器冰啃,屬性修改和事件綁定等等邓夕。

*jQuery UI則是在jQuery的基礎(chǔ)上,利用jQuery的擴(kuò)展性阎毅,設(shè)計的插件焚刚。

提供了一些常用的界面元素,諸如對話框净薛、拖動行為汪榔、改變大小行為等等

38、jquery中如何將數(shù)組轉(zhuǎn)化為json字符串肃拜,然后再轉(zhuǎn)化回來?

jQuery中沒有提供這個功能雌团,所以你需要先編寫兩個jQuery的擴(kuò)展:

$.fn.stringifyArray = function(array) {

return JSON.stringify(array)

}

$.fn.parseArray = function(array) {

return JSON.parse(array)

}

然后調(diào)用:

$("").stringifyArray(array)

39燃领、針對jQuery的優(yōu)化方法?

*基于Class的選擇性的性能相對于Id選擇器開銷很大锦援,因為需遍歷所有DOM元素猛蔽。

*頻繁操作的DOM,先緩存起來再操作灵寺。用Jquery的鏈?zhǔn)秸{(diào)用更好曼库。

比如:varstr=$("a").attr("href");

*for (var i = size; i < arr.length; i++){}

for循環(huán)每一次循環(huán)都查找了數(shù)組(arr)的.length屬性,在開始循環(huán)的時候設(shè)置一個變量來存儲這個數(shù)字略板,可以讓循環(huán)跑得更快:

for(var i = size, length = arr.length; i < length; i++) {}

40毁枯、如何判斷當(dāng)前腳本運(yùn)行在瀏覽器還是node環(huán)境中?(阿里)

this === window ? 'browser' : 'node';

通過判斷Global對象是否為window叮称,如果不為window种玛,當(dāng)前腳本沒有運(yùn)行在瀏覽器中

41、jQuery的slideUp動畫瓤檐,如果目標(biāo)元素是被外部事件驅(qū)動,當(dāng)鼠標(biāo)快速地連續(xù)觸發(fā)外部元素事件,動畫會滯后的反復(fù)執(zhí)行赂韵,該如何處理呢?

jquery stop():如:$("#div").stop().animate({width:"100px"},100);

42、那些操作會造成內(nèi)存泄漏挠蛉?

內(nèi)存泄漏指任何對象在您不再擁有或需要它之后仍然存在祭示。

垃圾回收器定期掃描對象,并計算引用了每個對象的其他對象的數(shù)量谴古。如果一個對象的引用數(shù)量為0(沒有其他對象引用過該對象)质涛,或?qū)υ搶ο蟮奈┮灰檬茄h(huán)的悄窃,那么該對象的內(nèi)存即可回收。

setTimeout的第一個參數(shù)使用字符串而非函數(shù)的話蹂窖,會引發(fā)內(nèi)存泄漏轧抗。

閉包、控制臺日志瞬测、循環(huán)(在兩個對象彼此引用且彼此保留時横媚,就會產(chǎn)生一個循環(huán))

43、JQuery一個對象可以同時綁定多個事件月趟,這是如何實現(xiàn)的灯蝴?

*多個事件同一個函數(shù):

$("div").on("click mouseover", function(){});

*多個事件不同函數(shù)

$("div").on({

click: function(){},

mouseover: function(){}

});

44、知道什么是webkit么?知道怎么用瀏覽器的各種工具來調(diào)試和debug代碼么?

Chrome,Safari瀏覽器內(nèi)核孝宗。

45穷躁、用js實現(xiàn)千位分隔符?

function commafy(num) {

return num && num

.toString()

.replace(/(\d)(?=(\d{3})+\.)/g, function($0, $1) {

return $1 + ",";

});

}

console.log(commafy(1234567.90));//1,234,567.90

46、檢測瀏覽器版本版本有哪些方式因妇?

功能檢測问潭、userAgent特征檢測

比如:navigator.userAgent

//"Mozilla/5.0 (Macintosh; Intel MacOS X 10_10_2) AppleWebKit/537.36

(KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36"

47、What is a Polyfill?

polyfill是“在舊版瀏覽器上復(fù)制標(biāo)準(zhǔn)API的JavaScript補(bǔ)充”,可以動態(tài)地加載JavaScript代碼或庫婚被,在不支持這些標(biāo)準(zhǔn)API的瀏覽器中模擬它們狡忙。

例如,geolocation(地理位置)polyfill可以在navigator對象上添加全局的geolocation對象址芯,還能添加getCurrentPosition函數(shù)以及“坐標(biāo)”回調(diào)對象灾茁,

所有這些都是W3C地理位置API定義的對象和函數(shù)。因為polyfill模擬標(biāo)準(zhǔn)API谷炸,所以能夠以一種面向所有瀏覽器未來的方式針對這些API進(jìn)行開發(fā)北专,

一旦對這些API的支持變成絕對大多數(shù),則可以方便地去掉polyfill旬陡,無需做任何額外工作拓颓。

48、做的項目中季惩,有沒有用過或自己實現(xiàn)一些polyfill方案(兼容性處理方案)录粱?

比如:html5shiv、Geolocation画拾、Placeholder

49啥繁、使用JS實現(xiàn)獲取文件擴(kuò)展名?

function getFileExtension(filename) {

return filename.slice((filename.lastIndexOf(".") - 1>>> 0) + 2);

}

String.lastIndexOf()方法返回指定值(本例中的'.')在調(diào)用該方法的字符串中最后出現(xiàn)的位置青抛,如果沒找到則返回-1旗闽。

對于'filename'和'.hiddenfile',lastIndexOf的返回值分別為0和-1無符號右移操作符(?>)將-1轉(zhuǎn)換為4294967295,將-2轉(zhuǎn)換為4294967294适室,這個方法可以保證邊緣情況時文件名不變嫡意。

String.prototype.slice()從上面計算的索引處提取文件的擴(kuò)展名。如果索引比文件名的長度大捣辆,結(jié)果為""蔬螟。


京程一燈,夢起的地方,我們始終相信通過努力,可以改變自己的命運(yùn)队塘。

我們始終相信,通過堅持不懈鲁猩,可以為大家解決更多的前端技術(shù)問題。

我們始終相信罢坝,時間可以證明廓握,我們可以為廣大IT從業(yè)者解決前端學(xué)習(xí)路線。

HTML5嘁酿,CSS3隙券,Web前端,jquery痹仙,javascript是尔,前端學(xué)習(xí)路線,各類問題开仰,我們都可以為你解決。

更多技術(shù)好文薪铜,前端問題众弓,面試技巧,請關(guān)注京程一燈(原一燈學(xué)堂)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末隔箍,一起剝皮案震驚了整個濱河市谓娃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蜒滩,老刑警劉巖滨达,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異俯艰,居然都是意外死亡捡遍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門竹握,熙熙樓的掌柜王于貴愁眉苦臉地迎上來画株,“玉大人,你說我怎么就攤上這事∥酱” “怎么了蜈项?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長续挟。 經(jīng)常有香客問我紧卒,道長,這世上最難降的妖魔是什么诗祸? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任跑芳,我火速辦了婚禮,結(jié)果婚禮上贬媒,老公的妹妹穿的比我還像新娘聋亡。我一直安慰自己,他們只是感情好际乘,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布坡倔。 她就那樣靜靜地躺著,像睡著了一般脖含。 火紅的嫁衣襯著肌膚如雪罪塔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天养葵,我揣著相機(jī)與錄音征堪,去河邊找鬼。 笑死关拒,一個胖子當(dāng)著我的面吹牛佃蚜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播着绊,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼谐算,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了归露?” 一聲冷哼從身側(cè)響起洲脂,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎剧包,沒想到半個月后恐锦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疆液,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年一铅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枚粘。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡馅闽,死狀恐怖飘蚯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情福也,我是刑警寧澤局骤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站暴凑,受9級特大地震影響峦甩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜现喳,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一凯傲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嗦篱,春花似錦冰单、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至浴栽,卻和暖如春荒叼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背典鸡。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工被廓, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人萝玷。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓嫁乘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親球碉。 傳聞我的和親對象是個殘疾皇子亦渗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容