21、如何判斷一個對象是否屬于某個類?
使用instanceof
if(a instanceof Person){
alert('yes');
}
22、new操作符具體干了什么呢?
(1)創(chuàng)建一個空對象,并且this變量引用該對象,同時還繼承了該函數(shù)的原型。
(2)屬性和方法被加入到this引用的對象中。
(3)新創(chuàng)建的對象由this所引用,并且最后隱式的返回this。
var obj = {};
obj.proto = Base.prototype;
Base.call(obj);
23、Javascript中,有一個函數(shù),執(zhí)行時對象查找時,永遠不會去查找原型,這個函數(shù)是?
hasOwnProperty
javaScript中hasOwnProperty函數(shù)方法是返回一個布爾值,指出一個對象是否具有指定名稱的屬性。此方法無法檢查該對象的原型鏈中是否具有該屬性;該屬性必須是對象本身的一個成員。
使用方法:
object.hasOwnProperty(proName)
其中參數(shù)object是必選項。一個對象的實例。
proName是必選項。一個屬性名稱的字符串值。
如果object具有指定名稱的屬性,那么JavaScript中hasOwnProperty函數(shù)方法返回true,反之則返回false。
24、JSON的了解?
JSON(JavaScript Object Notation)是一種輕量級的數(shù)據交換格式。
它是基于JavaScript的一個子集。數(shù)據格式簡單,易于讀寫,占用帶寬小
如:{"age":"12", "name":"back"}
JSON字符串轉換為JSON對象:
var obj =eval('('+ str +')');
var obj = str.parseJSON();
var obj = JSON.parse(str);
JSON對象轉換為JSON字符串:
var last=obj.toJSONString();
var last=JSON.stringify(obj);
[].forEach.call($$(""),function(a){a.style.outline="1pxsolid #"+(~~(Math.random()(1<<24))).toString(16)})能解釋一下這段代碼的意思嗎?
25、js延遲加載的方式有哪些?
defer和async、動態(tài)創(chuàng)建DOM方式(用得最多)、按需異步載入js
26、Ajax是什么?如何創(chuàng)建一個Ajax?
ajax的全稱:AsynchronousJavascript And XML。
異步傳輸+js+xml。
所謂異步,在這里簡單地解釋就是:向服務器發(fā)送請求的時候,我們不必等待結果,而是可以同時做其他的事情,等到有了結果它自己會根據設定進行后續(xù)操作,與此同時,頁面是不會發(fā)生整頁刷新的,提高了用戶體驗。
(1)創(chuàng)建XMLHttpRequest對象,也就是創(chuàng)建一個異步調用對象
(2)創(chuàng)建一個新的HTTP請求,并指定該HTTP請求的方法、URL及驗證信息
(3)設置響應HTTP請求狀態(tài)變化的函數(shù)
(4)發(fā)送HTTP請求
(5)獲取異步調用返回的數(shù)據
(6)使用JavaScript和DOM實現(xiàn)局部刷新
27、Ajax解決瀏覽器緩存問題?
(1)在ajax發(fā)送請求前加上anyAjaxObj.setRequestHeader("If-Modified-Since","0")。
(2)在ajax發(fā)送請求前加上anyAjaxObj.setRequestHeader("Cache-Control","no-cache")。
(3)在URL后面加上一個隨機數(shù):"fresh=" + Math.random();。
(4)在URL后面加上時間搓:"nowtime=" + new Date().getTime();。
(5)如果是使用jQuery,直接這樣就可以了$.ajaxSetup({cache:false})。這樣頁面的所有ajax都會執(zhí)行這條語句就是不需要保存緩存記錄。
28、同步和異步的區(qū)別?
同步的概念應該是來自于OS中關于同步的概念:不同進程為協(xié)同完成某項工作而在先后次序上調整(通過阻塞,喚醒等方式).同步強調的是順序性.誰先誰后.異步則不存在這種順序性.
同步:瀏覽器訪問服務器請求,用戶看得到頁面刷新,重新發(fā)請求,等請求完,頁面刷新,新內容出現(xiàn),用戶看到新內容,進行下一步操作。
異步:瀏覽器訪問服務器請求,用戶正常操作,瀏覽器后端進行請求。等請求完,頁面不刷新,新內容也會出現(xiàn),用戶看到新內容。
29、如何解決跨域問題?
jsonp、iframe、window.name、window.postMessage、服務器上設置代理頁面
30、模塊化開發(fā)怎么做?
立即執(zhí)行函數(shù),不暴露私有成員
var module1 = (function(){
var_count = 0;
var m1 =function(){
//...
};
var m2 =function(){
//...
};
return {
m1 :m1,
m2 : m2
};
})();
31、AMD(Modules/Asynchronous-Definition)、CMD(CommonModule Definition)規(guī)范區(qū)別?
Asynchronous Module Definition,異步模塊定義,所有的模塊將被異步加載,模塊加載不影響后面語句運行。所有依賴某些模塊的語句均放置在回調函數(shù)中。
區(qū)別:
(1)對于依賴的模塊,AMD是提前執(zhí)行,CMD是延遲執(zhí)行。不過RequireJS從2.0開始,也改成可以延遲執(zhí)行(根據寫法不同,處理方式不同)。CMD推崇as lazy as possible.
(2)CMD推崇依賴就近,AMD推崇依賴前置??创a:
// CMD
define(function(require, exports, module) {
var a = require('./a')
a.doSomething()
//此處略去100行
var b = require('./b') //依賴可以就近書寫
b.doSomething()
// ...
})
// AMD默認推薦
define(['./a', './b'], function(a, b) { //依賴必須一開始就寫好
a.doSomething()
//此處略去100行
b.doSomething()
// ...
})
32、異步加載JS的方式有哪些?
(1)defer,只支持IE
(2)async:
(3)創(chuàng)建script,插入到DOM中,加載完畢后callBack
33、documen.write和innerHTML的區(qū)別
document.write只能重繪整個頁面
innerHTML可以重繪頁面的一部分
34、DOM操作——怎樣添加、移除、移動、復制、創(chuàng)建和查找節(jié)點?
(1)創(chuàng)建新節(jié)點
createDocumentFragment() //創(chuàng)建一個DOM片段
createElement() //創(chuàng)建一個具體的元素
createTextNode() //創(chuàng)建一個文本節(jié)點
(2)添加、移除、替換、插入
appendChild()
removeChild()
replaceChild()
insertBefore() //在已有的子節(jié)點前插入一個新的子節(jié)點
(3)查找
getElementsByTagName() //通過標簽名稱
getElementsByName() //通過元素的Name屬性的值(IE容錯能力較強,會得到一個數(shù)組,其中包括id等于name值的)
getElementById() //通過元素Id,唯一性
35、.call()和.apply()的區(qū)別?
例子中用add來替換sub,add.call(sub,3,1)== add(3,1),所以運行結果為:alert(4);
注意:js中的函數(shù)其實是對象,函數(shù)名是對Function對象的引用。
function add(a,b)
{
alert(a+b);
}
function sub(a,b)
{
alert(a-b);
}
add.call(sub,3,1);
36、jquery.extend與jquery.fn.extend的區(qū)別?
jquery.extend為jquery類添加類方法,可以理解為添加靜態(tài)方法
jquery.fn.extend:
源碼中jquery.fn= jquery.prototype,所以對jquery.fn的擴展,就是為jquery類添加成員函數(shù)
使用:
jquery.extend擴展,需要通過jquery類來調用,而jquery.fn.extend擴展,所有jquery實例都可以直接調用。
37、Jquery與jQuery UI有啥區(qū)別?
*jQuery是一個js庫,主要提供的功能是選擇器,屬性修改和事件綁定等等。
*jQuery UI則是在jQuery的基礎上,利用jQuery的擴展性,設計的插件。
提供了一些常用的界面元素,諸如對話框、拖動行為、改變大小行為等等
38、jquery中如何將數(shù)組轉化為json字符串,然后再轉化回來?
jQuery中沒有提供這個功能,所以你需要先編寫兩個jQuery的擴展:
$.fn.stringifyArray = function(array) {
return JSON.stringify(array)
}
$.fn.parseArray = function(array) {
return JSON.parse(array)
}
然后調用:
$("").stringifyArray(array)
39、針對jQuery的優(yōu)化方法?
*基于Class的選擇性的性能相對于Id選擇器開銷很大,因為需遍歷所有DOM元素。
*頻繁操作的DOM,先緩存起來再操作。用Jquery的鏈式調用更好。
比如:varstr=$("a").attr("href");
*for (var i = size; i < arr.length; i++){}
for循環(huán)每一次循環(huán)都查找了數(shù)組(arr)的.length屬性,在開始循環(huán)的時候設置一個變量來存儲這個數(shù)字,可以讓循環(huán)跑得更快:
for(var i = size, length = arr.length; i < length; i++) {}
40、如何判斷當前腳本運行在瀏覽器還是node環(huán)境中?(阿里)
this === window ? 'browser' : 'node';
通過判斷Global對象是否為window,如果不為window,當前腳本沒有運行在瀏覽器中
41、jQuery的slideUp動畫,如果目標元素是被外部事件驅動,當鼠標快速地連續(xù)觸發(fā)外部元素事件,動畫會滯后的反復執(zhí)行,該如何處理呢?
jquery stop():如:$("#div").stop().animate({width:"100px"},100);
42、那些操作會造成內存泄漏?
內存泄漏指任何對象在您不再擁有或需要它之后仍然存在。
垃圾回收器定期掃描對象,并計算引用了每個對象的其他對象的數(shù)量。如果一個對象的引用數(shù)量為0(沒有其他對象引用過該對象),或對該對象的惟一引用是循環(huán)的,那么該對象的內存即可回收。
setTimeout的第一個參數(shù)使用字符串而非函數(shù)的話,會引發(fā)內存泄漏。
閉包、控制臺日志、循環(huán)(在兩個對象彼此引用且彼此保留時,就會產生一個循環(huán))
43、JQuery一個對象可以同時綁定多個事件,這是如何實現(xiàn)的?
*多個事件同一個函數(shù):
$("div").on("click mouseover", function(){});
*多個事件不同函數(shù)
$("div").on({
click: function(){},
mouseover: function(){}
});
44、知道什么是webkit么?知道怎么用瀏覽器的各種工具來調試和debug代碼么?
Chrome,Safari瀏覽器內核。
45、用js實現(xiàn)千位分隔符?
function commafy(num) {
return num && num
.toString()
.replace(/(\d)(?=(\d{3})+.)/g, function($0, $1) {
return $1 + ",";
});
}
console.log(commafy(1234567.90));//1,234,567.90
46、檢測瀏覽器版本版本有哪些方式?
功能檢測、userAgent特征檢測
比如:navigator.userAgent
//"Mozilla/5.0 (Macintosh; Intel MacOS X 10_10_2) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36"
47、What is a Polyfill?
polyfill是“在舊版瀏覽器上復制標準API的JavaScript補充”,可以動態(tài)地加載JavaScript代碼或庫,在不支持這些標準API的瀏覽器中模擬它們。
例如,geolocation(地理位置)polyfill可以在navigator對象上添加全局的geolocation對象,還能添加getCurrentPosition函數(shù)以及“坐標”回調對象,
所有這些都是W3C地理位置API定義的對象和函數(shù)。因為polyfill模擬標準API,所以能夠以一種面向所有瀏覽器未來的方式針對這些API進行開發(fā),
一旦對這些API的支持變成絕對大多數(shù),則可以方便地去掉polyfill,無需做任何額外工作。
48、做的項目中,有沒有用過或自己實現(xiàn)一些polyfill方案(兼容性處理方案)?
比如:html5shiv、Geolocation、Placeholder
49、使用JS實現(xiàn)獲取文件擴展名?
function getFileExtension(filename) {
return filename.slice((filename.lastIndexOf(".") - 1>>> 0) + 2);
}
String.lastIndexOf()方法返回指定值(本例中的'.')在調用該方法的字符串中最后出現(xiàn)的位置,如果沒找到則返回-1。
對于'filename'和'.hiddenfile',lastIndexOf的返回值分別為0和-1無符號右移操作符(?>)將-1轉換為4294967295,將-2轉換為4294967294,這個方法可以保證邊緣情況時文件名不變。
String.prototype.slice()從上面計算的索引處提取文件的擴展名。如果索引比文件名的長度大,結果為""。
作者:京程一燈
鏈接:http://www.itdecent.cn/p/de9e88065a92
來源:簡書
著作權歸作者所有。商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處。