1. javascript的typeof返回哪些數(shù)據(jù)類型.
答案:string,boolean,number,undefined,function,object
2. 例舉3種強(qiáng)制類型轉(zhuǎn)換和2種隱式類型轉(zhuǎn)換?
答案:強(qiáng)制(parseInt,parseFloat,number)
隱式(== ===)
3. split() join() 的區(qū)別
答案:前者是將字符串切割成數(shù)組的形式,后者是將數(shù)組轉(zhuǎn)換成字符串
4. 數(shù)組方法pop() push() unshift() shift()
答案:push()尾部添加 pop()尾部刪除
unshift()頭部添加 shift()頭部刪除
5. IE和標(biāo)準(zhǔn)下有哪些兼容性的寫法
答案:
var ev = ev || window.event
document.documentElement.clientWidth || document.body.clientWidth
Var target = ev.srcElement||ev.target
6. ajax請(qǐng)求的時(shí)候get 和post方式的區(qū)別
答案:
一個(gè)在url后面 守屉,一個(gè)放在虛擬載體里面
get有大小限制(只能提交少量參數(shù))
安全問(wèn)題
應(yīng)用不同 ,請(qǐng)求數(shù)據(jù)和提交數(shù)據(jù)
7. call和apply的區(qū)別
答案:
Object.call(this,obj1,obj2,obj3)
Object.apply(this,arguments)
8. ajax請(qǐng)求時(shí)黑低,如何解析json數(shù)據(jù)
答案:使用JSON.parse
9. 事件委托是什么
答案: 利用事件冒泡的原理谱煤,讓自己的所觸發(fā)的事件,讓他的父元素代替執(zhí)行隙轻!
10. 閉包是什么始绍,有什么特性瞳购,對(duì)頁(yè)面有什么影響
答案:閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù),使得函數(shù)不被GC回收,如果過(guò)多使用閉包亏推,容易導(dǎo)致內(nèi)存泄露
11. 如何阻止事件冒泡
答案:ie:阻止冒泡ev.cancelBubble = true;非IE ev.stopPropagation();
12. 如何阻止默認(rèn)事件
答案:(1)return false学赛;(2) ev.preventDefault();
13. 添加 刪除 替換 插入到某個(gè)接點(diǎn)的方法
答案:
1)創(chuàng)建新節(jié)點(diǎn)
createElement() //創(chuàng)建一個(gè)具體的元素
createTextNode() //創(chuàng)建一個(gè)文本節(jié)點(diǎn)
2)添加、移除吞杭、替換盏浇、插入
appendChild() //添加
removeChild() //移除
replaceChild() //替換
insertBefore() //插入
3)查找
getElementsByTagName() //通過(guò)標(biāo)簽名稱
getElementsByName() //通過(guò)元素的Name屬性的值
getElementById() //通過(guò)元素Id,唯一性
14. 解釋jsonp的原理芽狗,以及為什么不是真正的ajax
答案:動(dòng)態(tài)創(chuàng)建script標(biāo)簽绢掰,回調(diào)函數(shù)
Ajax是頁(yè)面無(wú)刷新請(qǐng)求數(shù)據(jù)操作
15. document load 和document ready的區(qū)別
答案:document.onload 是在結(jié)構(gòu)和樣式,外部js以及圖片加載完才執(zhí)行js
document.ready是dom樹(shù)創(chuàng)建完成就執(zhí)行的方法,原生種沒(méi)有這個(gè)方法译蒂,jquery中有 $().ready(function)
16. ”==”和“===”的不同
答案:前者會(huì)自動(dòng)轉(zhuǎn)換類型,再判斷是否相等
后者不會(huì)自動(dòng)類型轉(zhuǎn)換曼月,直接去比較
17. 函數(shù)聲明與函數(shù)表達(dá)式的區(qū)別谊却?
在Javscript中柔昼,解析器在向執(zhí)行環(huán)境中加載數(shù)據(jù)時(shí),對(duì)函數(shù)聲明和函數(shù)表達(dá)式并非是一視同仁的炎辨,解析器會(huì)率先讀取函數(shù)聲明捕透,并使其在執(zhí)行任何代碼之前可用(可以訪問(wèn)),至于函數(shù)表達(dá)式碴萧,則必須等到解析器執(zhí)行到它所在的代碼行乙嘀,才會(huì)真正被解析執(zhí)行。
18. 對(duì)作用域上下文和this的理解破喻,看下列代碼:
var User = {
count: 1,
getCount: function() {
return this.count;
}
};
console.log(User.getCount()); // what?
var func = User.getCount;
console.log(func()); // what?
問(wèn)兩處console輸出什么虎谢?為什么?
答案:是1和undefined曹质。
func是在window的上下文中被執(zhí)行的婴噩,所以不會(huì)訪問(wèn)到count屬性擎场。
19. 看下面代碼,給出輸出結(jié)果几莽。
for(var i = 1; i <= 3; i++){ //建議使用let 可正常輸出i的值
setTimeout(function(){
console.log(i);
},0);
};
答案:4 4 4迅办。
原因:Javascript事件處理器在線程空閑之前不會(huì)運(yùn)行。
20. 當(dāng)一個(gè)DOM節(jié)點(diǎn)被點(diǎn)擊時(shí)候章蚣,我們希望能夠執(zhí)行一個(gè)函數(shù)站欺,應(yīng)該怎么做?
box.onlick= function(){}
box.addEventListener("click",function(){},false);
<button onclick="xxx()"></button>
21. Javascript的事件流模型都有什么?
“事件冒泡”:事件開(kāi)始由最具體的元素接受,然后逐級(jí)向上傳播
“事件捕捉”:事件由最不具體的節(jié)點(diǎn)先接收纤垂,然后逐級(jí)向下矾策,一直到最具體的
“DOM事件流”:三個(gè)階段:事件捕捉,目標(biāo)階段峭沦,事件冒泡
22. 看下列代碼,輸出什么?解釋原因蝴韭。
var a = null;
alert(typeof a);
答案:object
解釋:null是一個(gè)只有一個(gè)值的數(shù)據(jù)類型,這個(gè)值就是null熙侍。表示一個(gè)空指針對(duì)象榄鉴,所以用typeof檢測(cè)會(huì)返回”object”。
23. 判斷字符串以字母開(kāi)頭蛉抓,后面可以是數(shù)字庆尘,下劃線,字母巷送,長(zhǎng)度為6-30
var reg=/^[a-zA-Z]\w{5,29}$/;
24. 回答以下代碼驶忌,alert的值分別是多少?
<script>
var a = 100;
function test(){
alert(a);
a = 10; //去掉了var 就變成定義了全局變量了
alert(a);
}
test();
alert(a);
</script>
正確答案是: 100笑跛, 10付魔, 10
25. javaScript的2種變量范圍有什么不同?
全局變量:當(dāng)前頁(yè)面內(nèi)有效
局部變量:函數(shù)方法內(nèi)有效
26. null和undefined的區(qū)別飞蹂?
null是一個(gè)表示"無(wú)"的對(duì)象几苍,轉(zhuǎn)為數(shù)值時(shí)為0;undefined是一個(gè)表示"無(wú)"的原始值陈哑,轉(zhuǎn)為數(shù)值時(shí)為NaN妻坝。
當(dāng)聲明的變量還未被初始化時(shí),變量的默認(rèn)值為undefined惊窖。 null用來(lái)表示尚未存在的對(duì)象
undefined表示"缺少值"刽宪,就是此處應(yīng)該有一個(gè)值,但是還沒(méi)有定義界酒。典型用法是:
(1)變量被聲明了圣拄,但沒(méi)有賦值時(shí),就等于undefined毁欣。
(2)調(diào)用函數(shù)時(shí)庇谆,應(yīng)該提供的參數(shù)沒(méi)有提供赁遗,該參數(shù)等于undefined。
(3)對(duì)象沒(méi)有賦值的屬性族铆,該屬性的值為undefined岩四。
(4)函數(shù)沒(méi)有返回值時(shí),默認(rèn)返回undefined哥攘。
null表示"沒(méi)有對(duì)象"剖煌,即該處不應(yīng)該有值。典型用法是:
(1) 作為函數(shù)的參數(shù)逝淹,表示該函數(shù)的參數(shù)不是對(duì)象耕姊。
(2) 作為對(duì)象原型鏈的終點(diǎn)。
27. new操作符具體干了什么呢?
1栅葡、創(chuàng)建一個(gè)空對(duì)象茉兰,并且 this 變量引用該對(duì)象,同時(shí)還繼承了該函數(shù)的原型欣簇。
2规脸、屬性和方法被加入到 this 引用的對(duì)象中。
3熊咽、新創(chuàng)建的對(duì)象由 this 所引用莫鸭,并且最后隱式的返回 this 。
28. js延遲加載的方式有哪些横殴?
defer和async被因、動(dòng)態(tài)創(chuàng)建DOM方式(創(chuàng)建script,插入到DOM中衫仑,加載完畢后callBack)梨与、按需異步載入js
29. Flash、Ajax各自的優(yōu)缺點(diǎn)文狱,在使用中如何取舍粥鞋?
Flash ajax對(duì)比
(1)Flash適合處理多媒體、矢量圖形如贷、訪問(wèn)機(jī)器陷虎;對(duì)CSS、處理文本上不足杠袱,不容易被搜索。
(2)ajax對(duì)CSS窝稿、文本支持很好楣富,支持搜索;多媒體伴榔、矢量圖形纹蝴、機(jī)器訪問(wèn)不足庄萎。
共同點(diǎn):與服務(wù)器的無(wú)刷新傳遞消息、用戶離線和在線狀態(tài)塘安、操作DOM
30. 寫一個(gè)獲取非行間樣式的函數(shù)
function getStyle(obj,attr) {
if(obj.currentStyle) {
return obj.currentStyle[attr];
}else{
getComputedStyle(obi,false)[attr]
}
}
31. 希望獲取到頁(yè)面中所有的checkbox怎么做糠涛?(不使用第三方框架)
var inputs = document.getElementsByTagName("input");//獲取所有的input標(biāo)簽對(duì)象
var checkboxArray = [];//初始化空數(shù)組,用來(lái)存放checkbox對(duì)象兼犯。
for(var i=0;i<inputs.length;i++){
var obj = inputs[i];
if(obj.type=='checkbox'){
checkboxArray.push(obj);
}
}
32. 寫一個(gè)function忍捡,清除字符串前后的空格。(兼容所有瀏覽器)
String.prototype.trim= function(){
return this.replace(/^\s+/,"").replace(/\s+$/,"");
}
33. javascript語(yǔ)言特性中哩都,有很多方面和我們接觸的其他編程語(yǔ)言不太一樣,請(qǐng)舉例
javascript語(yǔ)言實(shí)現(xiàn)繼承機(jī)制的核心就是 1 (原型)费封,而不是Java語(yǔ)言那樣的類式繼承感挥。Javascript解析引擎在讀取一個(gè)Object的屬性的值時(shí),會(huì)沿著 2 (原型鏈)向上尋找凌埂,如果最終沒(méi)有找到,則該屬性值為 3 undefined诗芜;如果最終找到該屬性的值瞳抓,則返回結(jié)果。與這個(gè)過(guò)程不同的是伏恐,當(dāng)javascript解析引擎執(zhí)行“給一個(gè)Object的某個(gè)屬性賦值”的時(shí)候挨下,如果當(dāng)前Object存在該屬性,則改寫該屬性的值脐湾,如果當(dāng)前的Object本身并不存在該屬性臭笆,則賦值該屬性的值。
34. Cookie在客戶機(jī)上是如何存儲(chǔ)的
Cookies就是服務(wù)器暫存放在你的電腦里的文本文件秤掌,好讓服務(wù)器用來(lái)辨認(rèn)你的計(jì)算機(jī)愁铺。當(dāng)你在瀏覽網(wǎng)站的時(shí)候,Web服務(wù)器會(huì)先送一小小資料放在你的計(jì)算機(jī)上闻鉴,Cookies 會(huì)幫你在網(wǎng)站上所打的文字或是一些選擇都記錄下來(lái)茵乱。當(dāng)下次你再訪問(wèn)同一個(gè)網(wǎng)站,Web服務(wù)器會(huì)先看看有沒(méi)有它上次留下的Cookies資料孟岛,有的話瓶竭,就會(huì)依據(jù)Cookie里的內(nèi)容來(lái)判斷使用者,送出特定的網(wǎng)頁(yè)內(nèi)容給你渠羞。
35. 如何獲取javascript三個(gè)數(shù)中的最大值和最小值斤贰?
Math.max(a,b,c);//最大值
Math.min(a,b,c)//最小值
36. javascript是面向?qū)ο蟮模趺大w現(xiàn)javascript的繼承關(guān)系次询?
使用prototype原型來(lái)實(shí)現(xiàn)荧恍。
37. .form中的input可以設(shè)置為readonly和disable,請(qǐng)問(wèn)2者有什么區(qū)別?
readonly不可編輯送巡,但可以選擇和復(fù)制摹菠;值可以傳遞到后臺(tái)
disabled不能編輯,不能復(fù)制骗爆,不能選擇次氨;值不可以傳遞到后臺(tái)
38. 列舉javaScript的3種主要數(shù)據(jù)類型,2種復(fù)合數(shù)據(jù)類型和2種特殊數(shù)據(jù)類型摘投。
主要數(shù)據(jù)類型:string, boolean, number
復(fù)合數(shù)據(jù)類型:function, object
特殊類型:undefined煮寡,null
39. 程序中捕獲異常的方法?
try{
}catch(e){
}finally{
}
40. Ajax原理
(1)創(chuàng)建對(duì)象
var xhr = new XMLHttpRequest();
(2)打開(kāi)請(qǐng)求
xhr.open('GET', 'example.txt', true);
(3)發(fā)送請(qǐng)求
xhr.send(); 發(fā)送請(qǐng)求到服務(wù)器
(4)接收響應(yīng)
xhr.onreadystatechange =function(){}
(1)當(dāng)readystate值從一個(gè)值變?yōu)榱硪粋€(gè)值時(shí)谷朝,都會(huì)觸發(fā)readystatechange事件洲押。
(2)當(dāng)readystate==4時(shí),表示已經(jīng)接收到全部響應(yīng)數(shù)據(jù)圆凰。
(3)當(dāng)status ==200時(shí)杈帐,表示服務(wù)器成功返回頁(yè)面和數(shù)據(jù)。
(4)如果(2)和(3)內(nèi)容同時(shí)滿足专钉,則可以通過(guò)xhr.responseText挑童,獲得服務(wù)器返回的內(nèi)容。
41. 解釋什么是Json:
(1)JSON 是一種輕量級(jí)的數(shù)據(jù)交換格式跃须。
(2)JSON 獨(dú)立于語(yǔ)言和平臺(tái)站叼,JSON 解析器和 JSON 庫(kù)支持許多不同的編程語(yǔ)言。
(3)JSON的語(yǔ)法表示三種類型值菇民,簡(jiǎn)單值(字符串尽楔,數(shù)值,布爾值第练,null),數(shù)組阔馋,對(duì)象
42. js中的3種彈出式消息提醒(警告窗口,確認(rèn)窗口娇掏,信息輸入窗口)的命令式什么呕寝?
alert
confirm
prompt
43. 以下代碼執(zhí)行結(jié)果
var uname = 'jack'
function change() {
alert(uname) // ?
var uname = 'lily'
alert(uname) //?
}
change()
分別alert出 undefined,lily婴梧,(變量聲明提前問(wèn)題)
44. 瀏覽器的滾動(dòng)距離:
可視區(qū)域距離頁(yè)面頂部的距離
scrollTop=document.documentElement.scrollTop||document.body.scrollTop
45. 可視區(qū)的大邢律摇:
(1)innerXXX(不兼容ie)
window.innerHeight 可視區(qū)高度,包含滾動(dòng)條寬度
window.innerWidth 可視區(qū)寬度塞蹭,包含滾動(dòng)條寬度
(2)document.documentElement.clientXXX(兼容ie)
document.documentElement.clientWidth可視區(qū)寬度孽江,不包含滾動(dòng)條寬度
document.documentElement.clientHeight可視區(qū)高度,不包含滾動(dòng)條寬度
46. 節(jié)點(diǎn)的種類有幾種浮还,分別是什么竟坛?
(1)元素節(jié)點(diǎn):nodeType ===1;
(2)文本節(jié)點(diǎn):nodeType ===3;
(3)屬性節(jié)點(diǎn):nodeType ===2;
47. innerHTML和outerHTML的區(qū)別
innerHTML(元素內(nèi)包含的內(nèi)容)
outerHTML(自己以及元素內(nèi)的內(nèi)容)
48. offsetWidth offsetHeight和clientWidth clientHeight的區(qū)別
(1)offsetWidth (content寬度+padding寬度+border寬度)
(2)offsetHeight(content高度+padding高度+border高度)
(3)clientWidth(content寬度+padding寬度)
(4)clientHeight(content高度+padding高度)
49. 閉包的好處
(1)希望一個(gè)變量長(zhǎng)期駐扎在內(nèi)存當(dāng)中(不被垃圾回收機(jī)制回收)
(2)避免全局變量的污染
(3)私有成員的存在
(4)安全性提高
50. 冒泡排序算法
冒泡排序
var array = [5, 4, 3, 2, 1];
var temp = 0;
for (var i = 0; i <array.length; i++){
for (var j = 0; j <array.length - i; j++){
if (array[j] > array[j + 1]){
temp = array[j + 1];
array[j + 1] = array[j];
array[j] = temp;
}
}
51、js 實(shí)現(xiàn)一個(gè)函數(shù)對(duì)javascript中json 對(duì)象進(jìn)行克隆
var oldObject ="sdf";
var newObject = JSON.parse(JSON.stringify(oldObject));
console.log(newObject);
或者
var a = 'dddd';
function cp(a){return JSON.parse(JSON.stringify(a))}
console.log(cp(a));
52钧舌、js 實(shí)現(xiàn) ajax 請(qǐng)求或者submit請(qǐng)求時(shí) 鎖屏功能以及開(kāi)鎖功能(請(qǐng)求時(shí)界面Loading以及元素不能點(diǎn)擊担汤,請(qǐng)求完成即消除Loading)
function(url, fn) {
var obj = new XMLHttpRequest(); // XMLHttpRequest對(duì)象用于在后臺(tái)與服務(wù)器交換數(shù)據(jù)
obj.open('GET', url, true);
obj.onreadystatechange = function() {
if(obj.readyState == 4 && obj.status == 200||obj.status == 304) {
loading.style.display = "none"
} else {
alert("不能點(diǎn)擊,哈哈哈!");
}
};
obj.send(null);
}
53、js 實(shí)現(xiàn)一個(gè)函數(shù) 獲得url參數(shù)的值
function getQueryString(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
var r = window.location.search.substr(1).match(reg);
if (r != null) return unescape(r[2]); return null;
}
54洼冻、請(qǐng)用js計(jì)算1-10000中出現(xiàn)的0 的次數(shù)
new Array(10000).fill('').map((_, index) => index + 1).filter(item => /0/.test(item)).reduce((count, item) => { return count + (String(item).match(/0/g) || []).length}, 0)
55崭歧、寫一個(gè)function,清除字符串前后的空格撞牢。(兼容所有瀏覽器)
function trim(str) {
if (str & typeof str === "string") {
return str.replace(/(^s*)|(s*)$/g,""); //去除前后空白符
}
}
56率碾、降維數(shù)組
var arr=[[1,2],[3,4]];
function Jw(obj){
return Array.prototype.concat.apply([],obj);
}
Jw(arr);
57、將url的查詢參數(shù)解析成字典對(duì)象
···
function getQueryObject(url) {
url = url == null ? window.location.href : url;
var search = url.substring(url.lastIndexOf("?") + 1);
var obj = {};
var reg = /([?&=]+)=([?&=]*)/g;
search.replace(reg, function (rs, 2) {
var name = decodeURIComponent(2);
val = String(val);
obj[name] = val;
return rs;
});
return obj;
}
···
58屋彪、判斷一個(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;
}
}
alert('出現(xiàn)次數(shù)最多的是:'+iIndex+'出現(xiàn)'+iMax+'次');
···
59、編寫一個(gè)方法 求一個(gè)字符串的字節(jié)長(zhǎng)度;
···
//假設(shè)一個(gè)中文占兩個(gè)字節(jié)
var str = '22兩是';
alert(getStrlen(str))
function getStrlen(str){
var json = {len:0};
var re = /[\u4e00-\u9fa5]/;
for (var i = 0; i < str.length; i++) {
if(re.test(str.charAt(i))){
json['len']++;
}
};
return json['len']+str.length;
}
···
60畜挥、編寫一個(gè)方法 去掉一個(gè)數(shù)組的重復(fù)元素
···
var arr = [1,2,3,1,43,12,12,1];
var json = {};
var arr2 = [];
for (var i = 0; i < arr.length; i++) {
if(!json[arr[i]]){
json[arr[i]] = true;
}else{
json[arr[i]] = false;
}
if(json[arr[i]]){
arr2.push(arr[i]);
}
};
for (var i = 0; i < arr.length; i++) {
if(!aa(arr[i], arr2)){
arr2.push(arr[i])
}
};
function aa(obj, arr){
for (var i = 0; i < arr.length; i++) {
if(arr[i] == obj) return true;
else return false;
};
}
alert(arr2)
···
61仔粥、寫出3個(gè)使用this的典型應(yīng)用
事件: 如onclick this->發(fā)生事件的對(duì)象
構(gòu)造函數(shù) this->new 出來(lái)的object
call/apply 改變this
62、如何深度克隆
···
var arr = [1,2,43];
var json = {a:6,b:4,c:[1,2,3]};
var str = 'sdfsdf';
var json2 = clone(json);
alert(json['c'])
function clone(obj){
var oNew = new obj.constructor(obj.valueOf());
if(obj.constructor == Object){
for(var i in obj){
oNew[i] = obj[i];
if(typeof(oNew[i]) == 'object'){
clone(oNew[i]);
}
}
}
return oNew;
}
···
63蟹但、JavaScript中如何檢測(cè)一個(gè)變量是一個(gè)String類型躯泰?請(qǐng)寫出函數(shù)實(shí)現(xiàn)
···
typeof(obj) == 'string'
obj.constructor == String;
···
64、網(wǎng)頁(yè)中實(shí)現(xiàn)一個(gè)計(jì)算當(dāng)年還剩多少時(shí)間的倒數(shù)計(jì)時(shí)程序华糖,要求網(wǎng)頁(yè)上實(shí)時(shí)動(dòng)態(tài)顯示“××年還事笙颍××天××?xí)r××分××秒”
···
var oDate = new Date();
var oYear = oDate.getFullYear();
var oNewDate = new Date();
oNewDate.setFullYear(oYear, 11, 31, 23, 59, 59);
var iTime = oNewDate.getTime()-oDate.getTime();
var iS = iTime/1000;
var iM = oNewDate.getMonth()-oDate.getMonth();
var iDate =iS
···
65、請(qǐng)解釋一下什么是語(yǔ)義化的HTML客叉。
內(nèi)容使用特定標(biāo)簽诵竭,通過(guò)標(biāo)簽就能大概了解整體頁(yè)面的布局分布
66、為什么利用多個(gè)域名來(lái)存儲(chǔ)網(wǎng)站資源會(huì)更有效兼搏?
確保用戶在不同地區(qū)能用最快的速度打開(kāi)網(wǎng)站卵慰,其中某個(gè)域名崩潰用戶也能通過(guò)其他郁悶訪問(wèn)網(wǎng)站
67、請(qǐng)說(shuō)出三種減低頁(yè)面加載時(shí)間的方法
1向族、壓縮css呵燕、js文件
2、合并js件相、css文件再扭,減少http請(qǐng)求
3、外部js夜矗、css文件放在最底下
4泛范、減少dom操作,盡可能用變量替代不必要的dom操作
68紊撕、什么是FOUC罢荡?你如何來(lái)避免FOUC?
由于css引入使用了@import 或者存在多個(gè)style標(biāo)簽以及css文件在頁(yè)面底部引入使得css文件加載在html之后導(dǎo)致頁(yè)面閃爍、花屏
用link加載css文件区赵,放在head標(biāo)簽里面
69惭缰、文檔類型的作用是什么?你知道多少種文檔類型笼才?
影響瀏覽器對(duì)html代碼的編譯渲染
html2.0
xHtml
html5
70漱受、瀏覽器標(biāo)準(zhǔn)模式和怪異模式之間的區(qū)別是什么?
盒模型解釋不同
71骡送、閉包
子函數(shù)能被外部調(diào)用到昂羡,則該作用連上的所有變量都會(huì)被保存下來(lái)。
72摔踱、請(qǐng)解釋什么是Javascript的模塊模式虐先,并舉出實(shí)用實(shí)例。
js模塊化mvc(數(shù)據(jù)層派敷、表現(xiàn)層蛹批、控制層)
seajs
命名空間
73、你如何組織自己的代碼膀息?是使用模塊模式般眉,還是使用經(jīng)典繼承的方法?
對(duì)內(nèi):模塊模式
對(duì)外:繼承
74潜支、你如何優(yōu)化自己的代碼甸赃?
代碼重用
避免全局變量(命名空間,封閉空間冗酿,模塊化mvc..)
拆分函數(shù)避免函數(shù)過(guò)于臃腫
注釋
75埠对、你能解釋一下JavaScript中的繼承是如何工作的嗎?
子構(gòu)造函數(shù)中執(zhí)行父構(gòu)造函數(shù)裁替,并用call\apply改變this
克隆父構(gòu)造函數(shù)原型上的方法
76项玛、請(qǐng)盡可能詳盡的解釋AJAX的工作原理。
創(chuàng)建ajax對(duì)象(XMLHttpRequest/ActiveXObject(Microsoft.XMLHttp))
判斷數(shù)據(jù)傳輸方式(GET/POST)
打開(kāi)鏈接 open()
發(fā)送 send()
當(dāng)ajax對(duì)象完成第四步(onreadystatechange)數(shù)據(jù)接收完成弱判,判斷http響應(yīng)狀態(tài)(status)200-300之間或者304(緩存)執(zhí)行回調(diào)函數(shù)
77襟沮、最簡(jiǎn)單的一道題
···
var a = 2, b = 3;
var c = a+++b; // c = 5
···
78、var和function的預(yù)解析問(wèn)題,以及變量和function的先后順序的問(wèn)題
···
// 以下代碼執(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ù)解析(在與解析過(guò)程中還要考慮一下當(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
···
79昌腰、dom事件委托什么原理开伏,有什么優(yōu)缺點(diǎn)
事件委托原理:事件冒泡機(jī)制
優(yōu)點(diǎn)
1.可以大量節(jié)省內(nèi)存占用,減少事件注冊(cè)遭商。比如ul上代理所有l(wèi)i的click事件就很不錯(cuò)固灵。
2.可以實(shí)現(xiàn)當(dāng)新增子對(duì)象時(shí),無(wú)需再對(duì)其進(jìn)行事件綁定劫流,對(duì)于動(dòng)態(tài)內(nèi)容部分尤為合適
缺點(diǎn)
事件代理的常用應(yīng)用應(yīng)該僅限于上述需求巫玻,如果把所有事件都用事件代理丛忆,可能會(huì)出現(xiàn)事件誤判。即本不該被觸發(fā)的事件被綁定上了事件仍秤。
80熄诡、http的cache機(jī)制,以及200狀態(tài)下怎么實(shí)現(xiàn) from cache(表示接觸最多的就是304的from cache)(用于優(yōu)化徒扶,沒(méi)有接觸過(guò)粮彤,需要理解)
含義
定義:瀏覽器緩存(Browser Caching)是為了加速瀏覽根穷,瀏覽器在用戶磁盤上對(duì)最近請(qǐng)求過(guò)的文檔進(jìn)行存儲(chǔ)姜骡,當(dāng)訪問(wèn)者再次請(qǐng)求這個(gè)頁(yè)面時(shí),瀏覽器就可以從本地磁盤顯示文檔屿良,這樣就可以加速頁(yè)面的閱覽圈澈。
作用
cache的作用:
1、減少延遲尘惧,讓你的網(wǎng)站更快康栈,提高用戶體驗(yàn)。
2喷橙、避免網(wǎng)絡(luò)擁塞啥么,減少請(qǐng)求量,減少輸出帶寬贰逾。
實(shí)現(xiàn)手段
Cache-Control中的max-age是實(shí)現(xiàn)內(nèi)容cache的主要手段悬荣,共有3種常用策略:max-age和Last-Modified(If-Modified-Since)的組合、僅max-age疙剑、max-age和ETag的組合氯迂。
對(duì)于強(qiáng)制緩存,服務(wù)器通知瀏覽器一個(gè)緩存時(shí)間言缤,在緩存時(shí)間內(nèi)嚼蚀,下次請(qǐng)求,直接用緩存管挟,不在時(shí)間內(nèi)轿曙,執(zhí)行比較緩存策略。
對(duì)于比較緩存僻孝,將緩存信息中的Etag和Last-Modified通過(guò)請(qǐng)求發(fā)送給服務(wù)器导帝,由服務(wù)器校驗(yàn),返回304狀態(tài)碼時(shí)皮璧,瀏覽器直接使用緩存舟扎。
81、一個(gè)原型鏈繼承的問(wèn)題
// 有一個(gè)構(gòu)造函數(shù)A悴务,寫一個(gè)函數(shù)B睹限,繼承A
function A (num) {
this.titileName = num;
}
A.prototype = {
fn1: function () {},
fn2: function () {}
}
這個(gè)問(wèn)題的關(guān)注點(diǎn)是B繼承的A的靜態(tài)屬性譬猫,同時(shí)B的原型鏈中不存在A實(shí)例的titleName屬性
82、什么是虛擬dom
React為啥這么大羡疗?因?yàn)樗鼘?shí)現(xiàn)了一個(gè)虛擬DOM(Virtual DOM)染服。虛擬DOM是干什么的?這就要從瀏覽器本身講起
如我們所知叨恨,在瀏覽器渲染網(wǎng)頁(yè)的過(guò)程中柳刮,加載到HTML文檔后,會(huì)將文檔解析并構(gòu)建DOM樹(shù)痒钝,然后將其與解析CSS生成的CSSOM樹(shù)一起結(jié)合產(chǎn)生愛(ài)的結(jié)晶——RenderObject樹(shù)秉颗,然后將RenderObject樹(shù)渲染成頁(yè)面(當(dāng)然中間可能會(huì)有一些優(yōu)化,比如RenderLayer樹(shù))送矩。這些過(guò)程都存在與渲染引擎之中蚕甥,渲染引擎在瀏覽器中是于JavaScript引擎(JavaScriptCore也好V8也好)分離開(kāi)的,但為了方便JS操作DOM結(jié)構(gòu)栋荸,渲染引擎會(huì)暴露一些接口供JavaScript調(diào)用菇怀。由于這兩塊相互分離,通信是需要付出代價(jià)的晌块,因此JavaScript調(diào)用DOM提供的接口性能不咋地爱沟。各種性能優(yōu)化的最佳實(shí)踐也都在盡可能的減少DOM操作次數(shù)。
而虛擬DOM干了什么匆背?它直接用JavaScript實(shí)現(xiàn)了DOM樹(shù)(大致上)呼伸。組件的HTML結(jié)構(gòu)并不會(huì)直接生成DOM,而是映射生成虛擬的JavaScript DOM結(jié)構(gòu)靠汁,React又通過(guò)在這個(gè)虛擬DOM上實(shí)現(xiàn)了一個(gè) diff 算法找出最小變更蜂大,再把這些變更寫入實(shí)際的DOM中。這個(gè)虛擬DOM以JS結(jié)構(gòu)的形式存在蝶怔,計(jì)算性能會(huì)比較好奶浦,而且由于減少了實(shí)際DOM操作次數(shù),性能會(huì)有較大提升
83踢星、js基礎(chǔ)數(shù)據(jù)類型和引用類型分別是什么澳叉?這個(gè)前提條件下寫一個(gè)getType,返回相應(yīng)的類型
1.基本數(shù)據(jù)類型(自身不可拆分的):Undefined沐悦、Null成洗、Boolean、Number藏否、String
2.引用數(shù)據(jù)類型(對(duì)象):Object (Array公壤,Date呐赡,RegExp多柑,F(xiàn)unction)
ES6基本數(shù)據(jù)類型多了個(gè)symbol 據(jù)說(shuō)這道題刷了百分之二十的人 感謝Abbyshen提出
function gettype(nm){
return Object.prototype.toString.call(nm);
}
84、 dom選擇器優(yōu)先級(jí)是什么基矮,以及權(quán)重值計(jì)算(一道老問(wèn)題了)
1.行內(nèi)樣式 1000
2.id 0100
3.類選擇器、偽類選擇器冠场、屬性選擇器[type="text"] 0010
4.標(biāo)簽選擇器家浇、偽元素選擇器(::first-line) 0001
5.通配符*、子選擇器碴裙、相鄰選擇器 0000
85钢悲、vue雙向數(shù)據(jù)綁定的原理是什么
首先傳輸對(duì)象的雙向數(shù)據(jù)綁定 Object.defineProperty(target, key, decription),在decription中設(shè)置get和set屬性(此時(shí)應(yīng)注意description中g(shù)et和set不能與描述屬性共存)
數(shù)組的實(shí)現(xiàn)與對(duì)象不同。
同時(shí)運(yùn)用觀察者模式實(shí)現(xiàn)wather舔株,用戶數(shù)據(jù)和view視圖的更新
86莺琳、 react和vue比較來(lái)說(shuō)有什么區(qū)別
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)閳?chǎng)景場(chǎng)景開(kāi)發(fā)更容易;react 沒(méi)有
6 生命周期函數(shù)名太長(zhǎng) directive
87珠十、git使用過(guò)程中料扰,如果你在開(kāi)發(fā)著業(yè)務(wù),突然另一個(gè)分支有一個(gè)bug要改焙蹭,你怎么辦
git stash //將本次修改存到暫存區(qū)(緊急切換分支時(shí))
git stash pop //將所有暫存區(qū)的內(nèi)容取出來(lái)
88晒杈、 網(wǎng)頁(yè)布局有哪幾種,有什么區(qū)別
靜態(tài)孔厉、自適應(yīng)拯钻、流式、響應(yīng)式四種網(wǎng)頁(yè)布局
靜態(tài)布局:意思就是不管瀏覽器尺寸具體是多少撰豺,網(wǎng)頁(yè)布局就按照當(dāng)時(shí)寫代碼的布局來(lái)布置粪般;
自適應(yīng)布局:就是說(shuō)你看到的頁(yè)面,里面元素的位置會(huì)變化而大小不會(huì)變化污桦;
流式布局:你看到的頁(yè)面亩歹,元素的大小會(huì)變化而位置不會(huì)變化——這就導(dǎo)致如果屏幕太大或者太小都會(huì)導(dǎo)致元素?zé)o法正常顯示。
自適應(yīng)布局:每個(gè)屏幕分辨率下面會(huì)有一個(gè)布局樣式凡橱,同時(shí)位置會(huì)變而且大小也會(huì)變小作。
89、執(zhí)行下面代碼
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]); // 333
90稼钩、
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
91顾稀、不適用循環(huán)語(yǔ)句(包括map、forEach方法)實(shí)現(xiàn)一個(gè)100長(zhǎng)度的數(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)
92氮块、下面語(yǔ)句執(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); // 0
93、科普
- dom節(jié)點(diǎn)的根節(jié)點(diǎn)是不是body
回答: 不是诡宗,dom節(jié)點(diǎn)的根節(jié)點(diǎn)是html(包含head和body滔蝉,head中分為meta、title等塔沃。body又分為一組)
2)dom元素都會(huì)有offsetParent嗎
回答: offsetParent屬性返回一個(gè)對(duì)象的引用蝠引,這個(gè)對(duì)象是距離調(diào)用offsetParent的元素最近的(在包含層次中最靠近的),并且是已進(jìn)行過(guò)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吊洼。
- [1,3,5]轉(zhuǎn)譯成字符串是什么
回答: '1,3,5'
調(diào)用toString方法,生成該字符串
4)li標(biāo)簽的祖級(jí)元素可以為li制肮,父級(jí)元素也可以為例
回答: 錯(cuò)誤
94冒窍、 jsonp原理,jquery是怎么實(shí)現(xiàn)的豺鼻,這樣實(shí)現(xiàn)有什么好處和壞處
原理
在同源策略下;在某個(gè)服務(wù)器下的頁(yè)面是無(wú)法獲取到該服務(wù)器以外的數(shù)據(jù)的;Jquery中ajax 的核心是通過(guò) XmlHttpRequest獲取非本頁(yè)內(nèi)容综液,而jsonp的核心則是動(dòng)態(tài)添加 <script>標(biāo)簽來(lái)調(diào)用服務(wù)器提供的 js腳本
當(dāng)我們正常地請(qǐng)求一個(gè)JSON數(shù)據(jù)的時(shí)候,服務(wù)端返回的是一串 JSON類型的數(shù)據(jù)儒飒,而我們使用 JSONP模式來(lái)請(qǐng)求數(shù)據(jù)的時(shí)候服務(wù)端返回的是一段可執(zhí)行的 JavaScript代碼谬莹。因?yàn)閖sonp 跨域的原理就是用的動(dòng)態(tài)加載 script的src ,所以我們只能把參數(shù)通過(guò) url的方式傳遞, 所以jsonp的 type類型只能是get 桩了!
$.ajax({
url: 'http://192.168.1.114/yii/demos/test.php', //不同的域
type: 'GET', // jsonp模式只有GET 是合法的
data: {
'action': 'aaron'
},
dataType: 'jsonp', // 數(shù)據(jù)類型
jsonp: 'backfunc', // 指定回調(diào)函數(shù)名附帽,與服務(wù)器端接收的一致,并回傳回來(lái)
})
其實(shí)jquery 內(nèi)部會(huì)轉(zhuǎn)化成
http://192.168.1.114/yii/demos/test.php?backfunc=jQuery2030038573939353227615_1402643146875&action=aaron
然后動(dòng)態(tài)加載
<script type="text/javascript"src="http://192.168.1.114/yii/demos/test.php?backfunc=>
然后后端就會(huì)執(zhí)行backfunc(傳遞參數(shù) )井誉,把數(shù)據(jù)通過(guò)實(shí)參的形式發(fā)送出去蕉扮。
在jquery 源碼中, jsonp的實(shí)現(xiàn)方式是動(dòng)態(tài)添加<script>標(biāo)簽來(lái)調(diào)用服務(wù)器提供的 js腳本送悔。jquery 會(huì)在window對(duì)象中加載一個(gè)全局的函數(shù)慢显,當(dāng) <script>代碼插入時(shí)函數(shù)執(zhí)行,執(zhí)行完畢后就 <script>會(huì)被移除欠啤。同時(shí)jquery還對(duì)非跨域的請(qǐng)求進(jìn)行了優(yōu)化荚藻,如果這個(gè)請(qǐng)求是在同一個(gè)域名下那么他就會(huì)像正常的 Ajax請(qǐng)求一樣工作。
95洁段、 http協(xié)議屬于七層協(xié)議中的哪一層应狱,下一層是什么
七層結(jié)構(gòu):物理層、數(shù)據(jù)鏈路層祠丝、網(wǎng)絡(luò)層疾呻、傳輸層除嘹、會(huì)話層、表示層岸蜗、應(yīng)用層
tcp屬于傳輸層尉咕;http屬于應(yīng)用層。
表現(xiàn)層
96璃岳、 js垃圾回收機(jī)制知道哪些年缎,v8引擎使用的哪一種
js的兩種回收機(jī)制
1 標(biāo)記清除(mark and sweep)
2 引用計(jì)數(shù)(reference counting)
javascript與V8引擎
垃圾回收機(jī)制的好處和壞處
好處:大幅簡(jiǎn)化程序的內(nèi)存管理代碼,減輕程序猿負(fù)擔(dān)铃慷,并且減少因?yàn)殚L(zhǎng)時(shí)間運(yùn)轉(zhuǎn)而帶來(lái)的內(nèi)存泄露問(wèn)題单芜。
壞處:自動(dòng)回收意味著程序猿無(wú)法掌控內(nèi)存。ECMAScript中沒(méi)有暴露垃圾回收的借口犁柜,我們無(wú)法強(qiáng)迫其進(jìn)行垃圾回收洲鸠,更加無(wú)法干預(yù)內(nèi)存管理。
V8 自動(dòng)垃圾回收算法
https://segmentfault.com/a/11...
97馋缅、 作用域什么時(shí)候生成的扒腕?
頁(yè)面加載-->創(chuàng)建window全局對(duì)象,并生成全局作用域-->然后生成執(zhí)行上下文股囊,預(yù)解析變量(變量提升)袜匿,生成全局變量對(duì)象;
$scope
98稚疹、 websocket長(zhǎng)連接原理是什么
含義
Websocket是一個(gè)持久化的協(xié)議,相對(duì)于HTTP這種非持久的協(xié)議來(lái)說(shuō)祭务。
原理
類似長(zhǎng)輪循長(zhǎng)連接 ; 發(fā)送一次請(qǐng)求 ; 源源不斷的得到信息
28. http緩存知道哪些
http://blog.csdn.net/yzf91321...
99内狗、 講一下事件循環(huán)機(jī)制
執(zhí)行上下文(Execution context)
函數(shù)調(diào)用棧(call stack)
隊(duì)列數(shù)據(jù)結(jié)構(gòu)(queue)
Promise
https://zhuanlan.zhihu.com/p/...
100、 理解web安全嗎义锥?都有哪幾種柳沙,介紹以及如何預(yù)防
1.XSS,也就是跨站腳本注入
攻擊方法:
1\. 手動(dòng)攻擊:
編寫注入腳本拌倍,比如”/><script>alert(document.cookie());</script><!--等赂鲤,
手動(dòng)測(cè)試目標(biāo)網(wǎng)站上有的input, textarea等所有可能輸入文本信息的區(qū)域
2\. 自動(dòng)攻擊
利用工具掃描目標(biāo)網(wǎng)站所有的網(wǎng)頁(yè)并自動(dòng)測(cè)試寫好的注入腳本,比如:Burpsuite等
防御方法:
1\. 將cookie等敏感信息設(shè)置為httponly柱恤,禁止Javascript通過(guò)document.cookie獲得
2\. 對(duì)所有的輸入做嚴(yán)格的校驗(yàn)尤其是在服務(wù)器端数初,過(guò)濾掉任何不合法的輸入,比如手機(jī)號(hào)必須是數(shù)字梗顺,通撑莺ⅲ可以采用正則表達(dá)式
3\. 凈化和過(guò)濾掉不必要的html標(biāo)簽,比如:<iframe>, alt,<script> 等
4\. 凈化和過(guò)濾掉不必要的Javascript的事件標(biāo)簽寺谤,比如:onclick, onfocus等
5\. 轉(zhuǎn)義單引號(hào)仑鸥,雙引號(hào)吮播,尖括號(hào)等特殊字符,可以采用htmlencode編碼 或者過(guò)濾掉這些特殊字符
6\. 設(shè)置瀏覽器的安全設(shè)置來(lái)防范典型的XSS注入
2.SQL注入
攻擊方法:
編寫惡意字符串眼俊,比如‘ or 1=1--等意狠,
手動(dòng)測(cè)試目標(biāo)網(wǎng)站上所有涉及數(shù)據(jù)庫(kù)操作的地方
防御方法:
1\. 禁止目標(biāo)網(wǎng)站利用動(dòng)態(tài)拼接字符串的方式訪問(wèn)數(shù)據(jù)庫(kù)
2\. 減少不必要的數(shù)據(jù)庫(kù)拋出的錯(cuò)誤信息
3\. 對(duì)數(shù)據(jù)庫(kù)的操作賦予嚴(yán)格的權(quán)限控制
4\. 凈化和過(guò)濾掉不必要的SQL保留字,比如:where, or, exec 等
5\. 轉(zhuǎn)義單引號(hào)疮胖,上引號(hào)环戈,尖括號(hào)等特殊字符,可以采用htmlencode編碼 或者過(guò)濾掉這些特殊字符
3.CSRF获列,也就是跨站請(qǐng)求偽造
就是攻擊者冒用用戶的名義谷市,向目標(biāo)站點(diǎn)發(fā)送請(qǐng)求
防范方法:
1\. 在客戶端進(jìn)行cookie的hashing,并在服務(wù)端進(jìn)行hash認(rèn)證
2\. 提交請(qǐng)求是需要填寫驗(yàn)證碼
3\. 使用One-Time Tokens為不同的表單創(chuàng)建不同的偽隨機(jī)值
101击孩、 sessionStorage和localstorage能跨域拿到嗎迫悠?比如我在www.baidu.com設(shè)置的值能在m.baidu.com能拿到嗎?為什么
localStorage會(huì)跟cookie一樣受到跨域的限制巩梢,會(huì)被document.domain影響
102创泄、 localstorage不能手動(dòng)刪除的時(shí)候,什么時(shí)候過(guò)期
除非被清除括蝠,否則永久保存 clear()可清楚
sessionStorage 僅在當(dāng)前會(huì)話下有效鞠抑,關(guān)閉頁(yè)面或?yàn)g覽器后被清除
103、cookie可以設(shè)置什么域忌警?可以設(shè)置.com嗎
可以通過(guò)設(shè)置domin來(lái)實(shí)現(xiàn)
104搁拙、登錄狀態(tài)的保存你認(rèn)為可以保存在sessionstorage或者localstorage或者cookie或者你知道的哪種方式,存在了哪里法绵?箕速?為什么保存在那里
105、 flux -> redux -> mobx 變化的本質(zhì)是什么
存儲(chǔ)結(jié)構(gòu) 將對(duì)象加工可觀察 函數(shù)式 vs 面向?qū)ο?br> https://zhuanlan.zhihu.com/p/...
106朋譬、 按需加載路由怎么加載對(duì)應(yīng)的chunk文件的盐茎?換句話說(shuō)瀏覽器怎么知道什么時(shí)候加載這個(gè)chunk,以及webpack是怎么識(shí)別那個(gè)多個(gè)經(jīng)過(guò)hash過(guò)的chunk文件
107徙赢、get和post有什么區(qū)別字柠?get可以通過(guò)body傳遞數(shù)據(jù)嗎
把數(shù)據(jù)放到 body 里面,必須用 POST 方式取狡赐,這是 HTTP 協(xié)議限制的窑业。
108、右邊寬度固定阴汇,左邊自適應(yīng)
第一種:
<style>
body{
display: flex;
}
.left{
background-color: rebeccapurple;
height: 200px;
flex: 1;
}
.right{
background-color: red;
height: 200px;
width: 100px;
}
</style>
<body>
<div class="left"></div>
<div class="right"></div>
</body>
第二種
<style>
div {
height: 200px;
}
.left {
float: right;
width: 200px;
background-color: rebeccapurple;
}
.right {
margin-right: 200px;
background-color: red;
}
</style>
<body>
<div class="left"></div>
<div class="right"></div>
</body>
109数冬、水平垂直居中
第一種
#container{
position:relative;
}
#center{
width:100px;
height:100px;
position:absolute;
top:50%;
left:50%;
transform: translate(-50%,-50%);
}
第二種
#container{
position:relative;
}
#center{
width:100px;
height:100px;
position:absolute;
top:50%;
left:50%;
margin:-50px 0 0 -50px;
}
第三種
#container{
position:relative;
}
#center{
position:absolute;
margin:auto;
top:0;
bottom:0;
left:0;
right:0;
}
第四種 flex
#container{
display:flex;
justify-content:center;
align-items: center;
}
109、.四種定位的區(qū)別
static
是默認(rèn)值
relative
相對(duì)定位 相對(duì)于自身原有位置進(jìn)行偏移,仍處于標(biāo)準(zhǔn)文檔流中
absolute
絕對(duì)定位 相對(duì)于最近的已定位的祖先元素, 有已定位(指position
不是static
的元素)祖先元素, 以最近的祖先元素為參考標(biāo)準(zhǔn)拐纱。如果無(wú)已定位祖先元素, 以body
元素為偏移參照基準(zhǔn), 完全脫離了標(biāo)準(zhǔn)文檔流铜异。
fixed
固定定位的元素會(huì)相對(duì)于視窗來(lái)定位,這意味著即便頁(yè)面滾動(dòng),它還是會(huì)停留在相同的位置秸架。一個(gè)固定定位元素不會(huì)保留它原本在頁(yè)面應(yīng)有的空隙揍庄。
110、封裝一個(gè)函數(shù)东抹,參數(shù)是定時(shí)器的時(shí)間蚂子,.then執(zhí)行回調(diào)函數(shù)。
function sleep (time) {
return new Promise((resolve) => setTimeout(resolve, time));
}
111缭黔、一行代碼實(shí)現(xiàn)數(shù)組去重食茎?
[...new Set([1,2,3,1,'a',1,'a'])]
112、使用addEventListener點(diǎn)擊li彈出內(nèi)容馏谨,并且動(dòng)態(tài)添加li之后有效
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
var ulNode = document.getElementById("ul");
ulNode.addEventListener('click', function (e) {
if (e.target && e.target.nodeName.toUpperCase() == "LI") {
alert(e.target.innerHTML);
}
}, false);
113别渔、怎么判斷兩個(gè)對(duì)象相等
JSON.stringify(obj)==JSON.stringify(obj);//true
114、Vue router 除了 router-link 怎么實(shí)現(xiàn)跳轉(zhuǎn)?
router.go(1)
router.push('/')
115惧互、Vue router 跳轉(zhuǎn)和 location.href 有什么區(qū)別哎媚?
router
是 hash
改變
location.href
是頁(yè)面跳轉(zhuǎn),刷新頁(yè)面
116喊儡、重排和重繪
部分渲染樹(shù)(或者整個(gè)渲染樹(shù))需要重新分析并且節(jié)點(diǎn)尺寸需要重新計(jì)算拨与。這被稱為重排。注意這里至少會(huì)有一次重排-初始化頁(yè)面布局艾猜。
由于節(jié)點(diǎn)的幾何屬性發(fā)生改變或者由于樣式發(fā)生改變买喧,例如改變?cè)乇尘吧珪r(shí),屏幕上的部分內(nèi)容需要更新匆赃。這樣的更新被稱為重繪岗喉。
117、什么情況會(huì)觸發(fā)重排和重繪
添加炸庞、刪除、更新 DOM 節(jié)點(diǎn)
通過(guò) display: none 隱藏一個(gè) DOM 節(jié)點(diǎn)-觸發(fā)重排和重繪
通過(guò) visibility: hidden 隱藏一個(gè) DOM 節(jié)點(diǎn)-只觸發(fā)重繪荚斯,因?yàn)闆](méi)有幾何變化
移動(dòng)或者給頁(yè)面中的 DOM 節(jié)點(diǎn)添加動(dòng)畫
添加一個(gè)樣式表埠居,調(diào)整樣式屬性
用戶行為,例如調(diào)整窗口大小事期,改變字號(hào)滥壕,或者滾動(dòng)。
118兽泣、js bind 實(shí)現(xiàn)機(jī)制绎橘?手寫一個(gè) bind 方法?
function bind(fn, context){
return function (){
return fn.apply(context, arguments);
}
}
// 柯理化函數(shù)思想 感謝pursuitTom的提出
Function.prototype.bind = function (context) {
var args = Array.prototype.slice.call(arguments, 1);
var _this = this;
return function () {
var thisArgs = [].slice.call(arguments);
return _this.apply(context, args.concat(thisArgs))
};
}
// ES6寫法 感謝waterc的提出
Function.prototype.bind = function(context, ...res) {
let self = this
return function(...arg) {
return self.apply(context, [...res,...arg])
}
}
119、多個(gè)函數(shù)
var a = (function(){return '1';}, function(){return 1;})();
console.log(typeof a); //number
120称鳞、proto涮较、prototype、Object.getPrototypeOf()
__proto__是指內(nèi)部原型冈止,和Object.getPrototypeOf()結(jié)果等價(jià)
function f(){}
f.__proto__ === Object.getPrototypeOf(f); //true
f.prototype === Object.getPrototypeOf(f); //false
121狂票、瀏覽記錄前后跳轉(zhuǎn)(尚未試驗(yàn))
<a href="javascript:history.go(-1)">backward</a>
<a href="javascript:history.go(1)">forward</a>
122、setTimeout 和 setInterval 細(xì)談
常問(wèn)的點(diǎn)熙暴,前者是在一定時(shí)間過(guò)后將函數(shù)添加至執(zhí)行隊(duì)列闺属,執(zhí)行時(shí)間=延遲時(shí)間+之前函數(shù)代碼執(zhí)行時(shí)間+執(zhí)行函數(shù)時(shí)間。
后者是不管前一次是否執(zhí)行完畢周霉,每隔一定時(shí)間重復(fù)執(zhí)行掂器,用于精準(zhǔn)執(zhí)行互相沒(méi)有影響的重復(fù)操作。
如果需要控制前后執(zhí)行順序俱箱,最好使用setTimeout模擬setInterval
var time = 400, times = 0, max = 10;
function func(){
times++;
if(times < max){
//code here
setTimeout(func, time);
} else {
console.log("finished");
}
}
setTimeout(func, time);
123国瓮、判斷多圖片加載完畢
注:用jQueryObject.ready()只能判斷dom結(jié)構(gòu)加載完畢
好像描述的不是很清楚,這里寫一下代碼匠楚。
方法1:
var counter = 0;
var queryInterval = 30; //ms
var pics = document.getElementsByClassName("pics");
function singleQuery(i){
if(pics[i].complete){
counter++;
console.log(i + " is loaded");
} else {
setTimeout(singleQuery, queryInterval, i);
}
}
function allQuery(callback){
if(counter < pics.length){
console.log("current number of loaded pics: " + counter);
setTimeout(allQuery, queryInterval, callback);
} else {
console.log("All pics are loaded.");
callback();
}
}
for(var i = 0; i < pics.length; i++){
setTimeout(singleQuery, queryInterval, i);
}
setTimeout(allQuery, queryInterval, callback);
主要也是采用setTimeout模擬輪詢巍膘,判斷方式是img標(biāo)簽dom的complete屬性(布爾值),缺點(diǎn)是定時(shí)器太多芋簿。
方法2:
var counter = 0, queryInterval = 50;
var pics = document.getElementsByClassName("pics");
for(var i = 0; i < pics.length; i++){
pics[i].onload = function(){
counter++;
console.log(this.id + " is loaded");
}
}
function queryPictures(callback){
if(counter < pics.length){
console.log("current number of loaded pics: " + counter);
setTimeout(queryPictures, queryInterval, callback);
} else {
console.log("All pics are loaded");
callback();
}
}
setTimeout(queryPictures, queryInterval, callback);
利用onload綁定圖片加載成功后的回調(diào)峡懈,通過(guò)計(jì)數(shù)器判斷是否加載完畢。
124与斤、CSS margin重疊問(wèn)題
塊元素在垂直方向上的margin是很奇怪的肪康,會(huì)有重疊現(xiàn)象。
如果display都是block撩穿,有三種情況:
外間距均為正數(shù)磷支,豎直方向上會(huì)選擇最大的外邊距作為間隔
一正一負(fù),間距 = 正 - |負(fù)|
兩個(gè)負(fù)食寡,間距 = 0 - 絕對(duì)值最大的那個(gè)
設(shè)置display: inline-block的盒子不會(huì)有margin重疊雾狈,position: absolute的也不會(huì)出現(xiàn)。
125抵皱、CSS選擇器優(yōu)先級(jí) && CSS選擇器效率
ID > 類 > 標(biāo)簽 > 相鄰 > 子選擇器 > 后代選擇器 > * > 屬性 > 偽類
object.propertyIsEnumerable(xxx)
判斷對(duì)象中是否有xxx屬性善榛,并且能通過(guò)for in枚舉,如Array對(duì)象的length是不可枚舉的
126呻畸、判斷數(shù)組
function isArray(arr){
return Object.prototype.toString.call(arr) === '[Object Array]';
}
127移盆、git fetch && git pull
git pull自動(dòng)完成了fetch最新遠(yuǎn)程版本,并且和本地進(jìn)行merge
git fetch獲得遠(yuǎn)程分支伤为,要繼續(xù)手動(dòng)merge合并
128咒循、WebSocket
HTML5帶來(lái)的新協(xié)議,通過(guò)類似HTTP的請(qǐng)求建立連接。主要目的是可以獲取服務(wù)端的推送叙甸。
原來(lái)的方式可能是使用long poll(即不中斷連接一直等待數(shù)據(jù))颖医,或者是ajax輪詢的方式(每隔一段時(shí)間發(fā)送請(qǐng)求,建立連接蚁署,詢問(wèn)是否有新的數(shù)據(jù))便脊。這兩種方式的缺點(diǎn)在于long poll的阻塞,以及ajax輪詢的冗余連接光戈。
WebSocket的設(shè)計(jì)思想有點(diǎn)類似于回調(diào)哪痰,在發(fā)送請(qǐng)求升級(jí)服務(wù)端的協(xié)議并收到確認(rèn)信息后,服務(wù)端一有新的信息/數(shù)據(jù)就會(huì)主動(dòng)推送給客戶端久妆,至于要一次HTTP握手便可以建立持久連接
129晌杰、跨域相關(guān)
只要協(xié)議、域名筷弦、端口有不同瑟押,則視為不同的域嚣镜。(域名和域名對(duì)應(yīng)的IP也是跨域)
1.CORS: Cross-Origin Resource Sharing
基于服務(wù)器支持的跨域,服務(wù)器設(shè)置Access-Control-Allow-Origin響應(yīng)頭,瀏覽器可允許跨域
2.設(shè)置domain
能從子域設(shè)到主域饭于,如a.b.c.com—>b.c.com—>c.com
具體情況:在頁(yè)面中用iframe打開(kāi)了另一個(gè)頁(yè)面(前提:兩個(gè)頁(yè)面主域是相同的)
利用frameElement.contentWindow.document.domain設(shè)置frame子頁(yè)面的主域雏吭,document.domain設(shè)置主頁(yè)面的主域刃唐,之后就能互相獲取dom中的數(shù)據(jù)借浊。
缺點(diǎn)是只能用于不同子域間的交互。
3.例如擁有src屬性的img標(biāo)簽号醉,每次改變src屬性反症,都會(huì)發(fā)起http請(qǐng)求。
var img = new Image();
img.onload = function(){
//code here
};
img.onerror = function(){
//code here
};
img.src="http://server.com/data?query=3";
缺點(diǎn)是只能使用GET請(qǐng)求畔派,不能獲取數(shù)據(jù)铅碍,一般用于提交統(tǒng)計(jì)信息什么的。
script线椰、link胞谈、iframe只有在添加到DOM中才會(huì)發(fā)起請(qǐng)求
4.HTML5 postMessage
支持IE8+和主流瀏覽器,寫法也簡(jiǎn)單..
//source: http://test.org:4000
//get the window object of target origin
var win = window.open("http://target.com");
//or this, when a frame is used
var win = document.getElementById("targetId").contentWindow;
win.postMessage("data here", "http://target.com/rest");
//target: http://target.com/tiny
function handleMessage(event){
if(event.orgin!="http://test.org:4000")
return;
var data = event.data;
//code here
//event.source is window.opener
event.source.postMessage("response data here", event.origin);
}
window.addEventListener("message", handleMessage, false);
5.window.name
即使在頁(yè)面打開(kāi)多層iframe后憨愉,每個(gè)iframe中window.name 屬性值都是相同的呜魄,以此用作數(shù)據(jù)傳輸?shù)墓ぞ摺?br> 但由于跨域的限制,是無(wú)法獲取另一個(gè)frame中的window.name數(shù)據(jù)莱衩,所以要使用一個(gè)同域的代理(proxy.html):
6. jsonp
目前主流跨域方法
調(diào)用其他域的腳本獲取數(shù)據(jù),前提是另一個(gè)域能知道回調(diào)函數(shù)名娇澎,這個(gè)可以通過(guò)請(qǐng)求發(fā)送給目標(biāo)域笨蚁。
直接寫jQuery封的jsonp
$.getJSON("http://target.com/data?callback=callbackFunctionName", function(data){});
$.getJSON會(huì)把獲取的responseText轉(zhuǎn)為json,如果url中有callback參數(shù),數(shù)據(jù)會(huì)以script標(biāo)簽形式獲取括细。
130伪很、閉包相關(guān)
什么是閉包
閉包是指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中變量的函數(shù)
怎么創(chuàng)建閉包
在函數(shù)內(nèi)部嵌套使用函數(shù)
function fn() {
for (var i = 0; i < 2; i++) {
(function () {
var variate = i;
setTimeout(function () {
console.log("setTimeout執(zhí)行后:"+variate);
}, 1000);
})();//閉包,立即執(zhí)行函數(shù),匿名函數(shù)
}
console.log(i);//2
console.log(variate);//variate is not defined
}
fn();
為什么用閉包
- 因?yàn)樵陂]包內(nèi)部保持了對(duì)外部活動(dòng)對(duì)象的訪問(wèn),但外部的變量卻無(wú)法直接訪問(wèn)內(nèi)部,避免了全局污染;
- 可以當(dāng)做私有成員,彌補(bǔ)了因js語(yǔ)法帶來(lái)的面向?qū)ο缶幊痰牟蛔?
- 可以長(zhǎng)久的在內(nèi)存中保存一個(gè)自己想要保存的變量.
閉包的缺點(diǎn)
- 可能導(dǎo)致內(nèi)存占用過(guò)多,因?yàn)殚]包攜帶了自身的函數(shù)作用域
- 閉包只能取得外部包含函數(shù)中得最后一個(gè)值
詳見(jiàn)https://segmentfault.com/a/11...
131、a:active 移動(dòng)端實(shí)現(xiàn)
有時(shí)候一些按鈕的簡(jiǎn)單點(diǎn)擊交互可以通過(guò)css偽類來(lái)實(shí)現(xiàn)奋单;必須點(diǎn)擊了更改顏色锉试;松開(kāi)恢復(fù);IOS手機(jī)會(huì)出現(xiàn)偽類無(wú)效的情況览濒;iOS系統(tǒng)的移動(dòng)設(shè)備中呆盖,需要在按鈕元素或body/html上綁定一個(gè)touchstart事件才能激活:active狀態(tài)。
document.body.addEventListener('touchstart', function () { //...空函數(shù)即可});
132贷笛、ios滑動(dòng)卡頓
-webkit-overflow-scrolling:touch 可能會(huì)在IOS系統(tǒng)低的情況出現(xiàn)滾動(dòng)條应又;嘗試溢出解決
133、forEach和map的區(qū)別
相同點(diǎn)
- 都是循環(huán)遍歷數(shù)組中的每一項(xiàng)
- forEach和map方法里每次執(zhí)行匿名函數(shù)都支持3個(gè)參數(shù)乏苦,參數(shù)分別是item(當(dāng)前每一項(xiàng))株扛、index(索引值)、arr(原數(shù)組)
- 匿名函數(shù)中的this都是指向window
- 只能遍歷數(shù)組
- 都有兼容問(wèn)題
不同點(diǎn)
- map速度比f(wàn)oreach快
- map會(huì)返回一個(gè)新數(shù)組汇荐,不對(duì)原數(shù)組產(chǎn)生影響,foreach不會(huì)產(chǎn)生新數(shù)組洞就,
- map因?yàn)榉祷財(cái)?shù)組所以可以鏈?zhǔn)讲僮鳎琭oreach不能
134掀淘、淺拷貝和深拷貝
jQuery.extend第一個(gè)參數(shù)可以是布爾值旬蟋,用來(lái)設(shè)置是否深度拷貝的
jQuery.extend(true, { a : { a : "a" } }, { a : { b : "b" } } );
jQuery.extend( { a : { a : "a" } }, { a : { b : "b" } } );
最簡(jiǎn)單的深拷貝
aa = JSON.parse( JSON.stringify(a) )
淺復(fù)制--->就是將一個(gè)對(duì)象的內(nèi)存地址的“”編號(hào)“”復(fù)制給另一個(gè)對(duì)象。深復(fù)制--->實(shí)現(xiàn)原理繁疤,先新建一個(gè)空對(duì)象咖为,內(nèi)存中新開(kāi)辟一塊地址,把被復(fù)制對(duì)象的所有可枚舉的(注意可枚舉的對(duì)象)屬性方法一一復(fù)制過(guò)來(lái)稠腊,注意要用遞歸來(lái)復(fù)制子對(duì)象里面的所有屬性和方法躁染,直到子子.....屬性為基本數(shù)據(jù)類型〖芗桑總結(jié)吞彤,深復(fù)制理解兩點(diǎn),1,新開(kāi)辟內(nèi)存地址叹放,2,遞歸來(lái)刨根復(fù)制饰恕。
135、外邊距合并
外邊距合并指的是井仰,當(dāng)兩個(gè)垂直外邊距相遇時(shí)埋嵌,它們將形成一個(gè)外邊距。
合并后的外邊距的高度等于兩個(gè)發(fā)生合并的外邊距的高度中的較大者俱恶。
136雹嗦、js加載位置區(qū)別優(yōu)缺點(diǎn)
html文件是自上而下的執(zhí)行方式范舀,但引入的css和javascript的順序有所不同,css引入執(zhí)行加載時(shí)了罪,程序仍然往下執(zhí)行锭环,而執(zhí)行到<script>腳本是則中斷線程,待該script腳本執(zhí)行結(jié)束之后程序才繼續(xù)往下執(zhí)行泊藕。
所以辅辩,大部分網(wǎng)上討論是將script腳本放在<body>之后,那樣dom的生成就不會(huì)因?yàn)殚L(zhǎng)時(shí)間執(zhí)行script腳本而延遲阻塞娃圆,加快了頁(yè)面的加載速度玫锋。
但又不能將所有的script放在body之后,因?yàn)橛幸恍╉?yè)面的效果的實(shí)現(xiàn)踊餐,是需要預(yù)先動(dòng)態(tài)的加載一些js腳本景醇。所以這些腳本應(yīng)該放在<body>之前。
其次吝岭,不能將需要訪問(wèn)dom元素的js放在body之前三痰,因?yàn)榇藭r(shí)還沒(méi)有開(kāi)始生成dom,所以在body之前的訪問(wèn)dom元素的js會(huì)出錯(cuò)窜管,或者無(wú)效
script放置位置的原則“頁(yè)面效果實(shí)現(xiàn)類的js應(yīng)該放在body之前散劫,動(dòng)作,交互幕帆,事件驅(qū)動(dòng)获搏,需要訪問(wèn)dom屬性的js都可以放在body之后