閱讀目錄
本篇收錄了一些面試中經(jīng)常會遇到的經(jīng)典面試題以及自己面試過程中遇到的一些問題,并且都給出了我在網(wǎng)上收集的答案昆稿。馬上就要過春節(jié)了侠碧,開年就是嶄新的一年硝枉,相信很多的前端開發(fā)者會有一些跳槽的悸動,通過對本篇知識的整理以及經(jīng)驗(yàn)的總結(jié)倦微,希望能幫到更多的前端面試者妻味。(如有錯(cuò)誤或更好的答案,歡迎指正欣福,水平有限责球,望各位不吝指教。:)
另外拓劝,宣傳一下自己發(fā)布不久的一個(gè)前端vue的項(xiàng)目:基于vue2.0 +vuex+ element-ui后臺管理系統(tǒng)雏逾。希望有興趣的同學(xué),可以一起共同學(xué)習(xí)郑临。
javascript:
JavaScript中如何檢測一個(gè)變量是一個(gè)String類型栖博?請寫出函數(shù)實(shí)現(xiàn)
方法 1
function isString(obj){
return typeof(obj) === "string"? true: false;
}
方法2
function isString(obj){
return obj.constructor === String? true: false;
}
方法3.
function isString(obj){
return Object.prototype.toString.call(obj) === "[object String]"?true:false;
}
如:
var isstring = isString('xiaoming');
console.log(isstring); // true
請用js去除字符串空格?
方法一:使用replace正則匹配的方法
去除所有空格: str = str.replace(/\s*/g,"");
去除兩頭空格: str = str.replace(/^\s|\s$/g,"");
去除左空格: str = str.replace( /^\s*/, “”);
去除右空格: str = str.replace(/(\s*$)/g, "");
str為要去除空格的字符串牧抵,實(shí)例如下:
var str = " 23 23 ";
var str2 = str.replace(/\s*/g,"");
console.log(str2); // 2323
方法二:使用str.trim()方法
str.trim()局限性:無法去除中間的空格笛匙,實(shí)例如下:
var str = " xiao ming ";
var str2 = str.trim();
console.log(str2); //xiao ming
同理,str.trimLeft()犀变,str.trimRight()分別用于去除字符串左右空格妹孙。
方法三:使用jquery,$.trim(str)方法
$.trim(str)局限性:無法去除中間的空格,實(shí)例如下:
var str = " xiao ming ";
var str2 = $.trim(str)
console.log(str2); // xiao ming
你如何獲取瀏覽器URL中查詢字符串中的參數(shù)获枝?
測試地址為:http://www.runoob.com/jquery/misc-trim.html?channelid=12333&name=xiaoming&age=23
實(shí)例如下:
function showWindowHref(){
var sHref = window.location.href;
var args = sHref.split('?');
if(args[0] == sHref){
return "";
}
var arr = args[1].split('&');
var obj = {};
for(var i = 0;i< arr.length;i++){
var arg = arr[i].split('=');
obj[arg[0]] = arg[1];
}
return obj;
}
var href = showWindowHref(); // obj
console.log(href['name']); // xiaoming
js ****字符串操作函數(shù)
我這里只是列舉了常用的字符串函數(shù)蠢正,具體使用方法,請參考網(wǎng)址省店。
concat() – 將兩個(gè)或多個(gè)字符的文本組合起來嚣崭,返回一個(gè)新的字符串。
indexOf() – 返回字符串中一個(gè)子串第一處出現(xiàn)的索引懦傍。如果沒有匹配項(xiàng)雹舀,返回 -1 。
charAt() – 返回指定位置的字符粗俱。
lastIndexOf() – 返回字符串中一個(gè)子串最后一處出現(xiàn)的索引说榆,如果沒有匹配項(xiàng),返回 -1 寸认。
match() – 檢查一個(gè)字符串是否匹配一個(gè)正則表達(dá)式签财。
substr() 函數(shù) -- 返回從string的startPos位置,長度為length的字符串
substring() – 返回字符串的一個(gè)子串偏塞。傳入?yún)?shù)是起始位置和結(jié)束位置唱蒸。
slice() – 提取字符串的一部分,并返回一個(gè)新字符串灸叼。
replace() – 用來查找匹配一個(gè)正則表達(dá)式的字符串神汹,然后使用新字符串代替匹配的字符串庆捺。
search() – 執(zhí)行一個(gè)正則表達(dá)式匹配查找。如果查找成功屁魏,返回字符串中匹配的索引值疼燥。否則返回 -1 。
split() – 通過將字符串劃分成子串蚁堤,將一個(gè)字符串做成一個(gè)字符串?dāng)?shù)組醉者。
length – 返回字符串的長度,所謂字符串的長度是指其包含的字符的個(gè)數(shù)披诗。
toLowerCase() – 將整個(gè)字符串轉(zhuǎn)成小寫字母撬即。
toUpperCase() – 將整個(gè)字符串轉(zhuǎn)成大寫字母。
怎樣添加呈队、移除剥槐、移動、復(fù)制宪摧、創(chuàng)建和查找節(jié)點(diǎn)粒竖?
1)創(chuàng)建新節(jié)點(diǎn)
createDocumentFragment() //創(chuàng)建一個(gè)DOM片段
createElement() //創(chuàng)建一個(gè)具體的元素
createTextNode() //創(chuàng)建一個(gè)文本節(jié)點(diǎn)
2)添加、移除几于、替換蕊苗、插入
appendChild() //添加
removeChild() //移除
replaceChild() //替換
insertBefore() //插入
3)查找
getElementsByTagName() //通過標(biāo)簽名稱
getElementsByName() //通過元素的Name屬性的值
getElementById() //通過元素Id,唯一性
寫出3個(gè)使用this的典型應(yīng)用
(1)沿彭、在html元素事件屬性中使用朽砰,如:
<pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"><input type=”button” onclick=”showInfo(this);” value=”點(diǎn)擊一下”/></pre>
(2)、構(gòu)造函數(shù)
function Animal(name, color) {
this.name = name;
this.color = color;
}
(3)喉刘、input點(diǎn)擊瞧柔,獲取值
<input type="button" id="text" value="點(diǎn)擊一下" />
<script type="text/javascript">
var btn = document.getElementById("text");
btn.onclick = function() {
alert(this.value); //此處的this是按鈕元素
}
</script>
(4)、apply()/call()求數(shù)組最值
var numbers = [5, 458 , 120 , -215 ];
var maxInNumbers = Math.max.apply(this, numbers);
console.log(maxInNumbers); // 458
var maxInNumbers = Math.max.call(this,5, 458 , 120 , -215);
console.log(maxInNumbers); // 458
比較typeof與instanceof睦裳?
相同點(diǎn):JavaScript 中 typeof 和 instanceof 常用來判斷一個(gè)變量是否為空造锅,或者是什么類型的。
typeof的定義和用法:返回值是一個(gè)字符串廉邑,用來說明變量的數(shù)據(jù)類型哥蔚。
細(xì)節(jié):
(1)、typeof 一般只能返回如下幾個(gè)結(jié)果:number,boolean,string,function,object,undefined鬓催。
(2)肺素、typeof 來獲取一個(gè)變量是否存在恨锚,如 if(typeof a!="undefined"){alert("ok")}宇驾,而不要去使用 if(a) 因?yàn)槿绻?a 不存在(未聲明)則會出錯(cuò)。
(3)猴伶、對于 Array,Null 等特殊對象使用 typeof 一律返回 object课舍,這正是 typeof 的局限性塌西。
Instanceof定義和用法:instanceof 用于判斷一個(gè)變量是否屬于某個(gè)對象的實(shí)例。
實(shí)例演示:
a instanceof b?alert("true"):alert("false"); //a是b的實(shí)例筝尾?真:假
var a = new Array();
alert(a instanceof Array); // true
alert(a instanceof Object) // true</pre>
如上捡需,會返回 true,同時(shí) alert(a instanceof Object) 也會返回 true;這是因?yàn)?Array 是 object 的子類筹淫。
<pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">function test(){};
var a = new test();
alert(a instanceof test) // true
細(xì)節(jié):
(1)站辉、如下,得到的結(jié)果為‘N’,這里的 instanceof 測試的 object 是指 js 語法中的 object损姜,不是指 dom 模型對象饰剥。
if (window instanceof Object){ alert('Y')} else { alert('N');} // 'N'
如何理解閉包?
1摧阅、定義和用法:當(dāng)一個(gè)函數(shù)的返回值是另外一個(gè)函數(shù)汰蓉,而返回的那個(gè)函數(shù)如果調(diào)用了其父函數(shù)內(nèi)部的其它變量,如果返回的這個(gè)函數(shù)在外部被執(zhí)行棒卷,就產(chǎn)生了閉包顾孽。
2、表現(xiàn)形式:使函數(shù)外部能夠調(diào)用函數(shù)內(nèi)部定義的變量比规。
3若厚、實(shí)例如下:
(1)、根據(jù)作用域鏈的規(guī)則蜒什,底層作用域沒有聲明的變量盹沈,會向上一級找,找到就返回吃谣,沒找到就一直找乞封,直到window的變量,沒有就返回undefined岗憋。這里明顯count 是函數(shù)內(nèi)部的flag2 的那個(gè)count 肃晚。
var count=10; //全局作用域 標(biāo)記為flag1
function add(){
var count=0; //函數(shù)全局作用域 標(biāo)記為flag2
return function(){
count+=1; //函數(shù)的內(nèi)部作用域
alert(count);
}
}
var s = add()
s();//輸出1
s();//輸出2]
4、變量的作用域
要理解閉包仔戈,首先必須理解Javascript特殊的變量作用域关串。
變量的作用域分類:全局變量和局部變量。
特點(diǎn):
1监徘、函數(shù)內(nèi)部可以讀取函數(shù)外部的全局變量晋修;在函數(shù)外部無法讀取函數(shù)內(nèi)的局部變量。
2凰盔、函數(shù)內(nèi)部聲明變量的時(shí)候墓卦,一定要使用var命令。如果不用的話户敬,你實(shí)際上聲明了一個(gè)全局變量落剪!
5睁本、使用閉包的注意點(diǎn)
1)濫用閉包,會造成內(nèi)存泄漏:由于閉包會使得函數(shù)中的變量都被保存在內(nèi)存中忠怖,內(nèi)存消耗很大呢堰,所以不能濫用閉包,否則會造成網(wǎng)頁的性能問題凡泣,在IE中可能導(dǎo)致內(nèi)存泄露枉疼。解決方法是,在退出函數(shù)之前鞋拟,將不使用的局部變量全部刪除往衷。
2)會改變父函數(shù)內(nèi)部變量的值。所以严卖,如果你把父函數(shù)當(dāng)作對象(object)使用席舍,把閉包當(dāng)作它的公用方法(Public Method),把內(nèi)部變量當(dāng)作它的私有屬性(private value)哮笆,這時(shí)一定要小心来颤,不要隨便改變父函數(shù)內(nèi)部變量的值。
什么是跨域稠肘?跨域請求資源的方法有哪些福铅?
1、什么是跨域项阴?
由于瀏覽器同源策略滑黔,凡是發(fā)送請求url的協(xié)議、域名环揽、端口三者之間任意一與當(dāng)前頁面地址不同即為跨域略荡。存在跨域的情況:
網(wǎng)絡(luò)協(xié)議不同,如http協(xié)議訪問https協(xié)議歉胶。
端口不同汛兜,如80端口訪問8080端口。
域名不同通今,如qianduanblog.com訪問baidu.com粥谬。
子域名不同,如abc.qianduanblog.com訪問def.qianduanblog.com辫塌。
域名和域名對應(yīng)ip,如www.a.com訪問20.205.28.90.
2漏策、跨域請求資源的方法:
(1)、porxy代理
定義和用法:proxy代理用于將請求發(fā)送給后臺服務(wù)器臼氨,通過服務(wù)器來發(fā)送請求掺喻,然后將請求的結(jié)果傳遞給前端。
實(shí)現(xiàn)方法:通過nginx代理;
注意點(diǎn):1巢寡、如果你代理的是https協(xié)議的請求,那么你的proxy首先需要信任該證書(尤其是自定義證書)或者忽略證書檢查椰苟,否則你的請求無法成功抑月。
(2)、CORS 【Cross-Origin Resource Sharing】
定義和用法:是現(xiàn)代瀏覽器支持跨域資源請求的一種最常用的方式舆蝴。
使用方法:一般需要后端人員在處理請求數(shù)據(jù)的時(shí)候谦絮,添加允許跨域的相關(guān)操作。如下:
res.writeHead(200, {
"Content-Type": "text/html; charset=UTF-8",
"Access-Control-Allow-Origin":'http://localhost',
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
'Access-Control-Allow-Headers': 'X-Requested-With, Content-Type'
});
(3)洁仗、jsonp
定義和用法:通過動態(tài)插入一個(gè)script標(biāo)簽层皱。瀏覽器對script的資源引用沒有同源限制,同時(shí)資源加載到頁面后會立即執(zhí)行(沒有阻塞的情況下)赠潦。
特點(diǎn):通過情況下叫胖,通過動態(tài)創(chuàng)建script來讀取他域的動態(tài)資源,獲取的數(shù)據(jù)一般為json格式她奥。
實(shí)例如下:
<script>
function testjsonp(data) {
console.log(data.name); // 獲取返回的結(jié)果
}
</script>
<script>
var _script = document.createElement('script');
_script.type = "text/javascript";
_script.src = "http://localhost:8888/jsonp?callback=testjsonp";
document.head.appendChild(_script);
</script>
缺點(diǎn):
1瓮增、這種方式無法發(fā)送post請求(這里)
2、另外要確定jsonp的請求是否失敗并不容易哩俭,大多數(shù)框架的實(shí)現(xiàn)都是結(jié)合超時(shí)時(shí)間來判定绷跑。
談?wù)劺厥諜C(jī)制方式及內(nèi)存管理
回收機(jī)制方式
1、定義和用法:垃圾回收機(jī)制(GC:Garbage Collection),執(zhí)行環(huán)境負(fù)責(zé)管理代碼執(zhí)行過程中使用的內(nèi)存凡资。
2砸捏、原理:垃圾收集器會定期(周期性)找出那些不在繼續(xù)使用的變量,然后釋放其內(nèi)存隙赁。但是這個(gè)過程不是實(shí)時(shí)的判帮,因?yàn)槠溟_銷比較大壳繁,所以垃圾回收器會按照固定的時(shí)間間隔周期性的執(zhí)行。
3、實(shí)例如下:
function fn1() {
var obj = {name: 'hanzichi', age: 10};
}
function fn2() {
var obj = {name:'hanzichi', age: 10};
return obj;
}
var a = fn1();
var b = fn2();
fn1中定義的obj為局部變量牙丽,而當(dāng)調(diào)用結(jié)束后,出了fn1的環(huán)境子寓,那么該塊內(nèi)存會被js引擎中的垃圾回收器自動釋放食零;在fn2被調(diào)用的過程中,返回的對象被全局變量b所指向蝗肪,所以該塊內(nèi)存并不會被釋放袜爪。
4、垃圾回收策略:標(biāo)記清除(較為常用)和引用計(jì)數(shù)薛闪。
標(biāo)記清除:
定義和用法:當(dāng)變量進(jìn)入環(huán)境時(shí)辛馆,將變量標(biāo)記"進(jìn)入環(huán)境",當(dāng)變量離開環(huán)境時(shí),標(biāo)記為:"離開環(huán)境"昙篙。某一個(gè)時(shí)刻腊状,垃圾回收器會過濾掉環(huán)境中的變量,以及被環(huán)境變量引用的變量苔可,剩下的就是被視為準(zhǔn)備回收的變量缴挖。
到目前為止,IE焚辅、Firefox映屋、Opera、Chrome同蜻、Safari的js實(shí)現(xiàn)使用的都是標(biāo)記清除的垃圾回收策略或類似的策略棚点,只不過垃圾收集的時(shí)間間隔互不相同。
引用計(jì)數(shù):
定義和用法:引用計(jì)數(shù)是跟蹤記錄每個(gè)值被引用的次數(shù)湾蔓。
基本原理:就是變量的引用次數(shù)瘫析,被引用一次則加1,當(dāng)這個(gè)引用計(jì)數(shù)為0時(shí)默责,被視為準(zhǔn)備回收的對象颁股。
內(nèi)存管理
1、什么時(shí)候觸發(fā)垃圾回收傻丝?
垃圾回收器周期性運(yùn)行甘有,如果分配的內(nèi)存非常多,那么回收工作也會很艱巨葡缰,確定垃圾回收時(shí)間間隔就變成了一個(gè)值得思考的問題亏掀。
IE6的垃圾回收是根據(jù)內(nèi)存分配量運(yùn)行的,當(dāng)環(huán)境中的變量泛释,對象滤愕,字符串達(dá)到一定數(shù)量時(shí)觸發(fā)垃圾回收。垃圾回收器一直處于工作狀態(tài)怜校,嚴(yán)重影響瀏覽器性能间影。
IE7中,垃圾回收器會根據(jù)內(nèi)存分配量與程序占用內(nèi)存的比例進(jìn)行動態(tài)調(diào)整茄茁,開始回收工作魂贬。
2、合理的GC方案:(1)裙顽、遍歷所有可訪問的對象; (2)付燥、回收已不可訪問的對象。
3愈犹、GC缺陷:(1)键科、停止響應(yīng)其他操作;
4、GC優(yōu)化策略:(1)勋颖、分代回收(Generation GC);(2)嗦嗡、增量GC
開發(fā)過程中遇到的內(nèi)存泄露情況,如何解決的饭玲?
1侥祭、定義和用法:
內(nèi)存泄露是指一塊被分配的內(nèi)存既不能使用,又不能回收咱枉,直到瀏覽器進(jìn)程結(jié)束卑硫。C#和Java等語言采用了自動垃圾回收方法管理內(nèi)存徒恋,幾乎不會發(fā)生內(nèi)存泄露蚕断。我們知道,瀏覽器中也是采用自動垃圾回收方法管理內(nèi)存入挣,但由于瀏覽器垃圾回收方法有bug亿乳,會產(chǎn)生內(nèi)存泄露。
2径筏、內(nèi)存泄露的幾種情況:
(1)葛假、當(dāng)頁面中元素被移除或替換時(shí),若元素綁定的事件仍沒被移除滋恬,在IE中不會作出恰當(dāng)處理聊训,此時(shí)要先手工移除事件,不然會存在內(nèi)存泄露恢氯。
實(shí)例如下:
<div id="myDiv">
<input type="button" value="Click me" id="myBtn">
</div>
<script type="text/javascript">
var btn = document.getElementById("myBtn");
btn.onclick = function(){
document.getElementById("myDiv").innerHTML = "Processing...";
}
</script>
解決方法如下:
<div id="myDiv">
<input type="button" value="Click me" id="myBtn">
</div>
<script type="text/javascript">
var btn = document.getElementById("myBtn");
btn.onclick = function(){
btn.onclick = null;
document.getElementById("myDiv").innerHTML = "Processing...";
}
</script>
(2)带斑、由于是函數(shù)內(nèi)定義函數(shù),并且內(nèi)部函數(shù)--事件回調(diào)的引用外暴了勋拟,形成了閉包勋磕。閉包可以維持函數(shù)內(nèi)局部變量,使其得不到釋放敢靡。
實(shí)例如下:
function bindEvent(){
var obj=document.createElement("XXX");
obj.onclick=function(){
//Even if it's a empty function
}
}
解決方法如下:
function bindEvent(){
var obj=document.createElement("XXX");
obj.onclick=function(){
//Even if it's a empty function
}
obj=null;
}
javascript面向?qū)ο笾欣^承實(shí)現(xiàn)挂滓?
面向?qū)ο蟮幕咎卣饔校悍忾]、繼承啸胧、多態(tài)赶站。
在JavaScript中實(shí)現(xiàn)繼承的方法:
1. 原型鏈(prototype chaining)
2. call()/apply()
3. 混合方式(prototype和call()/apply()結(jié)合)
4. 對象冒充
繼承的方法如下:
1、prototype原型鏈方式:
2纺念、call()/apply()方法
3亲怠、混合方法【prototype,call/apply】
4、對象冒充
javascript相關(guān)程序計(jì)算題
1柠辞、判斷一個(gè)字符串中出現(xiàn)次數(shù)最多的字符团秽,統(tǒng)計(jì)這個(gè)次數(shù)
var str = 'asdfssaaasasasasaa';
var json = {};
for (var i = 0; i < str.length; i++) {
if(!json[str.charAt(i)]){
json[str.charAt(i)] = 1;
}else{
json[str.charAt(i)]++;
}
};
var iMax = 0;
var iIndex = '';
for(var i in json){
if(json[i]>iMax){
iMax = json[i];
iIndex = i;
}
}
console.log('出現(xiàn)次數(shù)最多的是:'+iIndex+'出現(xiàn)'+iMax+'次');
結(jié)果如下:出現(xiàn)次數(shù)最多的是:a出現(xiàn)9次
JavaScript 數(shù)組(Array)對象
1、Array相關(guān)的屬性和方法
這里只是做了相關(guān)的列舉,具體的使用方法习勤,請參考網(wǎng)址踪栋。
Array 對象屬性
constructor 返回對創(chuàng)建此對象的數(shù)組函數(shù)的引用。
length 設(shè)置或返回?cái)?shù)組中元素的數(shù)目图毕。
prototype 使您有能力向?qū)ο筇砑訉傩院头椒ā?/p>
Array 對象方法
concat() 連接兩個(gè)或更多的數(shù)組夷都,并返回結(jié)果。
join() 把數(shù)組的所有元素放入一個(gè)字符串予颤。元素通過指定的分隔符進(jìn)行分隔囤官。
pop() 刪除并返回?cái)?shù)組的最后一個(gè)元素。
shift() 刪除并返回?cái)?shù)組的第一個(gè)元素
push() 向數(shù)組的末尾添加一個(gè)或更多元素蛤虐,并返回新的長度党饮。
unshift() 向數(shù)組的開頭添加一個(gè)或更多元素,并返回新的長度驳庭。
reverse() 顛倒數(shù)組中元素的順序刑顺。
slice() 從某個(gè)已有的數(shù)組返回選定的元素
sort() 對數(shù)組的元素進(jìn)行排序
splice() 刪除元素,并向數(shù)組添加新元素饲常。
toSource() 返回該對象的源代碼蹲堂。
toString() 把數(shù)組轉(zhuǎn)換為字符串,并返回結(jié)果贝淤。
toLocaleString() 把數(shù)組轉(zhuǎn)換為本地?cái)?shù)組柒竞,并返回結(jié)果。
valueOf() 返回?cái)?shù)組對象的原始值
2播聪、編寫一個(gè)方法 去掉一個(gè)數(shù)組的重復(fù)元素
方法一:
var arr = [0,2,3,4,4,0,2];
var obj = {};
var tmp = [];
for(var i = 0 ;i< arr.length;i++){
if( !obj[arr[i]] ){
obj[arr[i]] = 1;
tmp.push(arr[i]);
}
}
console.log(tmp);
結(jié)果如下: [0, 2, 3, 4]
方法二:
var arr = [2,3,4,4,5,2,3,6],
arr2 = [];
for(var i = 0;i< arr.length;i++){
if(arr2.indexOf(arr[i]) < 0){
arr2.push(arr[i]);
}
}
console.log(arr2);
結(jié)果為:[2, 3, 4, 5, 6]
方法三:
var arr = [2,3,4,4,5,2,3,6];
var arr2 = arr.filter(function(element,index,self){
return self.indexOf(element) === index;
});
console.log(arr2);
結(jié)果為:[2, 3, 4, 5, 6]
3朽基、求數(shù)組的最值?
方法一:
- 求數(shù)組最大值:Math.max.apply(null,arr);
var arr = [3,43,23,45,65,90];
var max = Math.max.apply(null,arr);
console.log(max);
// 90
- 求數(shù)組最小值:Math.min.apply(null,arr);
var arr = [3,43,23,45,65,90];
var min = Math.min.apply(null,arr);
console.log(min);
// 3
方法二:Array.max = function(arr){} / Array.min = function(arr){}
var array = [3,43,23,45,65,90];
Array.max = function( array ){
return Math.max.apply( Math, array );
};
Array.min = function( array ){
return Math.min.apply( Math, array );
};
var max = Array.max(array);
console.log(max); // 90
var min = Array.min(array);
console.log(min); // 3
方法三:Array.prototype.max = function(){};Array.prototype.min = function(){};
- 求數(shù)組最大值(基本思路:將數(shù)組中的第一個(gè)值賦值給變量max ,將數(shù)組進(jìn)行循環(huán)與max進(jìn)行比較犬耻,將數(shù)組中的大值賦給max,最后返回max;)
var arr = [3,43,23,45,65,90];
Array.prototype.max = function() {
var max = this[0];
var len = this.length;
for (var i = 0; i < len; i++){
if (this[i] > max) {
max = this[i];
}
}
return max;
}
var max = arr.max();
console.log(max); // 90
- 求數(shù)組最小值:
var arr = [3,43,23,45,65,90];
Array.prototype.min = function() {
var min = this[0];
var len = this.length;
for(var i = 0;i< len;i++){
if(this[i] < min){
min = this[i];
}
}
return min;
}
var min = arr.min();
console.log(min); // 3
4、數(shù)組排序相關(guān)
結(jié)合sort和函數(shù)排序:
- 數(shù)組由小到大進(jìn)行排序:sort,sortnum;
var arr = [3,43,23,45,65,90];
function sortnum(a,b){
return a-b;
}
arr = arr.sort(sortnum);
console.log(arr);
// [3, 23, 43, 45, 65, 90]
- 數(shù)組由大到小進(jìn)行排序:sort,sortnum;
var arr = [3,43,23,45,65,90];
function sortnum(a,b){
return a+b;
}
arr = arr.sort(sortnum);
console.log(arr);
// [90, 65, 45, 23, 43, 3]
冒泡排序:即實(shí)現(xiàn)數(shù)組由小到大進(jìn)行排序腻暮;思路為:每次比較相鄰的兩個(gè)數(shù)筝蚕,如果后一個(gè)比前一個(gè)小腿短,換位置榄棵。如果要實(shí)現(xiàn)由大到小排序,使用reverse()即可腺怯;
var arr = [3, 1, 4, 6, 5, 7, 2];
function bubbleSort(arr) {
var len = arr.length;
for (var i = len; i >= 2; --i) {
for (var j = 0; j < i - 1; j++) {
if (arr[j + 1] < arr[j]) {
var temp;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
var arr2 = bubbleSort(arr);
console.log(arr2); // [1, 2, 3, 4, 5, 6, 7]
var arr3 = arr2.reverse();
console.log(arr3); // [7, 6, 5, 4, 3, 2, 1]
快速排序:
思路:采用二分法袱饭,取出中間數(shù),數(shù)組每次和中間數(shù)比較呛占,小的放到左邊虑乖,大的放到右邊。
var arr = [3, 1, 4, 6, 5, 7, 2];
function quickSort(arr) {
if(arr.length == 0) {
return []; // 返回空數(shù)組
}
var cIndex = Math.floor(arr.length / 2);
var c = arr.splice(cIndex, 1);
var l = [];
var r = [];
for (var i = 0; i < arr.length; i++) {
if(arr[i] < c) {
l.push(arr[i]);
} else {
r.push(arr[i]);
}
}
return quickSort(l).concat(c, quickSort(r));
}
console.log(quickSort(arr));
//[1, 2, 3, 4, 5, 6, 7]
5晾虑、數(shù)組的翻轉(zhuǎn)(非reverse())
方法一:
var arr = [1,2,3,4];
var arr2 = [];
while(arr.length) {
var num = arr.pop(); //刪除數(shù)組最后一個(gè)元素并返回被刪除的元素
arr2.push(num);
}
console.log(arr2);
// [4, 3, 2, 1]
方法二:
var arr = [1,2,3,4];
var arr2 = [];
while(arr.length){
var num = arr.shift(); //刪除數(shù)組第一個(gè)元素并返回被刪除的元素
arr2.unshift(num);
}
console.log(arr2);
jquery相關(guān)
1疹味、 jQuery 庫中的 $() 是什么仅叫?
() 函數(shù)用于將任何對象包裹成 jQuery 對象糙捺,接著你就被允許調(diào)用定義在 jQuery 對象上的多個(gè)不同方法惑芭。你可以將一個(gè)選擇器字符串傳入 $() 函數(shù),它會返回一個(gè)包含所有匹配的 DOM 元素?cái)?shù)組的 jQuery 對象继找。
2遂跟、如何找到所有 HTML select 標(biāo)簽的選中項(xiàng)?
$('[name=selectname] :selected')
3婴渡、$(this) 和 this 關(guān)鍵字在 jQuery 中有何不同幻锁?
$(this) 返回一個(gè) jQuery 對象,你可以對它調(diào)用多個(gè) jQuery 方法边臼,比如用 text() 獲取文本哄尔,用val() 獲取值等等。
而 this 代表當(dāng)前元素柠并,它是 JavaScript 關(guān)鍵詞中的一個(gè)岭接,表示上下文中的當(dāng)前 DOM 元素。你不能對它調(diào)用 jQuery 方法臼予,直到它被 (this)。
4窄锅、jquery怎么移除標(biāo)簽onclick屬性?
獲得a標(biāo)簽的onclick屬性: $("a").attr("onclick")
刪除onclick屬性:$("a").removeAttr("onclick");
設(shè)置onclick屬性:$("a").attr("onclick","test();");
5疏之、jquery中addClass,removeClass,toggleClass的使用。
$(selector).addClass(class):為每個(gè)匹配的元素添加指定的類名
$(selector).removeClass(class):從所有匹配的元素中刪除全部或者指定的類,刪除class中某個(gè)值;
$(selector).toggleClass(class):如果存在(不存在)就刪除(添加)一個(gè)類
$(selector).removeAttr(class);刪除class這個(gè)屬性备禀;
6纽乱、JQuery有幾種選擇器?
(1)薯嗤、基本選擇器:#id繁仁,class,element,*;
(2)晤揣、層次選擇器:parent > child,prev + next 池户,prev ~ siblings
(3)、基本過濾器選擇器::first捆昏,:last ,:not 左胞,:even 烤宙,:odd 房揭,:eq 恬砂,:gt 漆羔,:lt
(4)、內(nèi)容過濾器選擇器: :contains 狱掂,:empty 演痒,:has ,:parent
(5)趋惨、可見性過濾器選擇器::hidden 鸟顺,:visible
(6)、屬性過濾器選擇器:[attribute] 器虾,[attribute=value] 讯嫂,[attribute!=value] ,[attribute^=value] 兆沙,[attribute$=value] 欧芽,[attribute*=value]
(7)、子元素過濾器選擇器::nth-child 葛圃,:first-child 千扔,:last-child ,:only-child
(8)库正、表單選擇器: :input 曲楚,:text ,:password 诀诊,:radio 洞渤,:checkbox ,:submit 等属瓣;
(9)、表單過濾器選擇器::enabled 讯柔,:disabled 抡蛙,:checked ,:selected
7魂迄、jQuery中的Delegate()函數(shù)有什么作用粗截?
delegate()會在以下兩個(gè)情況下使用到:
1、如果你有一個(gè)父元素捣炬,需要給其下的子元素添加事件熊昌,這時(shí)你可以使用delegate()了绽榛,代碼如下:
$("ul").delegate("li", "click", function(){ $(this).hide(); });
2、當(dāng)元素在當(dāng)前頁面中不可用時(shí)婿屹,可以使用delegate()
8灭美、$(document).ready()方法和window.onload有什么區(qū)別?
(1)昂利、window.onload方法是在網(wǎng)頁中所有的元素(包括元素的所有關(guān)聯(lián)文件)完全加載到瀏覽器后才執(zhí)行的届腐。
(2)、$(document).ready() 方法可以在DOM載入就緒時(shí)就對其進(jìn)行操縱蜂奸,并調(diào)用執(zhí)行綁定的函數(shù)犁苏。
9、如何用jQuery禁用瀏覽器的前進(jìn)后退按鈕扩所?
實(shí)現(xiàn)代碼如下:
<script type="text/javascript" language="javascript">
$(document).ready(function() {
window.history.forward(1);
//OR window.history.forward(-1);
});
</script>
10围详、 jquery中.post()提交有區(qū)別嗎?
相同點(diǎn):都是異步請求的方式來獲取服務(wù)端的數(shù)據(jù)祖屏;
異同點(diǎn):
1短曾、請求方式不同:.post() 方法使用POST方法來進(jìn)行異步請求的赐劣。
2嫉拐、參數(shù)傳遞方式不同:get請求會將參數(shù)跟在URL后進(jìn)行傳遞,而POST請求則是作為HTTP消息的實(shí)體內(nèi)容發(fā)送給Web服務(wù)器的魁兼,這種傳遞是對用戶不可見的婉徘。
3、數(shù)據(jù)傳輸大小不同:get方式傳輸?shù)臄?shù)據(jù)大小不能超過2KB 而POST要大的多
4咐汞、安全問題: GET 方式請求的數(shù)據(jù)會被瀏覽器緩存起來盖呼,因此有安全問題。
11化撕、寫出一個(gè)簡單的$.ajax()的請求方式几晤?
$.ajax({
url:'http://www.baidu.com',
type:'POST',
data:data,
cache:true,
headers:{},
beforeSend:function(){},
success:function(){},
error:function(){},
complete:function(){}
});
12、jQuery的事件委托方法bind 植阴、live蟹瘾、delegate、on之間有什么區(qū)別掠手?
(1)憾朴、bind 【jQuery 1.3之前】
定義和用法:主要用于給選擇到的元素上綁定特定事件類型的監(jiān)聽函數(shù);
語法:bind(type,[data],function(eventObject))喷鸽;
特點(diǎn):
(1)众雷、適用于頁面元素靜態(tài)綁定。只能給調(diào)用它的時(shí)候已經(jīng)存在的元素綁定事件,不能給未來新增的元素綁定事件砾省。
(2)鸡岗、當(dāng)頁面加載完的時(shí)候,你才可以進(jìn)行bind()编兄,所以可能產(chǎn)生效率問題轩性。
實(shí)例如下:$( "#members li a" ).bind( "click", function( e ) {} );
(2)、live 【jQuery 1.3之后】
定義和用法:主要用于給選擇到的元素上綁定特定事件類型的監(jiān)聽函數(shù)翻诉;
語法:live(type, [data], fn);
特點(diǎn):
(1)炮姨、live方法并沒有將監(jiān)聽器綁定到自己(this)身上,而是綁定到了this.context上了碰煌。
(2)舒岸、live正是利用了事件委托機(jī)制來完成事件的監(jiān)聽處理,把節(jié)點(diǎn)的處理委托給了document芦圾,新添加的元素不必再綁定一次監(jiān)聽器蛾派。
(3)、使用live()方法但卻只能放在直接選擇的元素后面个少,不能在層級比較深洪乍,連綴的DOM遍歷方法后面使用,即("body").find("ul").live...不行壳澳;
實(shí)例如下:$( document ).on( "click", "#members li a", function( e ) {} );
(3)、delegate 【jQuery 1.4.2中引入】
定義和用法:將監(jiān)聽事件綁定在就近的父級元素上
語法:delegate(selector,type,[data],fn)
特點(diǎn):
(1)茫经、選擇就近的父級元素巷波,因?yàn)槭录梢愿斓拿芭萆先ィ軌蛟诘谝粫r(shí)間進(jìn)行處理卸伞。
(2)抹镊、更精確的小范圍使用事件代理,性能優(yōu)于.live()荤傲】宥可以用在動態(tài)添加的元素上。
實(shí)例如下:
$("#info_table").delegate("td","click",function(){/顯示更多信息/});
$("table").find("#info").delegate("td","click",function(){/顯示更多信息/});
(4)遂黍、on 【1.7版本整合了之前的三種方式的新事件綁定機(jī)制】
定義和用法:將監(jiān)聽事件綁定到指定元素上终佛。
語法:on(type,[selector],[data],fn)
實(shí)例如下:$("#info_table").on("click","td",function(){/顯示更多信息/});參數(shù)的位置寫法與delegate不一樣。
說明:on方法是當(dāng)前JQuery推薦使用的事件綁定方法妓湘,附加只運(yùn)行一次就刪除函數(shù)的方法是one()查蓉。
總結(jié):.bind(), .live(), .delegate(),.on()分別對應(yīng)的相反事件為:.unbind(),.die(), .undelegate(),.off()
HTML & CSS:
1、什么是盒子模型榜贴?
在網(wǎng)頁中,一個(gè)元素占有空間的大小由幾個(gè)部分構(gòu)成,其中包括元素的內(nèi)容(content)唬党,元素的內(nèi)邊距(padding)鹃共,元素的邊框(border),元素的外邊距(margin)四個(gè)部分驶拱。這四個(gè)部分占有的空間中霜浴,有的部分可以顯示相應(yīng)的內(nèi)容,而有的部分只用來分隔相鄰的區(qū)域或區(qū)域蓝纲。4個(gè)部分一起構(gòu)成了css中元素的盒模型阴孟。
2、行內(nèi)元素有哪些税迷?塊級元素有哪些永丝? 空(void)元素有那些?
行內(nèi)元素:a箭养、b慕嚷、span、img毕泌、input喝检、strong、select撼泛、label挠说、em、button愿题、textarea
塊級元素:div损俭、ul、li抠忘、dl撩炊、dt、dd崎脉、p拧咳、h1-h6、blockquote
空元素:即系沒有內(nèi)容的HTML元素囚灼,例如:br骆膝、meta、hr灶体、link阅签、input、img
3蝎抽、CSS實(shí)現(xiàn)垂直水平居中
一道經(jīng)典的問題政钟,實(shí)現(xiàn)方法有很多種,以下是其中一種實(shí)現(xiàn):
HTML結(jié)構(gòu):
<div class="wrapper">
<div class="content"></div>
</div>
CSS:
.wrapper {
position: relative;
width: 500px;
height: 500px;
border: 1px solid red;
}
.content{
position: absolute;
width: 200px;
height: 200px;
/*top、bottom养交、left和right 均設(shè)置為0*/
top: 0;
bottom: 0;
left: 0;
right: 0;
/*margin設(shè)置為auto*/
margin:auto;
border: 1px solid green;
}
4精算、簡述一下src與href的區(qū)別
href 是指向網(wǎng)絡(luò)資源所在位置,建立和當(dāng)前元素(錨點(diǎn))或當(dāng)前文檔(鏈接)之間的鏈接碎连,用于超鏈接灰羽。
src是指向外部資源的位置,指向的內(nèi)容將會嵌入到文檔中當(dāng)前標(biāo)簽所在位置鱼辙;在請求src資源時(shí)會將其指向的資源下載并應(yīng)用到文檔內(nèi)廉嚼,例如js腳本,img圖片和frame等元素倒戏。
當(dāng)瀏覽器解析到該元素時(shí)怠噪,會暫停其他資源的下載和處理,直到將該資源加載峭梳、編譯舰绘、執(zhí)行完畢,圖片和框架等元素也如此葱椭,類似于將所指向資源嵌入當(dāng)前標(biāo)簽內(nèi)捂寿。這也是為什么將js腳本放在底部而不是頭部。
5孵运、簡述同步和異步的區(qū)別
同步是阻塞模式秦陋,異步是非阻塞模式。
同步就是指一個(gè)進(jìn)程在執(zhí)行某個(gè)請求的時(shí)候治笨,若該請求需要一段時(shí)間才能返回信息驳概,那么這個(gè)進(jìn)程將會一直等待下去,直到收到返回信息才繼續(xù)執(zhí)行下去旷赖;
異步是指進(jìn)程不需要一直等下去顺又,而是繼續(xù)執(zhí)行下面的操作,不管其他進(jìn)程的狀態(tài)等孵。當(dāng)有消息返回時(shí)系統(tǒng)會通知進(jìn)程進(jìn)行處理稚照,這樣可以提高執(zhí)行的效率。
6俯萌、px和em的區(qū)別
相同點(diǎn):px和em都是長度單位果录;
異同點(diǎn):px的值是固定的,指定是多少就是多少咐熙,計(jì)算比較容易弱恒。em得值不是固定的,并且em會繼承父級元素的字體大小棋恼。
瀏覽器的默認(rèn)字體高都是16px返弹。所以未經(jīng)調(diào)整的瀏覽器都符合: 1em=16px锈玉。那么12px=0.75em, 10px=0.625em。
7琉苇、瀏覽器的內(nèi)核分別是什么?
IE: trident內(nèi)核
Firefox:gecko內(nèi)核
Safari:webkit內(nèi)核
Opera:以前是presto內(nèi)核嘲玫,Opera現(xiàn)已改用Google Chrome的Blink內(nèi)核
Chrome:Blink(基于webkit悦施,Google與Opera Software共同開發(fā))
8并扇、什么叫優(yōu)雅降級和漸進(jìn)增強(qiáng)?
漸進(jìn)增強(qiáng) progressive enhancement:
針對低版本瀏覽器進(jìn)行構(gòu)建頁面抡诞,保證最基本的功能穷蛹,然后再針對高級瀏覽器進(jìn)行效果、交互等改進(jìn)和追加功能達(dá)到更好的用戶體驗(yàn)昼汗。
優(yōu)雅降級 graceful degradation:
一開始就構(gòu)建完整的功能肴熏,然后再針對低版本瀏覽器進(jìn)行兼容。
區(qū)別:
a. 優(yōu)雅降級是從復(fù)雜的現(xiàn)狀開始顷窒,并試圖減少用戶體驗(yàn)的供給
b. 漸進(jìn)增強(qiáng)則是從一個(gè)非惩芾簦基礎(chǔ)的,能夠起作用的版本開始鞋吉,并不斷擴(kuò)充鸦做,以適應(yīng)未來環(huán)境的需要
c. 降級(功能衰減)意味著往回看;而漸進(jìn)增強(qiáng)則意味著朝前看谓着,同時(shí)保證其根基處于安全地帶
9泼诱、sessionStorage 、localStorage 和 cookie 之間的區(qū)別
共同點(diǎn):用于瀏覽器端存儲的緩存數(shù)據(jù)
不同點(diǎn):
(1)赊锚、存儲內(nèi)容是否發(fā)送到服務(wù)器端:當(dāng)設(shè)置了Cookie后治筒,數(shù)據(jù)會發(fā)送到服務(wù)器端,造成一定的寬帶浪費(fèi)舷蒲;
web storage,會將數(shù)據(jù)保存到本地耸袜,不會造成寬帶浪費(fèi);
(2)牲平、數(shù)據(jù)存儲大小不同:Cookie數(shù)據(jù)不能超過4K,適用于會話標(biāo)識堤框;web storage數(shù)據(jù)存儲可以達(dá)到5M;
(3)、數(shù)據(jù)存儲的有效期限不同:cookie只在設(shè)置了Cookid過期時(shí)間之前一直有效欠拾,即使關(guān)閉窗口或者瀏覽器胰锌;
sessionStorage,僅在關(guān)閉瀏覽器之前有效;localStorage,數(shù)據(jù)存儲永久有效藐窄;
(4)资昧、作用域不同:cookie和localStorage是在同源同窗口中都是共享的;sessionStorage不在不同的瀏覽器窗口中共享荆忍,即使是同一個(gè)頁面格带;
10撤缴、Web Storage與Cookie相比存在的優(yōu)勢:
(1)、存儲空間更大:IE8下每個(gè)獨(dú)立的存儲空間為10M叽唱,其他瀏覽器實(shí)現(xiàn)略有不同屈呕,但都比Cookie要大很多。
(2)棺亭、存儲內(nèi)容不會發(fā)送到服務(wù)器:當(dāng)設(shè)置了Cookie后虎眨,Cookie的內(nèi)容會隨著請求一并發(fā)送的服務(wù)器,這對于本地存儲的數(shù)據(jù)是一種帶寬浪費(fèi)镶摘。而Web Storage中的數(shù)據(jù)則僅僅是存在本地嗽桩,不會與服務(wù)器發(fā)生任何交互。
(3)凄敢、更多豐富易用的接口:Web Storage提供了一套更為豐富的接口碌冶,如setItem,getItem,removeItem,clear等,使得數(shù)據(jù)操作更為簡便。cookie需要自己封裝涝缝。
(4)扑庞、獨(dú)立的存儲空間:每個(gè)域(包括子域)有獨(dú)立的存儲空間,各個(gè)存儲空間是完全獨(dú)立的拒逮,因此不會造成數(shù)據(jù)混亂罐氨。
11、Ajax的優(yōu)缺點(diǎn)及工作原理消恍?
定義和用法:
AJAX = Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)岂昭。Ajax 是一種用于創(chuàng)建快速動態(tài)網(wǎng)頁的技術(shù)。Ajax 是一種在無需重新加載整個(gè)網(wǎng)頁的情況下狠怨,能夠更新部分網(wǎng)頁的技術(shù)约啊。
傳統(tǒng)的網(wǎng)頁(不使用 Ajax)如果需要更新內(nèi)容,必須重載整個(gè)網(wǎng)頁頁面佣赖。
優(yōu)點(diǎn):
1.減輕服務(wù)器的負(fù)擔(dān),按需取數(shù)據(jù),最大程度的減少冗余請求
2.局部刷新頁面,減少用戶心理和實(shí)際的等待時(shí)間,帶來更好的用戶體驗(yàn)
3.基于xml標(biāo)準(zhǔn)化,并被廣泛支持,不需安裝插件等,進(jìn)一步促進(jìn)頁面和數(shù)據(jù)的分離
缺點(diǎn):
1.AJAX大量的使用了javascript和ajax引擎,這些取決于瀏覽器的支持.在編寫的時(shí)候考慮對瀏覽器的兼容性.
2.AJAX只是局部刷新,所以頁面的后退按鈕是沒有用的.
3.對流媒體還有移動設(shè)備的支持不是太好等
AJAX的工作原理:
1.創(chuàng)建ajax對象(XMLHttpRequest/ActiveXObject(Microsoft.XMLHttp))
2.判斷數(shù)據(jù)傳輸方式(GET/POST)
3.打開鏈接 open()
4.發(fā)送 send()
5.當(dāng)ajax對象完成第四步(onreadystatechange)數(shù)據(jù)接收完成恰矩,判斷http響應(yīng)狀態(tài)(status)200-300之間或者304(緩存)執(zhí)行回調(diào)函數(shù)
12、請指出document load和document ready的區(qū)別憎蛤?
共同點(diǎn):這兩種事件都代表的是頁面文檔加載時(shí)觸發(fā)外傅。
異同點(diǎn):
ready 事件的觸發(fā),表示文檔結(jié)構(gòu)已經(jīng)加載完成(不包含圖片等非文字媒體文件)。
onload 事件的觸發(fā),表示頁面包含圖片等文件在內(nèi)的所有元素都加載完成尘吗。
正則表達(dá)式
1、寫一個(gè)function技竟,清除字符串前后的空格。(兼容所有瀏覽器)
function trim(str) {
if (str && typeof str === "string") {
return str.replace(/(^\s*)|(\s*)$/g,""); //去除前后空白符
}
}
2屈藐、使用正則表達(dá)式驗(yàn)證郵箱格式
var reg = /^(\w)+(\.\w+)*@(\w)+((\.\w{2,3}){1,3})$/;
var email = "example@qq.com";
console.log(reg.test(email)); // true
開發(fā)及性能優(yōu)化
1榔组、規(guī)避javascript多人開發(fā)函數(shù)重名問題
- 命名空間
- 封閉空間
- js模塊化mvc(數(shù)據(jù)層熙尉、表現(xiàn)層、控制層)
- seajs
- 變量轉(zhuǎn)換成對象的屬性
- 對象化
2搓扯、請說出三種減低頁面加載時(shí)間的方法
- 壓縮css检痰、js文件
- 合并js、css文件锨推,減少http請求
- 外部js铅歼、css文件放在最底下
- 減少dom操作,盡可能用變量替代不必要的dom操作
3爱态、你所了解到的Web攻擊技術(shù)
(1)XSS(Cross-Site Scripting谭贪,跨站腳本攻擊):指通過存在安全漏洞的Web網(wǎng)站注冊用戶的瀏覽器內(nèi)運(yùn)行非法的HTML標(biāo)簽或者JavaScript進(jìn)行的一種攻擊。
(2)SQL注入攻擊
(3)CSRF(Cross-Site Request Forgeries锦担,跨站點(diǎn)請求偽造):指攻擊者通過設(shè)置好的陷阱,強(qiáng)制對已完成的認(rèn)證用戶進(jìn)行非預(yù)期的個(gè)人信息或設(shè)定信息等某些狀態(tài)更新慨削。
4洞渔、web前端開發(fā),如何提高頁面性能優(yōu)化缚态?
內(nèi)容方面:
1.減少 HTTP 請求 (Make Fewer HTTP Requests)
2.減少 DOM 元素?cái)?shù)量 (Reduce the Number of DOM Elements)
3.使得 Ajax 可緩存 (Make Ajax Cacheable)
針對CSS:
1.把 CSS 放到代碼頁上端 (Put Stylesheets at the Top)
2.從頁面中剝離 JavaScript 與 CSS (Make JavaScript and CSS External)
3.精簡 JavaScript 與 CSS (Minify JavaScript and CSS)
4.避免 CSS 表達(dá)式 (Avoid CSS Expressions)
針對JavaScript :
1. 腳本放到 HTML 代碼頁底部 (Put Scripts at the Bottom)
2. 從頁面中剝離 JavaScript 與 CSS (Make JavaScript and CSS External)
3. 精簡 JavaScript 與 CSS (Minify JavaScript and CSS)
4. 移除重復(fù)腳本 (Remove Duplicate Scripts)
面向圖片(Image):
1.優(yōu)化圖片
2 不要在 HTML 中使用縮放圖片
3 使用恰當(dāng)?shù)膱D片格式
4 使用 CSS Sprites 技巧對圖片優(yōu)化
5磁椒、前端開發(fā)中,如何優(yōu)化圖像玫芦?圖像格式的區(qū)別浆熔?
優(yōu)化圖像:
1、不用圖片桥帆,盡量用css3代替医增。 比如說要實(shí)現(xiàn)修飾效果,如半透明老虫、邊框叶骨、圓角、陰影祈匙、漸變等忽刽,在當(dāng)前主流瀏覽器中都可以用CSS達(dá)成。
2夺欲、 使用矢量圖SVG替代位圖跪帝。對于絕大多數(shù)圖案、圖標(biāo)等些阅,矢量圖更小伞剑,且可縮放而無需生成多套圖。現(xiàn)在主流瀏覽器都支持SVG了扑眉,所以可放心使用纸泄!
3.赖钞、使用恰當(dāng)?shù)膱D片格式。我們常見的圖片格式有JPEG聘裁、GIF雪营、PNG。
基本上衡便,內(nèi)容圖片多為照片之類的献起,適用于JPEG。
而修飾圖片通常更適合用無損壓縮的PNG镣陕。
GIF基本上除了GIF動畫外不要使用谴餐。且動畫的話,也更建議用video元素和視頻格式呆抑,或用SVG動畫取代岂嗓。
4、按照HTTP協(xié)議設(shè)置合理的緩存鹊碍。
5厌殉、使用字體圖標(biāo)webfont、CSS Sprites等侈咕。
6公罕、用CSS或JavaScript實(shí)現(xiàn)預(yù)加載。
7耀销、WebP圖片格式能給前端帶來的優(yōu)化楼眷。WebP支持無損、有損壓縮熊尉,動態(tài)罐柳、靜態(tài)圖片,壓縮比率優(yōu)于GIF帽揪、JPEG硝清、JPEG2000、PG等格式转晰,非常適合用于網(wǎng)絡(luò)等圖片傳輸芦拿。
圖像格式的區(qū)別:
矢量圖:圖標(biāo)字體,如 font-awesome查邢;svg
位圖:gif,jpg(jpeg),png
區(qū)別:
1蔗崎、gif:是是一種無損,8位圖片格式扰藕。具有支持動畫缓苛,索引透明,壓縮等特性。適用于做色彩簡單(色調(diào)少)的圖片未桥,如logo,各種小圖標(biāo)icons等笔刹。
2、JPEG格式是一種大小與質(zhì)量相平衡的壓縮圖片格式冬耿。適用于允許輕微失真的色彩豐富的照片舌菜,不適合做色彩簡單(色調(diào)少)的圖片,如logo,各種小圖標(biāo)icons等亦镶。
3日月、png:PNG可以細(xì)分為三種格式:PNG8,PNG24缤骨,PNG32爱咬。后面的數(shù)字代表這種PNG格式最多可以索引和存儲的顏色值。
關(guān)于透明:PNG8支持索引透明和alpha透明;PNG24不支持透明;而PNG32在24位的PNG基礎(chǔ)上增加了8位(256階)的alpha通道透明;
優(yōu)缺點(diǎn):
1绊起、能在保證最不失真的情況下盡可能壓縮圖像文件的大小精拟。
2、對于需要高保真的較復(fù)雜的圖像勒庄,PNG雖然能無損壓縮串前,但圖片文件較大,不適合應(yīng)用在Web頁面上实蔽。
6、瀏覽器是如何渲染頁面的谨读?
渲染的流程如下:
1.解析HTML文件局装,創(chuàng)建DOM樹。
自上而下劳殖,遇到任何樣式(link铐尚、style)與腳本(script)都會阻塞(外部樣式不阻塞后續(xù)外部腳本的加載)。
2.解析CSS哆姻。優(yōu)先級:瀏覽器默認(rèn)設(shè)置<用戶設(shè)置<外部樣式<內(nèi)聯(lián)樣式<HTML中的style樣式宣增;
3.將CSS與DOM合并,構(gòu)建渲染樹(Render Tree)
4.布局和繪制矛缨,重繪(repaint)和重排(reflow)