https://www.jianshu.com/p/f1f39d5b2a2e
1. javascript的typeof返回哪些數據類型.
答案:string,boolean,number,undefined,function,object
2. 例舉3種強制類型轉換和2種隱式類型轉換?
答案:強制(parseInt,parseFloat,number)
隱式(== ===)
3. split() join() 的區別
答案:前者是將字符串切割成數組的形式,后者是將數組轉換成字符串
4. 數組方法pop() push() unshift() shift()
答案:push()尾部添加 pop()尾部刪除
unshift()頭部添加 shift()頭部刪除
5. IE和標准下有哪些兼容性的寫法
答案:
var ev = ev || window.event document.documentElement.clientWidth || document.body.clientWidth Var target = ev.srcElement||ev.target
6. ajax請求的時候get 和post方式的區別
答案:
一個在url后面 ,一個放在虛擬載體里面
get有大小限制(只能提交少量參數)
安全問題
應用不同 ,請求數據和提交數據
7. call和apply的區別
答案:
Object.call(this,obj1,obj2,obj3)
Object.apply(this,arguments)
8. ajax請求時,如何解析json數據
答案:使用JSON.parse
9. 事件委托是什么
答案: 利用事件冒泡的原理,讓自己的所觸發的事件,讓他的父元素代替執行!
10. 閉包是什么,有什么特性,對頁面有什么影響
答案:閉包就是能夠讀取其他函數內部變量的函數,使得函數不被GC回收,如果過多使用閉包,容易導致內存泄露
11. 如何阻止事件冒泡
答案:ie:阻止冒泡ev.cancelBubble = true;非IE ev.stopPropagation();
12. 如何阻止默認事件
答案:(1)return false;(2) ev.preventDefault();
13. 添加 刪除 替換 插入到某個接點的方法
答案:
1)創建新節點
createElement() //創建一個具體的元素
createTextNode() //創建一個文本節點
2)添加、移除、替換、插入
appendChild() //添加
removeChild() //移除
replaceChild() //替換
insertBefore() //插入
3)查找
getElementsByTagName() //通過標簽名稱
getElementsByName() //通過元素的Name屬性的值
getElementById() //通過元素Id,唯一性
14. 解釋jsonp的原理,以及為什么不是真正的ajax
答案:動態創建script標簽,回調函數
Ajax是頁面無刷新請求數據操作
15. document load 和document ready的區別
答案:document.onload 是在結構和樣式,外部js以及圖片加載完才執行js
document.ready是dom樹創建完成就執行的方法,原生種沒有這個方法,jquery中有 $().ready(function)
16. ”==”和“===”的不同
答案:前者會自動轉換類型,再判斷是否相等
后者不會自動類型轉換,直接去比較
17. 函數聲明與函數表達式的區別?
在Javscript中,解析器在向執行環境中加載數據時,對函數聲明和函數表達式並非是一視同仁的,解析器會率先讀取函數聲明,並使其在執行任何代碼之前可用(可以訪問),至於函數表達式,則必須等到解析器執行到它所在的代碼行,才會真正被解析執行。
18. 對作用域上下文和this的理解,看下列代碼:
var User = { count: 1, getCount: function() { return this.count; } }; console.log(User.getCount()); // what? var func = User.getCount; console.log(func()); // what? 問兩處console輸出什么?為什么? 答案:是1和undefined。 func是在window的上下文中被執行的,所以不會訪問到count屬性。
19. 看下面代碼,給出輸出結果。
for(var i = 1; i <= 3; i++){ //建議使用let 可正常輸出i的值 setTimeout(function(){ console.log(i); },0); }; 答案:4 4 4。 原因:Javascript事件處理器在線程空閑之前不會運行。
20. 當一個DOM節點被點擊時候,我們希望能夠執行一個函數,應該怎么做?
box.onlick= function(){}
box.addEventListener("click",function(){},false);
<button onclick="xxx()"></button>
21. Javascript的事件流模型都有什么?
“事件冒泡”:事件開始由最具體的元素接受,然后逐級向上傳播
“事件捕捉”:事件由最不具體的節點先接收,然后逐級向下,一直到最具體的
“DOM事件流”:三個階段:事件捕捉,目標階段,事件冒泡
22. 看下列代碼,輸出什么?解釋原因。
var a = null; alert(typeof a); 答案:object 解釋:null是一個只有一個值的數據類型,這個值就是null。表示一個空指針對象,所以用typeof檢測會返回”object”。
23. 判斷字符串以字母開頭,后面可以是數字,下划線,字母,長度為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種變量范圍有什么不同?
全局變量:當前頁面內有效
局部變量:函數方法內有效
26. null和undefined的區別?
null是一個表示"無"的對象,轉為數值時為0;undefined是一個表示"無"的原始值,轉為數值時為NaN。
當聲明的變量還未被初始化時,變量的默認值為undefined。 null用來表示尚未存在的對象
undefined表示"缺少值",就是此處應該有一個值,但是還沒有定義。典型用法是:
(1)變量被聲明了,但沒有賦值時,就等於undefined。
(2)調用函數時,應該提供的參數沒有提供,該參數等於undefined。
(3)對象沒有賦值的屬性,該屬性的值為undefined。
(4)函數沒有返回值時,默認返回undefined。
null表示"沒有對象",即該處不應該有值。典型用法是:
(1) 作為函數的參數,表示該函數的參數不是對象。
(2) 作為對象原型鏈的終點。
27. new操作符具體干了什么呢?
1、創建一個空對象,並且 this 變量引用該對象,同時還繼承了該函數的原型。
2、屬性和方法被加入到 this 引用的對象中。
3、新創建的對象由 this 所引用,並且最后隱式的返回 this 。
28. js延遲加載的方式有哪些?
defer和async、動態創建DOM方式(創建script,插入到DOM中,加載完畢后callBack)、按需異步載入js
29. Flash、Ajax各自的優缺點,在使用中如何取舍?
Flash ajax對比
(1)Flash適合處理多媒體、矢量圖形、訪問機器;對CSS、處理文本上不足,不容易被搜索。
(2)ajax對CSS、文本支持很好,支持搜索;多媒體、矢量圖形、機器訪問不足。
共同點:與服務器的無刷新傳遞消息、用戶離線和在線狀態、操作DOM
30. 寫一個獲取非行間樣式的函數
function getStyle(obj,attr) { if(obj.currentStyle) { return obj.currentStyle[attr]; }else{ getComputedStyle(obi,false)[attr] } }
31. 希望獲取到頁面中所有的checkbox怎么做?(不使用第三方框架)
var inputs = document.getElementsByTagName("input");//獲取所有的input標簽對象 var checkboxArray = [];//初始化空數組,用來存放checkbox對象。 for(var i=0;i<inputs.length;i++){ var obj = inputs[i]; if(obj.type=='checkbox'){ checkboxArray.push(obj); } }
32. 寫一個function,清除字符串前后的空格。(兼容所有瀏覽器)
String.prototype.trim= function(){ return this.replace(/^\s+/,"").replace(/\s+$/,""); }
33. javascript語言特性中,有很多方面和我們接觸的其他編程語言不太一樣,請舉例
javascript語言實現繼承機制的核心就是 1 (原型),而不是Java語言那樣的類式繼承。Javascript解析引擎在讀取一個Object的屬性的值時,會沿着 2 (原型鏈)向上尋找,如果最終沒有找到,則該屬性值為 3 undefined;如果最終找到該屬性的值,則返回結果。與這個過程不同的是,當javascript解析引擎執行“給一個Object的某個屬性賦值”的時候,如果當前Object存在該屬性,則改寫該屬性的值,如果當前的Object本身並不存在該屬性,則賦值該屬性的值。
34. Cookie在客戶機上是如何存儲的
Cookies就是服務器暫存放在你的電腦里的文本文件,好讓服務器用來辨認你的計算機。當你在瀏覽網站的時候,Web服務器會先送一小小資料放在你的計算機上,Cookies 會幫你在網站上所打的文字或是一些選擇都記錄下來。當下次你再訪問同一個網站,Web服務器會先看看有沒有它上次留下的Cookies資料,有的話,就會依據Cookie里的內容來判斷使用者,送出特定的網頁內容給你。
35. 如何獲取javascript三個數中的最大值和最小值?
Math.max(a,b,c);//最大值
Math.min(a,b,c)//最小值
36. javascript是面向對象的,怎么體現javascript的繼承關系?
使用prototype原型來實現。
37. .form中的input可以設置為readonly和disable,請問2者有什么區別?
readonly不可編輯,但可以選擇和復制;值可以傳遞到后台
disabled不能編輯,不能復制,不能選擇;值不可以傳遞到后台
38. 列舉javaScript的3種主要數據類型,2種復合數據類型和2種特殊數據類型。
主要數據類型:string, boolean, number
復合數據類型:function, object
特殊類型:undefined,null
39. 程序中捕獲異常的方法?
try{ }catch(e){ }finally{ }
40. Ajax原理
(1)創建對象 var xhr = new XMLHttpRequest(); (2)打開請求 xhr.open('GET', 'example.txt', true); (3)發送請求 xhr.send(); 發送請求到服務器 (4)接收響應 xhr.onreadystatechange =function(){} (1)當readystate值從一個值變為另一個值時,都會觸發readystatechange事件。 (2)當readystate==4時,表示已經接收到全部響應數據。 (3)當status ==200時,表示服務器成功返回頁面和數據。 (4)如果(2)和(3)內容同時滿足,則可以通過xhr.responseText,獲得服務器返回的內容。
41. 解釋什么是Json:
(1)JSON 是一種輕量級的數據交換格式。
(2)JSON 獨立於語言和平台,JSON 解析器和 JSON 庫支持許多不同的編程語言。
(3)JSON的語法表示三種類型值,簡單值(字符串,數值,布爾值,null),數組,對象
42. js中的3種彈出式消息提醒(警告窗口,確認窗口,信息輸入窗口)的命令式什么?
alert
confirm
prompt
43. 以下代碼執行結果
var uname = 'jack' function change() { alert(uname) // ? var uname = 'lily' alert(uname) //? } change() 分別alert出 undefined,lily,(變量聲明提前問題)
44. 瀏覽器的滾動距離:
可視區域距離頁面頂部的距離
scrollTop=document.documentElement.scrollTop||document.body.scrollTop
45. 可視區的大小:
(1)innerXXX(不兼容ie)
window.innerHeight 可視區高度,包含滾動條寬度
window.innerWidth 可視區寬度,包含滾動條寬度
(2)document.documentElement.clientXXX(兼容ie)
document.documentElement.clientWidth可視區寬度,不包含滾動條寬度
document.documentElement.clientHeight可視區高度,不包含滾動條寬度
46. 節點的種類有幾種,分別是什么?
(1)元素節點:nodeType ===1;
(2)文本節點:nodeType ===3;
(3)屬性節點:nodeType ===2;
47. innerHTML和outerHTML的區別
innerHTML(元素內包含的內容)
outerHTML(自己以及元素內的內容)
48. offsetWidth offsetHeight和clientWidth clientHeight的區別
(1)offsetWidth (content寬度+padding寬度+border寬度)
(2)offsetHeight(content高度+padding高度+border高度)
(3)clientWidth(content寬度+padding寬度)
(4)clientHeight(content高度+padding高度)
49. 閉包的好處
(1)希望一個變量長期駐扎在內存當中(不被垃圾回收機制回收)
(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 實現一個函數對javascript中json 對象進行克隆
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 實現 ajax 請求或者submit請求時 鎖屏功能以及開鎖功能(請求時界面Loading以及元素不能點擊,請求完成即消除Loading)
function(url, fn) {
var obj = new XMLHttpRequest(); // XMLHttpRequest對象用於在后台與服務器交換數據
obj.open('GET', url, true);
obj.onreadystatechange = function() {
if(obj.readyState == 4 && obj.status == 200||obj.status == 304) {
loading.style.display = "none"
} else {
alert("不能點擊,哈哈哈!");
}
};
obj.send(null);
}
53、js 實現一個函數 獲得url參數的值
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、請用js計算1-10000中出現的0 的次數
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、寫一個function,清除字符串前后的空格。(兼容所有瀏覽器)
function trim(str) { if (str & typeof str === "string") { return str.replace(/(^s*)|(s*)$/g,""); //去除前后空白符 } }
56、降維數組
var arr=[[1,2],[3,4]]; function Jw(obj){ return Array.prototype.concat.apply([],obj); } Jw(arr);
57、將url的查詢參數解析成字典對象
···
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、判斷一個字符串中出現次數最多的字符,統計這個次數
···
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('出現次數最多的是:'+iIndex+'出現'+iMax+'次');
···
59、編寫一個方法 求一個字符串的字節長度;
···
//假設一個中文占兩個字節
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、編寫一個方法 去掉一個數組的重復元素
···
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個使用this的典型應用
事件: 如onclick this->發生事件的對象
構造函數 this->new 出來的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中如何檢測一個變量是一個String類型?請寫出函數實現
···
typeof(obj) == 'string'
obj.constructor == String;
···
64、網頁中實現一個計算當年還剩多少時間的倒數計時程序,要求網頁上實時動態顯示“××年還剩××天××時××分××秒”
···
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、請解釋一下什么是語義化的HTML。
內容使用特定標簽,通過標簽就能大概了解整體頁面的布局分布
66、為什么利用多個域名來存儲網站資源會更有效?
確保用戶在不同地區能用最快的速度打開網站,其中某個域名崩潰用戶也能通過其他郁悶訪問網站
67、請說出三種減低頁面加載時間的方法
1、壓縮css、js文件
2、合並js、css文件,減少http請求
3、外部js、css文件放在最底下
4、減少dom操作,盡可能用變量替代不必要的dom操作
68、什么是FOUC?你如何來避免FOUC?
由於css引入使用了@import 或者存在多個style標簽以及css文件在頁面底部引入使得css文件加載在html之后導致頁面閃爍、花屏
用link加載css文件,放在head標簽里面
69、文檔類型的作用是什么?你知道多少種文檔類型?
影響瀏覽器對html代碼的編譯渲染
html2.0
xHtml
html5
70、瀏覽器標准模式和怪異模式之間的區別是什么?
盒模型解釋不同
71、閉包
子函數能被外部調用到,則該作用連上的所有變量都會被保存下來。
72、請解釋什么是Javascript的模塊模式,並舉出實用實例。
js模塊化mvc(數據層、表現層、控制層)
seajs
命名空間
73、你如何組織自己的代碼?是使用模塊模式,還是使用經典繼承的方法?
對內:模塊模式
對外:繼承
74、你如何優化自己的代碼?
代碼重用
避免全局變量(命名空間,封閉空間,模塊化mvc..)
拆分函數避免函數過於臃腫
注釋
75、你能解釋一下JavaScript中的繼承是如何工作的嗎?
子構造函數中執行父構造函數,並用call\apply改變this
克隆父構造函數原型上的方法
76、請盡可能詳盡的解釋AJAX的工作原理。
創建ajax對象(XMLHttpRequest/ActiveXObject(Microsoft.XMLHttp))
判斷數據傳輸方式(GET/POST)
打開鏈接 open()
發送 send()
當ajax對象完成第四步(onreadystatechange)數據接收完成,判斷http響應狀態(status)200-300之間或者304(緩存)執行回調函數
77、最簡單的一道題
···
var a = 2, b = 3;
var c = a+++b; // c = 5
···
78、var和function的預解析問題,以及變量和function的先后順序的問題
···
// 以下代碼執行輸出結果是什么
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)) //仍然是預解析(在與解析過程中還要考慮一下當前變量的作用於) 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()