整理一下js面試題
1那伐、Javascript的typeof返回值的類型有哪些
答:number、string、boolean罕邀、object畅形、function、undefined
其中Array诉探、object日熬、null的返回值類型為object
2、說出幾種顯示類型轉(zhuǎn)換和隱式類型轉(zhuǎn)換
答:顯示類型轉(zhuǎn)換:
number(將目標(biāo)轉(zhuǎn)換為數(shù)字肾胯,如果其中帶有字母則轉(zhuǎn)換為NaN逝撬;true轉(zhuǎn)換為1,false轉(zhuǎn)換為0殴玛;null轉(zhuǎn)換為0咖为;undefined轉(zhuǎn)換為NaN)。
string(將任何目標(biāo)轉(zhuǎn)換為字符串帘皿,包括true东跪、false、undefined鹰溜、null等)
parseInt(將目標(biāo)轉(zhuǎn)換為整型虽填,true、false曹动、null斋日、undefined全部轉(zhuǎn)換為NaN;將正常的數(shù)字轉(zhuǎn)換為整數(shù)墓陈,小數(shù)直接去掉恶守。注:如果parseInt中含有兩個參數(shù),含義就是以第二個參數(shù)為基底贡必,將第一個數(shù)字轉(zhuǎn)換為十進(jìn)制的數(shù)字)
boolean(將目標(biāo)轉(zhuǎn)換為true或false)
toString(將其轉(zhuǎn)換為字符串類型)
parseFloat(轉(zhuǎn)換為小時類型兔港,將第一個小數(shù)點后面的第一個數(shù)字返回,其余截斷)
3仔拟、split()和join()的區(qū)別
答:join()的作用是將數(shù)組拼接為字符串衫樊,括號中可以填寫需要的連接字符,默認(rèn)的連接字符是“利花,”科侈。(john.htlm)
split()的作用是將字符串分割,返回數(shù)組炒事。
4臀栈、數(shù)組方法.pop()、.push()挠乳、.unshift()权薯、.shift的作用
答:pop()是在尾部刪除姑躲;push()是在尾部添加;
? ? ? ?shift()是在頭部刪除崭闲;unshift()是在頭部添加肋联;
5、ajax請求時get和post方式的區(qū)別
答:get和post本質(zhì)上就是TCP連接刁俭,并無差別橄仍。http請求最初設(shè)定了八種方法,這八種方法本質(zhì)上沒有區(qū)別牍戚,只是讓請求更加語義化而已侮繁。但是由于http的規(guī)定和瀏覽器/服務(wù)器的限制,導(dǎo)致他們在應(yīng)用過程中體現(xiàn)出一些不同如孝。
1宪哩、發(fā)送機(jī)制不同
1)get請求時將參數(shù)跟在url后面進(jìn)行傳遞,而post請求是將參數(shù)作為http消息的實體內(nèi)容發(fā)送給web服務(wù)器第晰。
2)get請求提交的數(shù)據(jù)限制是1024字節(jié)锁孟,這是由于特定瀏覽器和服務(wù)器的限制,如ie的url長度限制是2083字節(jié)茁瘦,而火狐理論上沒有長度顯示品抽。注意這個限制是url的整個長度的限制,而不只是參數(shù)的長度甜熔。post理論上沒有長度限制圆恤。
3)get請求的數(shù)據(jù)會被瀏覽器緩存起來,因此其他人可以從瀏覽器的流失記錄中提取到這些數(shù)據(jù)腔稀,如賬戶名稱和密碼等等盆昙。所以get方式會帶來嚴(yán)重的安全問題,而post可以避免這些問題焊虏。
2淡喜、服務(wù)端的區(qū)別
1)客戶端使用get請求時,服務(wù)端使用Request.QueryString來獲取诵闭,而客戶端使用post請求時拆火,服務(wù)端使用Request.Form來獲取。
2)post用于創(chuàng)建資源涂圆,資源的內(nèi)容會被編入http請示的內(nèi)容中,例如币叹,處理訂貨表單等等润歉。
3)當(dāng)請求無副作用時(如進(jìn)行搜索),使用get方法颈抚,當(dāng)請求有副作用時(如添加數(shù)據(jù))踩衩,則使用post方法嚼鹉。
6、call和apply的作用是什么驱富,有什么區(qū)別
答:call和apply的作用是改變this指向锚赤,區(qū)別是傳參列表不同。
7褐鸥、什么是閉包线脚,閉包的作用是什么,使用閉包的注意點
1叫榕、什么是閉包:
JS的變量分為局部變量和全局變量浑侥,函數(shù)內(nèi)部可以讀取全局變量,但是函數(shù)外部不能讀取局部變量晰绎。任何未聲明而直接賦值的變量都會變?yōu)槿肿兞吭⒙洹R虼嗽谡G闆r下函數(shù)外部不能獲得函數(shù)內(nèi)部的局部變量,為了獲得這個局部變量荞下,可以在函數(shù)內(nèi)部再定義一個函數(shù)伶选,將此函數(shù)作為返回值,這樣在函數(shù)外部就能得到這個局部變量了尖昏。因此阿可以理解為閉包是將函數(shù)內(nèi)部和函數(shù)外部連接起來的橋梁仰税。
如果一個函數(shù)用到了它作用域外面的變量,那么這個變量和這個函數(shù)之間的環(huán)境就叫閉包会宪。
2肖卧、閉包的作用:
1)模仿塊級作用域
所謂塊級作用域就是指在循環(huán)中定義的變量,一旦循環(huán)結(jié)束掸鹅,變量也隨之銷毀塞帐,它的作用范圍只在這一小塊。而在JavaScript中沒有這樣的塊級作用域巍沙,由于JavaScript不會告訴你變量是否已經(jīng)被聲明葵姥,所以容易造成命名沖突,如果在全局環(huán)境定義的變量句携,就會污染全局環(huán)境榔幸,因此可以利用閉包的特性來模仿塊級作用域。
2)儲存變量
閉包的另一個特點是可以保存外部函數(shù)的變量矮嫉,內(nèi)部函數(shù)保留了對外部函數(shù)的活動變量的引用削咆,所以變量不會被釋放。這種寫法可以用在把一些不經(jīng)常變動計算起來又比較復(fù)雜的值保存起來蠢笋,節(jié)省每次的訪問時間拨齐。
3)封裝私有變量
我們可以把函數(shù)當(dāng)做一個范圍,函數(shù)內(nèi)部的變量就是私有變量昨寞,在外部無法引用瞻惋,但是我們可以通過閉包的特點訪問私有變量厦滤。
3、使用閉包的注意點
1)由于閉包會使得函數(shù)的變量保存在內(nèi)存中歼狼,內(nèi)存的消耗很大掏导,所以不能濫用閉包,可能會導(dǎo)致內(nèi)存泄漏羽峰。解決方法是在函數(shù)退出之前趟咆,將不適用的局部變量全部刪除。
2)閉包會在父函數(shù)外部限寞,改變父函數(shù)內(nèi)部變量的值忍啸。所以,如果你把父函數(shù)當(dāng)作對象(object)使用履植,把閉包當(dāng)作它的公用方法(Public Method)计雌,把內(nèi)部變量當(dāng)作它的私有屬性(private value),這時一定要小心玫霎,不要隨便改變父函數(shù)內(nèi)部變量的值凿滤。
8.事件委托是什么,為什么要使用事件委托
答:
1)事件委托是利用事件的冒泡原理來實現(xiàn)的庶近,何為事件冒泡呢翁脆?就是事件從最深的節(jié)點開始,然后逐步向上傳播事件鼻种,舉個例子:頁面上有這么一個節(jié)點樹反番,div>ul>li>a;比如給最里面的a加一個click點擊事件,那么這個事件就會一層一層的往外執(zhí)行叉钥,執(zhí)行順序a>li>ul>div罢缸。因此如果我們給最外面的div加點擊事件,同時點擊div內(nèi)的ul或li或a標(biāo)簽投队,都會觸發(fā)父級div上的點擊事件枫疆,這就是事件委托,委托它們父級代為執(zhí)行事件敷鸦。
2)js中性能優(yōu)化的主要思想就是減少js直接操作dom的次數(shù)息楔,這也就是為什么vue等框架使用虛擬dom的原因,因為每一次直接操作dom節(jié)點都會導(dǎo)致瀏覽器的重拍與重繪扒披,嚴(yán)重影響了瀏覽器的交互時間值依。每一個函數(shù)就是一個對象,是對象就會占用內(nèi)存碟案,對象越多占用內(nèi)存越大鳞滨,100個li就會占用100個內(nèi)存空間。如果使用事件委托蟆淀,就只對它的父級進(jìn)行操作拯啦,與dom的交互就只有一次,大大減少dom的操作次數(shù)熔任,顯著提高系統(tǒng)性能褒链。
9、簡述一下瀏覽器處理dom事件的過程疑苔,如何阻止事件冒泡
答:
dom2.0模型簡時間處理流程分為三個階段
一甫匹、事件捕獲階段:當(dāng)某個元素觸發(fā)某個事件(如:onlick),頂層對象document就會發(fā)出一個事件流惦费,隨著DOM樹的節(jié)點向目標(biāo)元素節(jié)點流去兵迅,直到達(dá)到真正發(fā)生的目標(biāo)元素。在這個過程中薪贫,事件相應(yīng)的監(jiān)聽函數(shù)是不會觸發(fā)的恍箭。
二、事件目標(biāo)階段:到達(dá)目標(biāo)元素之后瞧省,執(zhí)行目標(biāo)元素該事件的相應(yīng)處理函數(shù)扯夭。如果沒有綁定監(jiān)聽函數(shù),那就不執(zhí)行鞍匾。
三交洗、事件起泡階段:從目標(biāo)元素開始,往頂層傳播橡淑。途中如果有節(jié)點綁定了相應(yīng)的事件處理函數(shù)构拳,這些函數(shù)都會被依次觸發(fā)。
阻止事件冒泡
ie:e.cancelBubble = true
非ie:e.stopPropagation()
10梁棠、如何取消默認(rèn)事件
答:
W3Cde方法是:e.preventDefault();
IE的方法是:e.returnValue = false;
默認(rèn)事件:如a標(biāo)簽置森,具有點擊跳轉(zhuǎn)功能,button按鈕的默認(rèn)提交功能等掰茶。
11暇藏、添加節(jié)點、刪除節(jié)點濒蒋、替換節(jié)點盐碱、插入節(jié)點的方法
1)創(chuàng)建新節(jié)點:
createElement()//創(chuàng)建一個具體的元素節(jié)點
createTextNode()//創(chuàng)建一個指定文本的節(jié)點
2)操作節(jié)點
添加:appendChild()
移除:removeChild()
替換:replaceChild()
插入:insertBefore()
3)查找節(jié)點
通過標(biāo)簽名稱:getElementByTagName()
通過name屬性:getElementByName()
通過元素id(具有唯一性):getElementById()
12、簡述一下什么是ajax沪伙,如何發(fā)送一個ajax請求
答:
1)AJAX = Asynchronous JavaScript and XML瓮顽,這不是新的編程語言,而是一種使用現(xiàn)有標(biāo)準(zhǔn)的新方法围橡,它最大的優(yōu)點是在不重新加載整個頁面的情況下暖混,可以與服務(wù)器交換數(shù)據(jù)并更新部分網(wǎng)頁內(nèi)容。AJAX不需要任何的瀏覽器插件翁授,但需要用戶允許JavaScript在瀏覽器上執(zhí)行拣播。
2)發(fā)送ajax請求的步驟
1創(chuàng)建一個對象XMLHttpRequest
var xhr = new XMLHttpRequest();為了支持ie6以及更早的版本晾咪,要 var xhr=new ActiveXObject()
2監(jiān)聽請求成功后的狀態(tài)變化
3設(shè)置請求參數(shù)
4發(fā)起請求
5操作dom,實現(xiàn)動態(tài)局部刷新
13贮配、一個完整的http請求的步驟是什么
1谍倦、建立tcp連接
2、web瀏覽器向web服務(wù)器發(fā)送請求命令
3泪勒、web瀏覽器發(fā)送請求頭信息
4昼蛀、web服務(wù)器應(yīng)答
5、web服務(wù)器向瀏覽器發(fā)送應(yīng)答頭信息
6圆存、web服務(wù)器向瀏覽器發(fā)送數(shù)據(jù)
7叼旋、web服務(wù)器關(guān)閉tcp連接
14、解釋一下什么是jsonp沦辙,為什么不是真正的ajax
jsonp是用來解決跨域獲取數(shù)據(jù)的一種解決方案夫植,具體是通過動態(tài)創(chuàng)建script標(biāo)簽,然后通過標(biāo)簽的src屬性獲取js文件中的js腳本怕轿。該腳本的內(nèi)容是一個函數(shù)調(diào)用偷崩,參數(shù)就是服務(wù)器返回的數(shù)據(jù),為了處理這些返回的數(shù)據(jù)撞羽,需要事先在頁面定義好回調(diào)函數(shù)阐斜,本質(zhì)上使用的并不是ajax技術(shù)。
ajax的核心是:通過XmlHttpRequest獲取非本頁的內(nèi)容
jsonp的核心是:通過動態(tài)添加<script>標(biāo)簽來調(diào)用服務(wù)器提供的js腳本诀紊。
jsonp只支持get請求谒出,ajax支持get和post請求。
15邻奠、document load和document ready的區(qū)別
答:load是當(dāng)頁面所有資源全部加載完成之后(包括dom文檔樹笤喳、css文件、js文件和圖片資源等)碌宴,執(zhí)行一個函數(shù)杀狡。load方法就是onload事件,如果圖片資源較多贰镣,加載時間較長呜象,onload后等待執(zhí)行的函數(shù)需要等待教程時間,一些效果可能受到影響碑隆。
ready是當(dāng)dom文檔樹加載完成之后執(zhí)行一個函數(shù)(不包含圖片和css等)恭陡,所以會比load快。在原生js中沒有l(wèi)oad方法上煤,jquery中有$().ready(function)
16休玩、JS中"="=="和"==="有什么區(qū)別
答:
"="是賦值運算符,賦值順序是從右向左。
"=="判斷值是否相等拴疤,如果兩者類型不一樣就進(jìn)行隱式轉(zhuǎn)換永部;"==="不會進(jìn)行隱式轉(zhuǎn)換,不但判斷值是否相等呐矾,還要判斷類型是否完全相等扬舒。具體如下。
1)"=="進(jìn)行判斷時方法如下:
如果兩個值類型相等凫佛,數(shù)值相等,那么兩者相等孕惜。
如果兩個值類型不一樣愧薛,就要進(jìn)行如下轉(zhuǎn)換
1.1如果一個值是null,另一個值是undefined衫画,兩者相等毫炉。
1.2如果一個值是數(shù)字,另一個值是字符串削罩,就將字符串轉(zhuǎn)換為數(shù)字瞄勾,再將二者比較。
1.3如果一個值是true弥激,將其轉(zhuǎn)換為1进陡,進(jìn)行比較;如果一個值是false微服,將其轉(zhuǎn)換為0趾疚,進(jìn)行比較。
1.4如果一個值是對象以蕴,另一個值是數(shù)字或者字符串糙麦,將對象轉(zhuǎn)換為原始類型再進(jìn)行比較。
2)"==="具體的判斷方法如下:
2.1首先如果兩個值類型不同丛肮,他們就不相等赡磅,就不用往下看了。
2.2如果兩個值都是number類型宝与,而且值相同(NaN除外焚廊,NaN不等于任何值,NaN不等于NaN)伴鳖,那么兩者相等节值。
2.3如果兩個值都是string,兩個值在相同位置上的字符必須一致榜聂,否則不相等搞疗。
2.4如果兩個值都是boolean類型,必須同為true或false,否則不相等匿乃。
2.5如果兩個值引用的是同一個對象桩皿、數(shù)組或函數(shù),那么它們完全相同幢炸。如果引用的是不同的對象泄隔、數(shù)組或函數(shù),兩者不相等宛徊。
2.6如果兩個值同為null或undefined佛嬉,兩個相等;unll不等于undefined闸天。
17暖呕、函數(shù)聲明和函數(shù)表達(dá)式的區(qū)別
定義函數(shù)主要有三種方法:
1、函數(shù)聲明(Function Declaration);
function functionName(arg1, arg2, ...){
? ? <!-- function body -->}
2苞氮、函數(shù)表達(dá)式(Function Expression)
var variable=function(arg1, arg2, ...){
? ? ? ? ? ? <!-- function body -->}
3湾揽、new Function構(gòu)造函數(shù)
講函數(shù)聲明和函數(shù)表達(dá)式之前先說一個類似的。小伙伴們應(yīng)該都知道"變量聲明提升":主要就是三個要點:1變量聲明會提前到函數(shù)的頂部笼吟;2只有聲明被提前库物,初始化不提前(也就是賦值不提前),初始化還在原來的位置贷帮;3在初始化之前變量的值是undefined戚揭。
與"變量聲明提升"相類似,函數(shù)的聲明也會進(jìn)行提升皿桑。在js中毫目,函數(shù)聲明和函數(shù)表達(dá)式的解析順序并不一樣。由于在預(yù)編譯時函數(shù)聲明會進(jìn)行提升(函數(shù)聲明和函數(shù)體都要進(jìn)行提升)诲侮,所以函數(shù)聲明會在其他代碼執(zhí)行之前執(zhí)行镀虐,當(dāng)程執(zhí)行到函數(shù)聲明的時候直接跳過(因為預(yù)編譯的時候已經(jīng)執(zhí)行過了)。而函數(shù)表達(dá)式并不會進(jìn)行提升沟绪,只有當(dāng)程序執(zhí)行到這里時才會初始化上下文,因此如果在函數(shù)表達(dá)式之前讓這個函數(shù)執(zhí)行刮便,會導(dǎo)致瀏覽器報錯。
考點:程序中有同名函數(shù)時绽慈,由于預(yù)編譯導(dǎo)致后面的函數(shù)覆蓋前面的函數(shù)恨旱,導(dǎo)致程序執(zhí)行結(jié)果不同,分析時一定要注意坝疼;函數(shù)體內(nèi)部的變量與函數(shù)體外部的變量同名時會產(chǎn)生沖突搜贤,此時會輸入內(nèi)部變量,外部變量被屏蔽钝凶。由于函數(shù)提升定問題仪芒,導(dǎo)致打印undefined等,這是經(jīng)常考察的小知識點掂名。
原文地址:https://www.cnblogs.com/chaoyuehedy/p/9110063.html
18据沈、JavaScript的事件流模型都有什么
答:
1)捕獲流:捕獲流最早由網(wǎng)景公司開發(fā)的瀏覽器使用,當(dāng)時間發(fā)生時饺蔑,該事件由高層次向低層次傳遞锌介。
2)冒泡流:冒泡流最早由微軟公司使用,它是一種與上述捕獲流截然相反的機(jī)制猾警。當(dāng)事件發(fā)生時孔祸,該事件由低層次向高層次傳播。
3)dom中的事件流:
dom2級綜合了上述兩個過程发皿,將事件流分為三個過程:捕獲階段 -->處于目標(biāo)對象階段-->冒泡階段融击。注意,處于目標(biāo)對象階段和冒泡階段同屬于冒泡過程雳窟。
19、JavaScript的變量范圍有什么不同
全局變量:當(dāng)前頁面有效
局部變量:函數(shù)體內(nèi)有效(函數(shù)體內(nèi)部沒有聲明而直接賦值的變量默認(rèn)作為全局變量)
20匣屡、一下程序執(zhí)行的結(jié)果是什么封救?
21、null和undefined的區(qū)別是什么
答:
Null類型中只有一個值就是null捣作。unll表示沒有對象誉结,即此處不應(yīng)該有值。例如:
1)作為函數(shù)的參數(shù)券躁,表示該函數(shù)的參數(shù)不是對象惩坑。
2)作為對象原型鏈的終點。
而Undefined類型中只有一個值就是undefined也拜。undefined表示缺少值以舒,即此處應(yīng)有一個值,但是還沒有定義慢哈。例如:
1)變量被聲明但還沒有賦值蔓钟,就是undefined。
2)調(diào)用函數(shù)時卵贱,應(yīng)該提供的參數(shù)沒有提供滥沫,該參數(shù)就等于undefined。
3)對象沒有復(fù)制的屬性键俱,該屬性的值就為undefined兰绣。
4)函數(shù)沒有返回值時,默認(rèn)返回值為undefined编振。
小知識點:
typeof(null)? //返回值為object缀辩;
typeof(undefined)? //返回值為undefined;
console.log(null == undefined) //結(jié)果為true;
console.log(null== undefined) //結(jié)果為false;
因此null和undefined兩者相等雌澄,但不完全相等斋泄。
22、new操作符具體做了什么呢
1镐牺、創(chuàng)建一個空對象炫掐,var obj = new Object();
2、讓空對象的原型屬性指向原型鏈obj.__proto__ = Func.prototype;
3睬涧、讓Func中的this指向obj响逢,并執(zhí)行Func的函數(shù)體。var result = Func.call(obj);
4豆拨、判斷Func的返回值類型:
如果是值類型张症,返回obj。如果是引用類型讶请,就返回這個引用類型的對象祷嘶。
if(typeof(result) == "object") {
func = result;
}else{
func = obj;
}
23、JavaScript延遲加載的方式有哪些
在<script>標(biāo)簽中的代碼夺溢,不論是嵌入代碼還是引用文件论巍,只要不包含defer和async屬性,瀏覽器就會按照<scripe>標(biāo)簽出現(xiàn)的順序?qū)λ麄円来芜M(jìn)行解析风响。也就是說執(zhí)行到這里的時候嘉汰,頁面的處理會暫時停止,一直等待該標(biāo)簽下載和解析完畢之后才會進(jìn)行后續(xù)的工作状勤。這樣的用戶體驗很不好鞋怀,因此才會有異步加載js的需求。
1持搜、defer屬性
html為<script>標(biāo)簽定義了defer屬性密似,表明腳本在執(zhí)行時不會影響頁面構(gòu)造。相當(dāng)于告訴瀏覽器可以立即下載葫盼,但是要延遲執(zhí)行辛友,也就是說腳本會延遲到整個頁面都解析完之后再執(zhí)行。有兩個注意點剪返,h5規(guī)范要求腳本按照他們出現(xiàn)的先后順序執(zhí)行废累。在現(xiàn)實中,延遲腳本并不一定按照順序執(zhí)行脱盲;defer屬性只適用于外部腳本邑滨,嵌入的html腳本會忽略defer屬性。
2钱反、async屬性
<script>標(biāo)簽同樣定義了async屬性掖看,與defer屬性相似都用于改變腳本的行為匣距。運行到含有async屬性的<script>標(biāo)簽時,會異步加載js文件哎壳,不會讓頁面等待腳本的下載和執(zhí)行毅待,但是在該腳本下載完成之后就會立即被執(zhí)行。注意點與defer一樣:只適用于外部腳本归榕;不能控制加載的順序尸红。
defer與async的區(qū)別:(1)defer是將js文件下載完成之后等到頁面完全處理完畢才執(zhí)行;async是在js下載完畢之后立即執(zhí)行刹泄,不管頁面有沒有處理完畢外里。(2)在執(zhí)行順序方面,由于defer屬性會在文件加載完成之后執(zhí)行特石,所以腳本會DOMContentLoaded事件之前執(zhí)行盅蝗。標(biāo)記為async的腳本并不保證按照指定他們的先后順序執(zhí)行,但可能會在DOMContentLoad事件觸發(fā)之前或之后執(zhí)行姆蘸。
3逞敷、動態(tài)創(chuàng)建DOM方式(Document Object Model? ? 文檔對象模型)
addEventListener()方法經(jīng)常用語向指定元素添加時間句柄贼穆。
removeEventLIstener()方法來移除addEventListener()添加的時間句柄。
語法:element.addEventListener(event,function,useCapture)
其中event(必須)字符串兰粉,指定時間名稱。注意不要用"on"作為前綴顶瞳。例如使用"click"而不是使用"onclick".
function(必須)指定事件觸發(fā)時執(zhí)行的函數(shù)玖姑。時間對象會作為第一個參數(shù)傳入函數(shù)。事件對象的類型取決于特定的函數(shù)慨菱。例如"click"事件屬于MouseEcent(鼠標(biāo)移動)事件焰络。
4、使用jQuery的getScript()方法
5符喝、使用setTimeout延遲方法
6闪彼、將js外部文件寫到頁面的最底部,使得js最后被引用协饲,從而加快頁面的加載速度畏腕。
提升頁面性能優(yōu)化
24、如何提高頁面的加載速度
1)減少http請求
2)使用CDN
3)將腳本放在底部
4)避免css表達(dá)式
5)使用外部的JavaScript和css
6)減少DNS查詢
7)避免重定向
原文網(wǎng)址:https://blog.csdn.net/wsymcxy/article/details/82377355
25茉稠、Flash和Ajax的優(yōu)缺點是什么描馅,如何取舍
Ajax對css、文本支持很好而线,支持搜索铭污;多媒體恋日。矢量圖形、機(jī)器訪問不足嘹狞。
Flash適合處理多媒體岂膳、矢量圖形、機(jī)器訪問磅网;多媒體谈截、矢量圖形、機(jī)器訪問不足知市。
二者的共同點:
1)與服務(wù)器無刷新傳遞消息
2)可以檢測用戶離線和在線狀態(tài)
3)操作DOM
26傻盟、Cookie在客戶機(jī)上是如何存儲的
1)cookie的概述
cookie是有http服務(wù)器設(shè)置的,保存在瀏覽器中嫂丙;是客戶端保存數(shù)據(jù)的一個小文件娘赴;是服務(wù)器發(fā)送給客戶端的小量信息;以鍵值對的形式進(jìn)行存儲的跟啤。cookie存儲的數(shù)據(jù)量是有限的诽表,不同的瀏覽器有不同的大小,但是一般來說不會超過40kb隅肥。因此cookie只能存儲一些小量數(shù)據(jù)竿奏。
2)cookie的作用:
①讓瀏覽器存儲指定的信息? ?②與session配合使用,完成會話跟蹤
原文網(wǎng)址:https://blog.csdn.net/Thor_Selen_Liu/article/details/81262023
27腥放、如何獲取JavaScript三個數(shù)中的最大值和最小值
答:
Math.max(a,b,c);//最大值
Math.min(a,b,c);//最小值
28泛啸、JavaScript是面向?qū)ο蟮模趺大w現(xiàn)JavaScript的繼承關(guān)系
答:使用prototype原型來實現(xiàn)
29秃症、from中的input可以設(shè)置為readonly和disabled候址,二者有什么區(qū)別
答:readonly和disabled都可以禁止用戶更改表單的內(nèi)容。比如都設(shè)置為true种柑,form屬性將不能被編輯岗仑。
二者的相同點如下:
都不能編輯和獲取焦點。
不同點如下:
1)readonly只針對input(text/password)和textarea有效聚请,而disabled對所有的表單元素都有效荠雕,包括select,radio驶赏,checkbox等炸卑。
2)表單在使用get或post方式提交時,設(shè)置為readonly的表單元素可以傳值到后臺煤傍;設(shè)置為disabled的表單元素不可以傳值到后臺矾兜。
3)所有控件都有disabled屬性,但不一定擁有readonly屬性患久。例如button按鈕就沒有readyonly屬性椅寺,設(shè)置為readonly也沒有作用浑槽,但是設(shè)置為disabled按鈕就沒辦法使用了。
30返帕、列舉JavaScript的三種主要數(shù)據(jù)類型桐玻,2種復(fù)合類型和2種特殊數(shù)據(jù)類型。
主要數(shù)據(jù)類型:string荆萤,boolean镊靴,number
復(fù)合數(shù)據(jù)類型:function,object
特殊類型:undefined链韭,null
31偏竟、程序中捕獲異常的方法
答:在ES3之前,如果js代碼在執(zhí)行時出現(xiàn)了錯誤敞峭,整個js代碼都會停止執(zhí)行踊谋,這樣的代碼是非常不健壯的。在java或c語言中旋讹,都提供了異常處理機(jī)制殖蚕,可以處理異常而不停止整個應(yīng)用程序。因此在ES3之后js也提供了類似的異常處理機(jī)制沉迹,從而讓代碼變得更加健壯睦疫。即使在執(zhí)行的過程中出現(xiàn)了異常,也讓程序具有一部分的異潮夼唬恢復(fù)的能力蛤育。
1、把有可能出現(xiàn)錯誤的代碼放在try語句中葫松,try語句理論上可以寫任何代碼瓦糕。只要有一行代碼出現(xiàn)問題,整個程序的執(zhí)行流程就會跳到catch語句中執(zhí)行进宝。如果try中的語句不出現(xiàn)錯誤則catch中的語句不會執(zhí)行。
2枷恕、一旦try中有一行代碼發(fā)生異常党晋,整個try語句中錯誤代碼后面的代碼就都不會執(zhí)行了。比如上述代碼中console.log(b)徐块;未玻,如果這行代碼出錯,則立即去執(zhí)行catch中對的代碼胡控。所以console.log("我不會輸出的扳剿,不要找了")這行代碼不會再執(zhí)行。
3昼激、在執(zhí)行catch中的代碼之前庇绽,js引擎首先會根據(jù)錯誤類型自動創(chuàng)建一個錯誤锡搜,并通過catch后面的參數(shù)傳遞到catch中。不同的瀏覽器創(chuàng)建的error對象不一樣瞧掺,但是他們都包含一個message屬性耕餐,值是這個錯誤的一些信息。
4辟狈、catch中的代碼執(zhí)行完畢之后肠缔,后繼續(xù)執(zhí)行后面的代碼,程序不會停止下來哼转。參考其他編程語言明未,也提供了一種finally語句。不管try中的語句有沒有錯誤壹蔓,最后都會執(zhí)行finally中的語句趟妥。
具體的執(zhí)行流程:如果try中的語句沒有出現(xiàn)錯誤,就會在try語句之后執(zhí)行finally語句庶溶;如果try中的語句出現(xiàn)錯誤煮纵,就跳轉(zhuǎn)去執(zhí)行catch語句,最后執(zhí)行finally語句偏螺。
原文網(wǎng)址https://blog.csdn.net/u012468376/article/details/57411822
32行疏、什么是單線程和多線程
javaScript語言的一大特點就是單線程,也就是說同一個時間只能做一件事套像。為什么JavaScript不能有多個線程呢酿联?這樣能提高相率啊。
JavaScript的單線程夺巩,與他的用途有關(guān)贞让。作為瀏覽器腳本語言,JavaScript的主要用途是與用戶進(jìn)行互動以及操作DOM柳譬。這決定了它只能單線程喳张,否則會帶來很多復(fù)雜的問題。假設(shè)JavaScript同時又兩個線程美澳,一個線程在某個DOM節(jié)點上添加內(nèi)容销部,另一個線程刪除了這個節(jié)點,這時瀏覽器會以哪個線程為準(zhǔn)呢制跟?
所以為了避免復(fù)雜性舅桩,從誕生開始JavaScript就是單線程。這已經(jīng)成為了這門語言的核心特征雨膨,將來也不會改變擂涛。為了利用多核cpu的計算能力,html5提出Web Worker標(biāo)準(zhǔn)聊记,允許JavaScript腳本創(chuàng)建多個線程撒妈,但是子線程完全受主線程的控制恢暖,而且不能操作DOM。所以這個新標(biāo)準(zhǔn)并沒有改變JavaScript單線程的本質(zhì)踩身。
33胀茵、什么是同步任務(wù),什么是異步任務(wù)
js單線程意味著所有的任務(wù)都要排隊挟阻,前一個任務(wù)結(jié)束才會執(zhí)行后一個任務(wù)琼娘。如果前一個任務(wù)耗時很長,后一個任務(wù)就要一直等著附鸽。如果是因為計算量大脱拼,cpu忙不過來倒也算了,但很多時候cpu在閑著坷备,是因為IO設(shè)備(輸入輸出設(shè)備)很慢熄浓,不得不等著結(jié)果出來再往下執(zhí)行。
JavaScript語言的設(shè)計者意識到省撑,這時主線程完全可以不管IOS設(shè)備赌蔑,掛起處于等待中的任務(wù),先運行排在后面的任務(wù)竟秫。等到IO設(shè)備返回了結(jié)果娃惯,再回過頭把掛起的任務(wù)繼續(xù)執(zhí)行下去。
于是所有的任務(wù)可以分為兩種肥败,一種是同步任務(wù)(synchronous),另一種是異步任務(wù)(asynchronous)趾浅。同步任務(wù)是指,在主線程上排隊執(zhí)行的任務(wù)馒稍,只有前一個任務(wù)完成才能執(zhí)行后一個任務(wù)皿哨;異步任務(wù)是指,不進(jìn)入主程序纽谒、而進(jìn)入”任務(wù)隊列“的任務(wù)证膨,只有“任務(wù)隊列”通知主線程,某個異步任務(wù)可以執(zhí)行了鼓黔,該任務(wù)才會進(jìn)入主線程執(zhí)行央勒。
具體來說異步執(zhí)行的機(jī)制如下:
上面代碼執(zhí)行的結(jié)果總是2,1请祖,因為只有在執(zhí)行第二行以后订歪,系統(tǒng)才會執(zhí)行“任務(wù)隊列”中的回調(diào)函數(shù)脖祈。
原文網(wǎng)址http://www.ruanyifeng.com/blog/2014/10/event-loop.html
34肆捕、Ajax的原理
答:AJAX的全稱是"Asynchronous JavaScript and XML"(異步JavaScript和XML),是一種創(chuàng)建交互式網(wǎng)頁應(yīng)用的網(wǎng)頁開發(fā)技術(shù)盖高。通過在后臺與服務(wù)器進(jìn)行少量的數(shù)據(jù)交換慎陵,可以使網(wǎng)頁實現(xiàn)異步更新眼虱。也就是意味著可以再不重新加載整個網(wǎng)頁的情況下,對網(wǎng)頁的某部分進(jìn)行更新席纽。
優(yōu)點:
1.最大的優(yōu)點就是頁面無需刷新捏悬,在頁面內(nèi)與服務(wù)器進(jìn)行通信,非常好的用戶體驗润梯。
2.使用異步的操作與服務(wù)器進(jìn)行通信过牙,不需要終端操作。
3.可以把以前服務(wù)器負(fù)擔(dān)的工作轉(zhuǎn)嫁給客戶端纺铭,減輕服務(wù)器和帶寬寇钉,最大限度的減少冗余請求。
4.基于標(biāo)準(zhǔn)化的并被廣泛支持的技術(shù)舶赔,不需要下載小插件或者小程序扫倡。
缺點:
1.ajax干掉了Back和History功能,即對瀏覽器的機(jī)制的破壞竟纳。在動態(tài)更新頁面的情況下撵溃,用戶無法返回前一個狀態(tài),因為瀏覽器只能記住歷史記錄中的靜態(tài)頁面锥累。一個被完整讀入的頁面與一個已經(jīng)被動態(tài)修改過的頁面之間的差距非常微妙缘挑,用戶通常會希望單機(jī)后退按鈕取消前一次操作,但是在ajax應(yīng)用中揩悄,這將無法實現(xiàn)卖哎。
2.安全問題也為it企業(yè)帶來了新的安全威脅,ajax技術(shù)就如同對企業(yè)數(shù)據(jù)建立了一個直接通到删性。這使得開發(fā)者會在不經(jīng)意間透露比以前更多的數(shù)據(jù)和服務(wù)器邏輯亏娜。ajax的邏輯可以對客戶端的安全掃描技術(shù)隱藏起來,允許黑客從遠(yuǎn)端服務(wù)器上進(jìn)行安全攻擊蹬挺。
3.對搜索引擎的支持比較弱维贺。如果使用不當(dāng),ajax會增大網(wǎng)絡(luò)數(shù)據(jù)的流量巴帮,從而降低整個系統(tǒng)的性能溯泣。
35、Ajax原理
36榕茧、解釋一下什么是json
答:
1)json是一種輕量級的數(shù)據(jù)交換格式垃沦。
2)json獨立于語言和平臺,json解析器和json庫支持許多不同的編程語言用押。
3)json的語法表示三種類型值 :簡單值(字符串肢簿、數(shù)值、布爾值、null)池充,數(shù)組桩引,對象
37、js中三種彈出式消息提醒(警告窗口收夸、確認(rèn)窗口坑匠、信息輸入窗口)的命令是什么
答:alert、confirm卧惜、prompt
38厘灼、瀏覽器的滾動距離
答:可視區(qū)域距離頁面頂部的距離
scrollTop = document.documentElement.scrollTop||document.body.scrollTop
39、節(jié)點類型有幾種咽瓷,分別是什么
答:一般來說手幢,每個節(jié)點都擁有nodeType(節(jié)點類型)、nodeName(節(jié)點名稱)和nodeValue(節(jié)點值)這三個屬性忱详。nodeType屬性返回節(jié)點類型的常數(shù)值围来。
一共有12中節(jié)點類型,但其中一部分已經(jīng)棄用(2匈睁、4监透、5、6航唆、12)胀蛮。其中經(jīng)常用到的:
1)元素節(jié)點:nodeType === 1;
2)文本節(jié)點:nodeType === 3糯钙;
3)屬性節(jié)點:nodeType === 2粪狼;
40、innerHTML和outerHTML有什么區(qū)別
答:
innerHTML:元素內(nèi)包含的內(nèi)容
outerHTML:自己及元素內(nèi)包含的內(nèi)容
41任岸、offsetWidth offsetHeight和clientWidth clientHeight的區(qū)別
答:
(1)offsetWidth (content寬度+padding寬度+border寬度)
(2)offsetHeight(content高度+padding高度+border高度)
(3)clientWidth(content寬度+padding寬度)
(4)clientHeight(content高度+padding高度)
42再榄、冒泡排序算法
答:
43、真實DOM及其解析流程
答:瀏覽器渲染引擎工作流程都差不多享潜,大致分為五步困鸥,創(chuàng)建DOM樹——創(chuàng)建StyleRules——創(chuàng)建Render樹——布局Layout——繪制Painting。
第一步剑按,用HTML分析器分析html元素疾就,構(gòu)建一棵DOM樹(標(biāo)記化和樹構(gòu)建)。
第二步艺蝴,用CSS分析器猬腰,分析CSS文件和元素上的inline樣式,生成頁面的樣式表猜敢。
第三步姑荷,將DOM樹和樣式表關(guān)聯(lián)起來侮攀,構(gòu)建一棵Render樹(這一過程又被稱為renderer)。每個dom節(jié)點都有attach方法厢拭,接收樣式信息,返回一個render對象撇叁。這些render對象最終會被構(gòu)建成一棵Render樹供鸠。
第四步,有了Render樹陨闹,瀏覽器開始布局楞捂,為每個Render樹上的節(jié)點確定一個在顯示屏上出現(xiàn)的精確坐標(biāo)。
第五步趋厉,Render樹和節(jié)點顯示坐標(biāo)都有了寨闹,就調(diào)用每個節(jié)點paint方法,把他們繪制出來君账。
44繁堡、為什么要使用虛擬DOM,它有什么好處
答: Web界面由DOM樹(樹的意思是數(shù)據(jù)結(jié)構(gòu))來構(gòu)建乡数,當(dāng)其中一部分發(fā)生變化是椭蹄,其實就是對應(yīng)某個DOM節(jié)點發(fā)生了變化。
虛擬DOM就是為了解決瀏覽器性能問題而被設(shè)計出來的净赴。在以前绳矩,若一次造作中由十次更新DOM的動作,虛擬DOM不會立即操作DOM玖翅,而是將這10次更新的differ內(nèi)容保存到本地的一個js對象中翼馆,最終將這個js對象一次性的attach到DOM樹上,然后再進(jìn)行后續(xù)操作金度,避免大量無謂的計算应媚。
所以使用js對象模擬DOM節(jié)點的好處是,頁面的更新可以先全部反映在js對象(許你DOM)上猜极,操作內(nèi)存中js對象的速度顯然更快珍特,等更新完成后,再將最終的js對象映射成真是的DOM魔吐,交由瀏覽器去繪制扎筒。
45、jsji基礎(chǔ)數(shù)據(jù)類型和引用類型是什么酬姆?這個前提下寫一個getType嗜桌,返回相應(yīng)的類型。
答:
基本數(shù)據(jù)類型:Number辞色、String骨宠、Boolean、Null、Undefined层亿、symbol
引用數(shù)據(jù)類型:Object(Array桦卒、Date、Function)
46匿又、DOM選擇器的優(yōu)先級別是什么方灾,權(quán)重是多少
答:
1.行內(nèi)樣式? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1000
2.id選擇器? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0100
3.類選擇器、偽類選擇器碌更、屬性選擇器[type = 'text']? ? 0010
4.標(biāo)簽選擇器裕偿、偽元素選擇器(::first-line)? ? ? ? ? ? ? ? ?0001
5.通配符選擇器(*)、子選擇器痛单、相鄰選擇器? ? ? ? ? ? 0000
47嘿棘、JavaScript的七種數(shù)據(jù)類型
答:
js在1997年標(biāo)準(zhǔn)化以后,定義了六種數(shù)據(jù)類型旭绒,包括五種原始值和一種引用值鸟妙;ES6又新增了一種原始類型——symbol。
六種原始值:number挥吵、string圆仔、boolean、null蔫劣、undefined坪郭、symbol
(symbol表示獨一無二的值,symbol的最大用途是用來定義對象的唯一屬性名脉幢。ES5的對象屬性名都是字符串歪沃,容易造成屬性名的沖突。如果使用了一個他人提供的對象嫌松,但又想為其添加新的方法沪曙,那么新方法的名字可能與已有的方法產(chǎn)生沖突。因此需要保證每個屬性的名字都是獨一無二的萎羔,以防止屬性名的沖突液走。這就是ES6引入Symbol的原因。)
引用值:
Object:在js中贾陷,除了原始類型缘眶,其他的都是對象類型。原始類型和對象類型不一樣髓废,原始類型存儲在棧中巷懈,對象類型是存儲在堆中;原始值存儲的是值慌洪,對象類型存儲的是地址(指針)顶燕。
48凑保、講一下prototype是什么東西,原型鏈的理解涌攻,什么時候用到prototype
答:原型是function對象的一個屬性欧引,它定義了構(gòu)造函數(shù)制造出對象的公共祖先。通過該構(gòu)造函數(shù)構(gòu)造出的對象恳谎,可以繼承該原型的屬性和方法芝此。原型也是對象。
constructor屬性:指向該函數(shù)的構(gòu)造函數(shù)惠爽。
49、函數(shù)里面的this什么含義瞬哼,什么情況下婚肆,怎么用
50、數(shù)組和對象有哪些原生方法坐慰,列舉一下较性,分別是什么含義,比如連接兩個數(shù)組用哪個方法结胀,刪除數(shù)組指定項和重新組裝數(shù)組(操作數(shù)據(jù)的重點)
51赞咙、vue雙向數(shù)據(jù)綁定的原理是什么
答:?首先傳輸對象的雙向數(shù)據(jù)綁定 Object.defineProperty(target, key, decription),在decription中設(shè)置get和set屬性(此時應(yīng)注意description中g(shù)et和set不能與描述屬性共存)
數(shù)組的實現(xiàn)與對象不同。
同時運用觀察者模式實現(xiàn)wather糟港,用戶數(shù)據(jù)和view視圖的更新
52攀操、JavaScript中的定時器有哪些,他們的區(qū)別及用法是什么
答:setTimeout? ?只執(zhí)行一次
? ? ? ?setInterval? ? 會一直重復(fù)執(zhí)行
53秸抚、請描述一下cookies速和、session Storage和local Storage的相同點和不同點
答:
相同點:都存儲在客戶端
不同點:
1)存儲大小
cookies的數(shù)據(jù)大小不能超過4k
session Storage和local Storage雖然也有存儲大小的限制,但比cookie大得多剥汤,可以達(dá)到5M或更大颠放。
2)有效時間
cookie在設(shè)置的過期時間之前一直有效,即使窗口或瀏覽器關(guān)閉吭敢。
session Storage數(shù)據(jù)在當(dāng)前瀏覽器窗口關(guān)閉之后自動刪除碰凶。
local Storage存儲用舊數(shù)據(jù),瀏覽器關(guān)閉后數(shù)據(jù)也不會丟失鹿驼,除非主動刪除數(shù)據(jù)欲低。
3)數(shù)據(jù)與服務(wù)器之間的交互方式
cookie的數(shù)據(jù)會自動傳遞到服務(wù)器,服務(wù)器端也可以寫cookie到客戶端畜晰。
session Storage和local Storage不會自動把數(shù)據(jù)發(fā)送給服務(wù)器伸头,只會在本地保存。
54舷蟀、計算一個數(shù)組arr所有元素的和
答:
var arr = [1,2,3,4,5,6,7,8,9],
? ? sum = 0,
? ? len = arr.length;
for(i = 0; i < len; i++) {
? ? if(typeof(arr[i]) == "number") {
? ? ? ? sum += arr[i];
? ? }
}
console.log(sum);
51恤磷、數(shù)組去重
var arr = [1,2,3,1,2,3];
? ? Array.prototype.unique = function () {
? ? ? ? //temp進(jìn)行驗證面哼,arr存儲數(shù)據(jù)
? ? ? ? var temp = {};
? ? ? ? ? ? arr = [];
? ? ? ? ? ? len = this.length;
? ? ? ? for(var i = 0; i < len; i++) {
? ? ? ? ? ? if(!temp[this[i]]) {
? ? ? ? ? ? ? ? temp[this[i]] = "abc";
? ? ? ? ? ? ? ? arr.push(this[i]);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return arr;
? ? }
? ? alert(arr.unique());
55、document.write和innerHTML的區(qū)別
答:主要區(qū)別:document.write是直接將內(nèi)容寫入頁面的內(nèi)容流扫步,會導(dǎo)致頁面全部重繪魔策,innerHTML將內(nèi)容寫入某個DOM節(jié)點,不會導(dǎo)致頁面全部重繪河胎。
document.write是直接寫入到頁面的內(nèi)容流闯袒,如果在寫之前沒有調(diào)用document.open, 瀏覽器會自動調(diào)用open。每次寫完關(guān)閉之后重新調(diào)用該函數(shù)游岳,會導(dǎo)致頁面被重寫政敢。
innerHTML則是DOM頁面元素的一個屬性,代表該元素的html內(nèi)容胚迫。你可以精確到某一個具體的元素來進(jìn)行更改喷户。如果想修改document的內(nèi)容,則需要修改document.documentElement.innerElement访锻。innerHTML將內(nèi)容寫入某個DOM節(jié)點褪尝,不會導(dǎo)致頁面全部重繪。
innerHTML很多情況下都優(yōu)于document.write期犬,其原因在于其允許更精確的控制要刷新頁面的那一個部分河哑。
原文地址https://www.cnblogs.com/lyd447113735/p/8856982.html
56、簡述一下跨域及其解決方式
57龟虎、什么是mvvm和mvc璃谨,兩者有什么區(qū)別
答:MVVM即Model-View-ViewModel的簡寫。即模型-視圖-視圖模型鲤妥。模型(Model)指的是后端傳遞的數(shù)據(jù)创肥。視圖(View)指的是所看到的頁面歉嗓。視圖模型(ViewModel)是mvvm模式的核心,它是連接view和model的橋梁。它有兩個方向:一是將模型(Model)轉(zhuǎn)化成視圖(View)埠偿,即將后端傳遞的數(shù)據(jù)轉(zhuǎn)化成所看到的頁面灰追。實現(xiàn)的方式是:數(shù)據(jù)綁定布近。二是將視圖(View)轉(zhuǎn)化成模型(Model)执虹,即將所看到的頁面轉(zhuǎn)化成后端的數(shù)據(jù)。實現(xiàn)的方式是:DOM 事件監(jiān)聽菇爪。這兩個方向都實現(xiàn)的算芯,我們稱之為數(shù)據(jù)的雙向綁定。
MVC是Model-View- Controller的簡寫凳宙。即模型-視圖-控制器熙揍。M和V指的意思和MVVM中的M和V意思一樣。C即Controller指的是頁面業(yè)務(wù)邏輯氏涩。使用MVC的目的就是將M和V的代碼分離届囚。MVC是單向通信有梆。也就是View跟Model,必須通過Controller來承上啟下意系。MVC和MVVM的區(qū)別并不是VM完全取代了C泥耀,只是在MVC的基礎(chǔ)上增加了一層VM,只不過是弱化了C的概念蛔添,ViewModel存在目的在于抽離Controller中展示的業(yè)務(wù)邏輯痰催,而不是替代Controller,其它視圖操作業(yè)務(wù)等還是應(yīng)該放在Controller中實現(xiàn)迎瞧。也就是說MVVM實現(xiàn)的是業(yè)務(wù)邏輯組件的重用夸溶,使開發(fā)更高效,結(jié)構(gòu)更清晰凶硅,增加代碼的復(fù)用性缝裁。
58、px和rem的區(qū)別
答:
1.px是相對長度單位咏尝。像素px是相對于顯示屏幕的分辨率而言的压语。
2.em是相對長度單位啸罢。相對于父級字體尺寸编检,會疊加(繼承父級元素字體大小)扰才。
3.rem是相對單位長度允懂,但是相對于根元素字體尺寸。這是css3中新增的一個相對單位(root em 根em)衩匣,與em區(qū)別在于使用rem為元素設(shè)定字體大小時蕾总,仍然是相對大小,但相對的事HTML根元素琅捏。
59生百、解釋一下JavaScript的同源策略
答:限制從一個源加載的文檔或腳本如何與來自另一個源的資源進(jìn)行交互。這是一個用于隔離潛在惡意文件的關(guān)鍵的安全機(jī)制柄延。(來自MDN官方的解釋)
簡單來說就是:一段腳本只能讀取來自于同一來源的窗口和文檔的屬性蚀浆,這里的同一來源指的是主機(jī)名、協(xié)議和端口號的組合
具體解釋:
(1)源包括三個部分:協(xié)議搜吧、域名市俊、端口(http協(xié)議的默認(rèn)端口是80)。如果有任何一個部分不同滤奈,則源不同摆昧,那就是跨域了。
(2)限制:這個源的文檔沒有權(quán)利去操作另一個源的文檔蜒程。這個限制體現(xiàn)在:(要記咨鹉恪)
Cookie伺帘、LocalStorage和IndexDB無法獲取。
無法獲取和操作DOM勇吊。
不能發(fā)送Ajax請求曼追。我們要注意,Ajax只適合同源的通信汉规。
同源策略帶來的麻煩:ajax在不同域名下的請求無法實現(xiàn)礼殊。
60、優(yōu)雅降級和漸進(jìn)增強(qiáng)
答:
優(yōu)雅降級 graceful degradation:一開始就構(gòu)建完整的功能针史,然后再針對低版本瀏覽器進(jìn)行兼容晶伦。
漸進(jìn)增強(qiáng) progressive enhancement:針對低版本瀏覽器進(jìn)行構(gòu)建頁面,保證最基本的功能啄枕,然后再針對高級瀏覽器進(jìn)行效果婚陪、交互等改進(jìn)和追加功能達(dá)到更好的用戶體驗。
區(qū)別:優(yōu)雅降級是從復(fù)雜的現(xiàn)狀開始频祝,并試圖減少用戶體驗的供給泌参,而漸進(jìn)增強(qiáng)則是從一個非常基礎(chǔ)的常空,能夠起作用的版本開始沽一,并不斷擴(kuò)充,以適應(yīng)未來環(huán)境的需要漓糙。降級(功能衰減)意味著往回看铣缠;而漸進(jìn)增強(qiáng)則意味著朝前看,同時保證其根基處于安全地帶昆禽。
61蝗蛙、怎樣添加、移除醉鳖、移動捡硅、復(fù)制、創(chuàng)建和查找節(jié)點
答:
1)創(chuàng)建新節(jié)點
createDocumentFragment()//創(chuàng)建一個dom片段
createElement()//創(chuàng)建一個元素節(jié)點
createTextNode()//創(chuàng)建一個文本節(jié)點
2)添加盗棵、移動壮韭、替換、輸入
appendChild()//添加
removeChild()//移動
replaceChild()//替換
insertBefore()//插入
3)查找
getElementsByTagName()//通過標(biāo)簽名稱
getElementsByName()//通過元素的name屬性的值
getElementById()//通過元素id漾根,唯一性
61泰涂、從輸入url到顯示頁面都發(fā)生了什么
答:
1.瀏覽器的地址欄輸入url并按下回車
2.瀏覽器查找當(dāng)前url是否存在緩存,并比較緩存是否過期
3.DNS解析url對應(yīng)的ip
4.根據(jù)ip建立tcp連接(三次握手)
5.HTTP發(fā)送請求
6.服務(wù)器處理請求辐怕,瀏覽器接收HTTP響應(yīng)
7.渲染頁面逼蒙,構(gòu)建DOM樹
8.關(guān)閉TCP連接(四次握手)