timg.jpg
- 相關(guān)知識點
數(shù)據(jù)類型、運算、對象、function、繼承、閉包、作用域、原型鏈、事件、RegExp、JSON、Ajax、DOM、BOM、內(nèi)存泄漏、跨域、異步加載、模板引擎、前端MVC、前端MVVM、路由、模塊化、Http、Canvas、jQuery、ECMAScript 2015(ES6)、Node.js、AngularJS、Vue、React......
題目&答案
- JavaScript有哪幾種數(shù)據(jù)類型?
簡單,Number,Boolean,String,Null,Undefined
復合,Object,Array,F(xiàn)unction
- 介紹一下 JS 有哪些內(nèi)置對象。
Object 是 JavaScript 中所有對象的父對象
數(shù)據(jù)封裝類對象:Object、Array、Boolean、Number、String
其他對象:Function、Argument、Math、Date、RegExp、Error
- 列舉幾條 JavaScript 的基本代碼規(guī)范。
(1)不要在同一行聲明多個變量
(2)如果你不知道數(shù)組的長度,使用 push
(3)請使用 ===/!== 來比較 true/false 或者數(shù)值
(4)對字符串使用單引號 ''(因為大多時候我們的字符串。特別html會出現(xiàn)")
(5)使用對象字面量替代 new Array 這種形式
(6)絕對不要在一個非函數(shù)塊里聲明一個函數(shù),把那個函數(shù)賦給一個變量。瀏覽器允許你這么做,但是它們解析不同
(7)不要使用全局函數(shù)
(8)總是使用 var 來聲明變量,如果不這么做將導致產(chǎn)生全局變量,我們要避免污染全局命名空間
(9)Switch 語句必須帶有 default 分支
(10)使用 /**...*/ 進行多行注釋,包括描述,指定類型以及參數(shù)值和返回值
(11)函數(shù)不應該有時候有返回值,有時候沒有返回值
(12)語句結(jié)束一定要加分號
(13)for 循環(huán)必須使用大括號
(14)if 語句必須使用大括號
(15)for-in 循環(huán)中的變量應該使用 var 關(guān)鍵字明確限定作用域,從而避免作用域污染
(16)避免單個字符名,讓你的變量名有描述意義
(17)當命名對象、函數(shù)和實例時使用駝峰命名規(guī)則
(18)給對象原型分配方法,而不是用一個新的對象覆蓋原型,覆蓋原型會使繼承出現(xiàn)問題
(19)當給事件附加數(shù)據(jù)時,傳入一個哈希而不是原始值,這可以讓后面的貢獻者加入更多數(shù)據(jù)到事件數(shù)據(jù)里,而不用找出并更新那個事件的事件處理器.
- call和apply的作用是什么?區(qū)別是什么?
call和apply的功能基本相同,都是實現(xiàn)繼承或者轉(zhuǎn)換對象指針的作用;
唯一不通的是前者參數(shù)是羅列出來的,后者是存到數(shù)組中的;
call或apply功能就是實現(xiàn)繼承的;與面向?qū)ο蟮睦^承extends功能相似;但寫法不同;
語法:
.call(對象[,參數(shù)1,參數(shù)2,....]);//此地參數(shù)是指的是對象的參數(shù),非方法的參數(shù);
.apply(對象,參數(shù)數(shù)組)//參數(shù)數(shù)組的形式:[參數(shù)1,參數(shù)2,......]
- push()-pop()-shift()-unshift()分別是什么功能?
push 方法
將新元素添加到一個數(shù)組中,并返回數(shù)組的新長度值。
var a=[1,2,3,4];
a.push(5);
pop 方法
移除數(shù)組中的最后一個元素并返回該元素。
var a=[1,2,3,4];
a.pop();
shift 方法
移除數(shù)組中的第一個元素并返回該元素。
var a=[1,2];
alert(a.shift());
unshift 方法
將指定的元素插入數(shù)組開始位置并返回該數(shù)組。
- 試寫出大于1024并小于1360屏幕的媒體查詢關(guān)鍵CSS代碼
if ((screen.width == 1360) && (screen.height == 1024)){
setActiveStyleSheet(CSS1);
}
- 表述您對javascript this工作原理的理解
在函數(shù)中:this 通常是一個隱含的參數(shù)。
在函數(shù)外(頂級作用域中):在瀏覽器中this 指的是全局對象;在Node.js中指的是模塊(module)的導出(exports)。
傳遞到eval()中的字符串:如果eval()是被直接調(diào)用的,this 指的是當前對象;如果eval()是被間接調(diào)用的,this 就是指全局對象。
- 介紹一下 JavaScript 原型,原型鏈,它們有何特點?
每個對象都會在其內(nèi)部初始化一個屬性,就是prototype(原型),當我們訪問一個對象的屬性時,如果這個對象內(nèi)部不存在這個屬性,那么他就會去prototype里找這個屬性,這個prototype又會有自己的prototype,于是就這樣一直找下去,也就是我們平時所說的原型鏈的概念。
關(guān)系:instance.constructor.prototype = instance.__proto__
特點:JavaScript對象是通過引用來傳遞的,我們創(chuàng)建的每個新對象實體中并沒有一份屬于自己的原型副本,當我們修改原型時,與之相關(guān)的對象也會繼承這一改變。
當我們需要一個屬性時,JavaScript引擎會先看當前對象中是否有這個屬性,如果沒有的話,就會查找它的prototype對象是否有這個屬性,如此遞推下去,一致檢索到Object內(nèi)建對象。
function Func(){}
Func.prototype.name = "Xiaosong";
Func.prototype.getInfo = function() {
return this.name;
}
var person = new Func();
console.log(person.getInfo());//"Xiaosong"
console.log(Func.prototype);//Func { name = "Xiaosong", getInfo = function() }
- JavaScript 有幾種類型的值?能否畫一下它們的內(nèi)存圖?
棧:原始數(shù)據(jù)類型(Undefined,Null,Boolean,Number,String)
堆:引用數(shù)據(jù)類型(對象、數(shù)組、函數(shù))
兩種類型的區(qū)別:
//存儲位置不同
原始數(shù)據(jù)類型直接存儲在棧(stack)中的簡單數(shù)據(jù)段,占據(jù)空間小、大小固定,屬于被頻繁使用數(shù)據(jù),所以放入棧中存儲;
引用數(shù)據(jù)類型存儲在堆(heap)中的對象,占據(jù)空間大、大小不固定,如果存儲在棧中,將會影響程序運行的性能;引用數(shù)據(jù)類型在棧中存儲了指針,該指針指向堆中該實體的起始地址。當解釋器尋找引用值時,會首先檢索其在棧中的地址,取得地址后從堆中獲得實體。
- JavaScript 如何實現(xiàn)繼承?
(1)構(gòu)造繼承
(2)原型繼承
(3)實例繼承
(4)拷貝繼承
//原型prototype機制或apply和call方法去實現(xiàn)較簡單,建議使用構(gòu)造函數(shù)與原型混合方式。
function Parent() {
this.name = 'song';
}
function Child() {
this.age = 28;
}
Child.prototype = new Parent(); //通過原型,繼承了Parent
var demo = new Child();
alert(demo.age);
alert(demo.name); //得到被繼承的屬性
- JavaScript 有哪幾種創(chuàng)建對象的方式?
javascript創(chuàng)建對象簡單的說,無非就是使用內(nèi)置對象或各種自定義對象,當然還可以用JSON;但寫法有很多種,也能混合使用。
//
(1)對象字面量的方式
person={firstname:"Mark",lastname:"Yun",age:25,eyecolor:"black"};
(2)用function來模擬無參的構(gòu)造函數(shù)
function Person(){}
var person = new Person(); //定義一個function,如果使用new"實例化",該function可以看作是一個Class
person.name = "Xiaosong";
person.age = "23";
person.work = function() {
alert("Hello " + person.name);
}
person.work();
(3)用function來模擬參構(gòu)造函數(shù)來實現(xiàn)(用this關(guān)鍵字定義構(gòu)造的上下文屬性)
function Person(name,age,hobby) {
this.name = name; //this作用域:當前對象
this.age = age;
this.work = work;
this.info = function() {
alert("我叫" + this.name + ",今年" + this.age + "歲,是個" + this.work);
}
}
var Xiaosong = new Person("WooKong",23,"程序猿"); //實例化、創(chuàng)建對象
Xiaosong.info(); //調(diào)用info()方法
(4)用工廠方式來創(chuàng)建(內(nèi)置對象)
var jsCreater = new Object();
jsCreater.name = "Brendan Eich"; //JavaScript的發(fā)明者
jsCreater.work = "JavaScript";
jsCreater.info = function() {
alert("我是"+this.work+"的發(fā)明者"+this.name);
}
jsCreater.info();
(5)用原型方式來創(chuàng)建
function Standard(){}
Standard.prototype.name = "ECMAScript";
Standard.prototype.event = function() {
alert(this.name+"是腳本語言標準規(guī)范");
}
var jiaoben = new Standard();
jiaoben.event();
(6)用混合方式來創(chuàng)建
function iPhone(name,event) {
this.name = name;
this.event = event;
}
iPhone.prototype.sell = function() {
alert("我是"+this.name+",我是iPhone5s的"+this.event+"~ haha!");
}
var SE = new iPhone("iPhone SE","官方翻新機");
- eval 是做什么的?
它的功能是把對應的字符串解析成JS代碼并運行;
應該避免使用eval,因為不安全,非常耗性能(2次,一次解析成js語句,一次執(zhí)行)。
- null 和 undefined 有何區(qū)別?
null 表示一個對象被定義了,值為“空值”;
undefined 表示不存在這個值。
typeof undefined //"undefined"
undefined :是一個表示"無"的原始值或者說表示"缺少值",就是此處應該有一個值,但是還沒有定義。當嘗試讀取時會返回 undefined;
例如變量被聲明了,但沒有賦值時,就等于undefined。
typeof null //"object"
null : 是一個對象(空對象, 沒有任何屬性和方法);
例如作為函數(shù)的參數(shù),表示該函數(shù)的參數(shù)不是對象;
注意: 在驗證null時,一定要使用 === ,因為 == 無法分別 null 和 undefined
- 能否寫一個通用的事件偵聽器函數(shù)?
//Event工具集,from:github.com/markyunmarkyun.
Event = {
//頁面加載完成后
readyEvent: function(fn) {
if (fn == null) {
fn = document;
}
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = fn;
}else{
window.onload = function() {
oldonload();
fn();
};
}
},
//視能力分別使用 demo0 || demo1 || IE 方式來綁定事件
//參數(shù):操作的元素,事件名稱,事件處理程序
addEvent: function(element,type,handler) {
if (element.addEventListener) { //事件類型、需要執(zhí)行的函數(shù)、是否捕捉
element.addEventListener(type,handler,false);
}else if (element.attachEvent) {
element.attachEvent('on' + type, function() {
handler.call(element);
});
}else {
element['on' + type] = handler;
}
},
//移除事件
removeEvent: function(element,type,handler) {
if (element.removeEventListener) {
element.removeEventListener(type,handler,false);
}else if (element.datachEvent) {
element.datachEvent('on' + type,handler);
}else{
element['on' + type] = null;
}
},
//阻止事件(主要是事件冒泡,因為IE不支持事件捕獲)
stopPropagation: function(ev) {
if (ev.stopPropagation) {
ev.stopPropagation();
}else {
ev.cancelBubble = true;
}
},
//取消事件的默認行為
preventDefault: function(event) {
if (event.preventDefault) {
event.preventDefault();
}else{
event.returnValue = false;
}
},
//獲取事件目標
getTarget: function(event) {
return event.target || event.srcElemnt;
},
//獲取event對象的引用,取到事件的所有信息,確保隨時能使用event;
getEvent: function(e) {
var ev = e || window.event;
if (!ev) {
var c = this.getEvent.caller;
while(c) {
ev = c.argument[0];
if (ev && Event == ev.constructor) {
break;
}
c = c.caller;
}
}
retrun ev;
}
};
- ["1","2","3"].map(parseInt) 的答案是多少?
[1,NaN,NaN]
因為 parseInt 需要兩個參數(shù)(val,radix),其中 radix 表示解析時用的基數(shù)。
map 傳了3個(element,index,array),對應的 radix 不合法導致解析失敗。
- 事件是什么?IE與火狐的事件機制有何區(qū)別?如何阻止冒泡?
1)我們在網(wǎng)頁中的某個操作(有的操作對應多個事件)。
例如:當我們點擊一個按鈕就會產(chǎn)生一個事件。是可以被 JavaScript 偵測到的行為。
(2)事件處理機制:IE是事件冒泡、Firefox同時支持兩種事件模型,也就是:捕獲型事件和冒泡型事件;
(3)ev.stopPropagation();(舊ie的方法 ev.cancelBubble = true;)
- 什么是閉包(closure),為什么要用它?
閉包是指有權(quán)訪問另一個函數(shù)作用域中變量的函數(shù),創(chuàng)建閉包的最常見的方式就是在一個函數(shù)內(nèi)創(chuàng)建另一個函數(shù),通過另一個函數(shù)訪問這個函數(shù)的局部變量,利用閉包可以突破作用鏈域,將函數(shù)內(nèi)部的變量和方法傳遞到外部。
//閉包特性:
(1)函數(shù)內(nèi)再嵌套函數(shù)
(2)內(nèi)部函數(shù)可以引用外層的參數(shù)和變量
(3)參數(shù)和變量不會被垃圾回收機制回收
//li節(jié)點的onclick事件都能正確的彈出當前被點擊的li索引
<ul>
<li> index = 0 </li>
<li> index = 1 </li>
<li> index = 2 </li>
<li> index = 3 </li>
</ul>
<script type="text/javascript">
var nodes = document.getElementsByTagName('li');
for(i = 0;i<nodes.length;i+=1) {
nodes[i].onclick = function() {
console.log(i+1); //不使用閉包的話,值每次都是4
}(4);
}
</script>
- JavaScript 代碼中的 "use strict"; 是什么意思?使用它的區(qū)別是什么?
use strict是一種ECMAscript 5 添加的(嚴格)運行模式,這種模式使得 Javascript 在更嚴格的條件下運行,使JS編碼更加規(guī)范化的模式,消除Javascript語法的一些不合理、不嚴謹之處,減少一些怪異行為。
默認支持的糟糕特性都會被禁用,比如不能用with,也不能在意外的情況下給全局變量賦值;
全局變量的顯示聲明,函數(shù)必須聲明在頂層,不允許在非函數(shù)代碼塊內(nèi)聲明函數(shù),arguments.callee也不允許使用;
消除代碼運行的一些不安全之處,保證代碼運行的安全,限制函數(shù)中的arguments修改,嚴格模式下的eval函數(shù)的行為和非嚴格模式的也不相同;
提高編譯器效率,增加運行速度;
為未來新版本的Javascript標準化做鋪墊。
- new 操作符具體干了什么呢?
(1)創(chuàng)建一個空對象,并且 this 變量引用該對象,同時還繼承了該函數(shù)的原型。
(2)屬性和方法被加入到 this 引用的對象中。
(3)新創(chuàng)建的對象由 this 所引用,并且最后隱式的返回 this 。
//
var obj = {};
obj.__proto__ = Base.prototype;
Base.call(obj);
- JavaScript 中,有一個函數(shù),執(zhí)行對象查找時,永遠不會去查找原型,這個函數(shù)是哪個?
hasOwnProperty
//
JavaScript 中 hasOwnProperty 函數(shù)方法是返回一個布爾值,指出一個對象是否具有指定名稱的屬性。此方法無法檢查該對象的原型鏈中是否具有該屬性;該屬性必須是對象本身的一個成員。
//
使用方法:object.hasOwnProperty(proName)其中參數(shù)object是必選項,一個對象的實例。proName是必選項,一個屬性名稱的字符串值。
//
如果 object 具有指定名稱的屬性,那么JavaScript中hasOwnProperty函數(shù)方法返回 true,反之則返回 false。
- 你對 JSON 了解嗎?
JSON(JavaScript Object Notation)是一種輕量級的數(shù)據(jù)交換格式。
它是基于JavaScript的一個子集。數(shù)據(jù)格式簡單,易于讀寫,占用帶寬小。
如:{"age":"12", "name":"back"}
- Ajax 是什么?如何創(chuàng)建一個 Ajax ?
ajax的全稱:Asynchronous Javascript And XML,異步傳輸+js+xml。
所謂異步,在這里簡單地解釋就是:向服務器發(fā)送請求的時候,我們不必等待結(jié)果,而是可以同時做其他的事情,等到有了結(jié)果它自己會根據(jù)設(shè)定進行后續(xù)操作,與此同時,頁面是不會發(fā)生整頁刷新的,提高了用戶體驗。
//
(1)創(chuàng)建XMLHttpRequest對象,也就是創(chuàng)建一個異步調(diào)用對象
(2)創(chuàng)建一個新的HTTP請求,并指定該HTTP請求的方法、URL及驗證信息
(3)設(shè)置響應HTTP請求狀態(tài)變化的函數(shù)
(4)發(fā)送HTTP請求
(5)獲取異步調(diào)用返回的數(shù)據(jù)
(6)使用JavaScript和DOM實現(xiàn)局部刷新
- 同步和異步的區(qū)別?
同步的概念應該是來自于操作系統(tǒng)中關(guān)于同步的概念:不同進程為協(xié)同完成某項工作而在先后次序上調(diào)整(通過阻塞,喚醒等方式)。
同步強調(diào)的是順序性,誰先誰后;異步則不存在這種順序性。
//
同步:瀏覽器訪問服務器請求,用戶看得到頁面刷新,重新發(fā)請求,等請求完,頁面刷新,新內(nèi)容出現(xiàn),用戶看到新內(nèi)容,進行下一步操作。
//
異步:瀏覽器訪問服務器請求,用戶正常操作,瀏覽器后端進行請求。等請求完,頁面不刷新,新內(nèi)容也會出現(xiàn),用戶看到新內(nèi)容。
- 如何解決跨域問題?
jsonp、iframe、window.name、window.postMessage、服務器上設(shè)置代理頁面
- 談一談你對 ECMAScript6 的了解?
ECMAScript 6 是JavaScript語言的下一代標準,已經(jīng)在2015年6月正式發(fā)布了。
它的目標,是使得JavaScript語言可以用來編寫復雜的大型應用程序,成為企業(yè)級開發(fā)語言。
標準的制定者有計劃,以后每年發(fā)布一次標準,使用年份作為標準的版本。
因為當前版本的ES6是在2015年發(fā)布的,所以又稱ECMAScript 2015。
也就是說,ES6就是ES2015
- ECMAScript 6 怎么寫 class ,為何會出現(xiàn) class?
ES6的class可以看作只是一個語法糖,它的絕大部分功能,ES5都可以做到,新的class寫法只是讓對象原型的寫法更加清晰、更像面向?qū)ο缶幊痰恼Z法而已。
//定義類
class Point {
constructor(x,y) {
//構(gòu)造方法
this.x = x; //this關(guān)鍵字代表實例對象
this.y = y;
} toString() {
return '(' + this.x + ',' + this.y + ')';
}
}
- 異步加載 JS 的方式有哪些?
(1)defer,只支持 IE
(2)async:
(3)創(chuàng)建 script,插入到 DOM 中,加載完畢后 callBack
- document.write 和 innerHTML 有何區(qū)別?
document.write 只能重繪整個頁面innerHTML 可以重繪頁面的一部分
- 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,唯一性
如何編寫高性能 JavaScript ?詳細文章:淺談編寫高性能的Javascript代碼
- 哪些操作會造成內(nèi)存泄漏?
內(nèi)存泄漏是指任何對象在您不再擁有或需要它之后任然存在。
垃圾回收器定期掃描對象,并計算引用了每個對象的其他對象的數(shù)量,如果一個對象的引用數(shù)量為0(沒有其他對象引用過該對象),或?qū)υ搶ο蟮奈┮灰檬茄h(huán)的,那么該對象的內(nèi)存即可回收。
//
setTimeout 的第一個參數(shù)使用字符串而非函數(shù)的話,會引發(fā)內(nèi)存泄漏。
閉包、控制臺日志、循環(huán)(在兩個對象彼此引用且彼此保留時,就會產(chǎn)生一個循環(huán))
- jQuery 中如何將數(shù)組轉(zhuǎn)化為 json 字符串,然后再轉(zhuǎn)化回來?
jQuery 中沒有提供這個功能,所以需要先編寫兩個 jQuery 的擴展:
$.fn.stringifyArray = function(array) {
return JSON.stringify(array)
}
$.fn.parseArray = function(array) {
return JSON.parse(array)
}
//然后調(diào)用:
$("").stringifyArray(array)
- jQuery.extend 與 jQuery.fn.extend 有何區(qū)別?
jQuery.extend(object); //為jQuery類添加類方法,可以理解為添加靜態(tài)方法
jQuery.extend({
min: function(a, b) { return a < b ? a : b; },
max: function(a, b) { return a > b ? a : b; }
});
jQuery.min(2,3); // 2
jQuery.max(4,5); // 5
jQuery.extend( target, object1, [objectN])用一個或多個其他對象來擴展一個對象,返回被擴展的對象
jQuery.fn.extend(object); //對jQuery.prototype進行的擴展,就是為jQuery類添加“成員函數(shù)”。jQuery類的實例可以使用這個“成員函數(shù)”。
比如我們要開發(fā)一個插件,做一個特殊的編輯框,當它被點擊時,便alert 當前編輯框里的內(nèi)容。可以這么做:
$.fn.extend({
alertWhileClick:function() {
$(this).click(function(){
alert($(this).val());
});
}
});
$("#input1").alertWhileClick(); // 頁面上為$("#input1")為一個jQuery實例,當它調(diào)用成員方法 alertWhileClick后,便實現(xiàn)了擴展,每次被點擊時它會先彈出目前編輯里的內(nèi)容。
- 是否了解針對 jQuery 性能的優(yōu)化方法?
基于Class的選擇性的性能相對于Id選擇器開銷很大,因為需遍歷所有DOM元素。
//
頻繁操作的DOM,先緩存起來再操作。用Jquery的鏈式調(diào)用更好。
比如:var str=$("a").attr("href");
//
for (var i = size; i < arr.length; i++) {}
for 循環(huán)每一次循環(huán)都查找了數(shù)組 (arr) 的.length 屬性,在開始循環(huán)的時候設(shè)置一個變量來存儲這個數(shù)字,可以讓循環(huán)跑得更快:
for (var i = size, length = arr.length; i < length; i++) {}
- jQuery 與 jQuery UI 有何區(qū)別?
jQuery是一個js庫,主要提供的功能是選擇器,屬性修改和事件綁定等等。
jQuery UI則是在jQuery的基礎(chǔ)上,利用jQuery的擴展性,設(shè)計的插件。提供了一些常用的界面元素,諸如對話框、拖動行為、改變大小行為等等
- 如何判斷當前腳本運行在瀏覽器還是 node 環(huán)境中?(阿里)
通過判斷 Global 對象是否為 window ,如果不為 window ,當前腳本沒有運行在瀏覽器中
- 怎樣用js實現(xiàn)千位分隔符?
正則 + replace
function commafy(num) {
num = num + '';
var reg = /(-?d+)(d{3})/;
if (reg.test(num)) {
num = num.replace(reg, '$1,$2');
}
return num;
}
- 檢測瀏覽器版本有哪些方式?
功能檢測、userAgent 特征檢測
比如:navigator.userAgent
//"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36"
- Canvas和SVG的比較;
Canvas | SVG |
---|---|
位圖技術(shù),可以保存為.png | 矢量圖技術(shù),不能保存為位圖 |
善于表現(xiàn)顏色和線條細節(jié) | 可以縮放,不善于表現(xiàn)細節(jié) |
網(wǎng)頁游戲,統(tǒng)計圖 | 圖標,統(tǒng)計圖,地圖 |
一個標簽(canvas)+一個對象(getcontext) | |
所有圖形圖像都靠ctx繪制 | 幾十個標簽---每個圖形對應一個標簽 |
不能被搜索引擎爬蟲所訪問 | 可以 |
只能為整個 Canvas綁定監(jiān)聽函數(shù) | 每個圖形(標簽)可以綁定事件監(jiān)聽函數(shù) |
39.談談你對 JavaScript 中的模塊規(guī)范 CommonJS、AMD、CMD 的了解?
CommonJS | AMD | CMD |
---|---|---|
Node.js | RequireJS | SeaJS |
詳細文章:淺析JS中的模塊規(guī)范(CommonJS,AMD,CMD)、關(guān)于 CommonJS AMD CMD UMD
40.MVC
4749582-b49cc8f09e938eaa.png
41.MVVM
模型(Model)
視圖(View)
視圖模型(ViewModel)
(1)各部分間都是雙向通信
(2)View 與 Model 不發(fā)生聯(lián)系,都通過 ViewModel 傳遞
(3)View 非常薄,不部署任何業(yè)務邏輯,稱為“被動視圖”(Passive View),即沒有任何主動性;而 ViewModel 非常厚,所有邏輯都部署在那里。
采用雙向綁定(data-binding):View 的變動,自動反映在 ViewModel ,反之亦然。
42.HTTP協(xié)議的狀態(tài)消息都有哪些?(如200、302對應的描述)國內(nèi)外的JS牛人都知道哪些?
協(xié)議是指計算機通信網(wǎng)絡(luò)中兩臺計算機之間進行通信所必須共同遵守的規(guī)定或規(guī)則,超文本傳輸協(xié)議(HTTP)是一種通信協(xié)議,它允許將超文本標記語言(HTML)文檔從Web服務器傳送到客戶端的瀏覽器,
? “100″ : Continue(繼續(xù)) 初始的請求已經(jīng)接受,客戶應當繼續(xù)發(fā)送請求的其余部分。(HTTP 1.1新)
? “101″ : Switching Protocols(切換協(xié)議) 請求者已要求服務器切換協(xié)議,服務器已確認并準備進行切換。(HTTP 1.1新)
? “200″ : OK(成功) 一切正常,對GET和POST請求的應答文檔跟在后面。
? “201″ : Created(已創(chuàng)建)服務器已經(jīng)創(chuàng)建了文檔,Location頭給出了它的URL。
? “202″ : Accepted(已接受)服務器已接受了請求,但尚未對其進行處理。
? “203″ : Non-Authoritative Information(非授權(quán)信息) 文檔已經(jīng)正常地返回,但一些應答頭可能不正確,可能來自另一來源 。(HTTP 1.1新)。
? “204″ : No Content(無內(nèi)容)未返回任何內(nèi)容,瀏覽器應該繼續(xù)顯示原來的文檔。
? “205″ : Reset Content(重置內(nèi)容)沒有新的內(nèi)容,但瀏覽器應該重置它所顯示的內(nèi)容。用來強制瀏覽器清除表單輸入內(nèi)容(HTTP 1.1新)。
? “206″ : Partial Content(部分內(nèi)容)服務器成功處理了部分 GET 請求。(HTTP 1.1新)
? “300″ : Multiple Choices(多種選擇)客戶請求的文檔可以在多個位置找到,這些位置已經(jīng)在返回的文檔內(nèi)列出。如果服務器要提出優(yōu)先選擇,則應該在Location應答頭指明。
? “301″ : Moved Permanently(永久移動)請求的網(wǎng)頁已被永久移動到新位置。服務器返回此響應(作為對 GET 或 HEAD 請求的響應)時,會自動將請求者轉(zhuǎn)到新位置。
? “302″ : Found(臨時移動)類似于301,但新的URL應該被視為臨時性的替代,而不是永久性的。注意,在HTTP1.0中對應的狀態(tài)信息是“Moved Temporatily”,出現(xiàn)該狀態(tài)代碼時,瀏覽器能夠自動訪問新的URL,因此它是一個很有用的狀態(tài)代碼。注意這個狀態(tài)代碼有時候可以和301替換使用。例如,如果瀏覽器錯誤地請求http://host/~user(缺少了后面的斜杠),有的服務器返回301,有的則返回302。嚴格地說,我們只能假定只有當原來的請求是GET時瀏覽器才會自動重定向。請參見307。
? “303″ : See Other(查看其他位置)類似于301/302,不同之處在于,如果原來的請求是POST,Location頭指定的重定向目標文檔應該通過GET提取(HTTP 1.1新)。
? “304″ : Not Modified(未修改)自從上次請求后,請求的網(wǎng)頁未被修改過。原來緩沖的文檔還可以繼續(xù)使用,不會返回網(wǎng)頁內(nèi)容。
? “305″ : Use Proxy(使用代理)只能使用代理訪問請求的網(wǎng)頁。如果服務器返回此響應,那么,服務器還會指明請求者應當使用的代理。(HTTP 1.1新)
? “307″ : Temporary Redirect(臨時重定向)和 302(Found)相同。許多瀏覽器會錯誤地響應302應答進行重定向,即使原來的請求是POST,即使它實際上只能在POST請求的應答是303時才能重定向。由于這個原因,HTTP 1.1新增了307,以便更加清除地區(qū)分幾個狀態(tài)代碼:當出現(xiàn)303應答時,瀏覽器可以跟隨重定向的GET和POST請求;如果是307應答,則瀏覽器只能跟隨對GET請求的重定向。(HTTP 1.1新)
? “400″ : Bad Request(錯誤請求)請求出現(xiàn)語法錯誤。
? “401″ : Unauthorized(未授權(quán))客戶試圖未經(jīng)授權(quán)訪問受密碼保護的頁面。應答中會包含一個WWW-Authenticate頭,瀏覽器據(jù)此顯示用戶名字/密碼對話框,然后在填寫合適的Authorization頭后再次發(fā)出請求。
? “403″ : Forbidden(已禁止) 資源不可用。服務器理解客戶的請求,但拒絕處理它。通常由于服務器上文件或目錄的權(quán)限設(shè)置導致。
? “404″ : Not Found(未找到)無法找到指定位置的資源。
? “405″ : Method Not Allowed(方法禁用)請求方法(GET、POST、HEAD、DELETE、PUT、TRACE等)禁用。(HTTP 1.1新)
? “406″ : Not Acceptable(不接受)指定的資源已經(jīng)找到,但它的MIME類型和客戶在Accpet頭中所指定的不兼容(HTTP 1.1新)。
? “407″ : Proxy Authentication Required(需要代理授權(quán))類似于401,表示客戶必須先經(jīng)過代理服務器的授權(quán)。(HTTP 1.1新)
? “408″ : Request Time-out(請求超時)服務器等候請求時超時。(HTTP 1.1新)
? “409″ : Conflict(沖突)通常和PUT請求有關(guān)。由于請求和資源的當前狀態(tài)相沖突,因此請求不能成功。(HTTP 1.1新)
? “410″ : Gone(已刪除)如果請求的資源已被永久刪除,那么,服務器會返回此響應。該代碼與 404(未找到)代碼類似,但在資源以前有但現(xiàn)在已經(jīng)不復存在的情況下,有時會替代 404 代碼出現(xiàn)。如果資源已被永久刪除,那么,您應當使用 301 代碼指定該資源的新位置。(HTTP 1.1新)
? “411″ : Length Required(需要有效長度)不會接受包含無效內(nèi)容長度標頭字段的請求。(HTTP 1.1新)
? “412″ : Precondition Failed(未滿足前提條件)服務器未滿足請求者在請求中設(shè)置的其中一個前提條件。(HTTP 1.1新)
? “413″ : Request Entity Too Large(請求實體過大)請求實體過大,已超出服務器的處理能力。如果服務器認為自己能夠稍后再處理該請求,則應該提供一個Retry-After頭。(HTTP 1.1新)
? “414″ : Request-URI Too Large(請求的 URI 過長)請求的 URI(通常為網(wǎng)址)過長,服務器無法進行處理。
? “415″ : Unsupported Media Type(不支持的媒體類型)請求的格式不受請求頁面的支持。
? “416″ : Requested range not satisfiable(請求范圍不符合要求)服務器不能滿足客戶在請求中指定的Range頭。(HTTP 1.1新)
? “417″ : Expectation Failed(未滿足期望值)服務器未滿足”期望”請求標頭字段的要求。
? “500″ : Internal Server Error(服務器內(nèi)部錯誤)服務器遇到錯誤,無法完成請求。
? “501″ : Not Implemented(尚未實施) 服務器不具備完成請求的功能。例如,當服務器無法識別請求方法時,服務器可能會返回此代碼。
? “502″ : Bad Gateway(錯誤網(wǎng)關(guān))服務器作為網(wǎng)關(guān)或者代理時,為了完成請求訪問下一個服務器,但該服務器返回了非法的應答。
? “503″ : Service Unavailable(服務不可用)服務器由于維護或者負載過重未能應答。通常,這只是一種暫時的狀態(tài)。
? “504″ : Gateway Time-out(網(wǎng)關(guān)超時) 由作為代理或網(wǎng)關(guān)的服務器使用,表示不能及時地從遠程服務器獲得應答。(HTTP 1.1新)
? “505″ : HTTP Version not supported(HTTP 版本不受支持)不支持請求中所使用的 HTTP 協(xié)議版本。
國內(nèi)的比較牛的人:淘寶網(wǎng)UED官方博客。靈玉,大成小胖,承玉,拔赤
42.documen.write和 innerHTML的區(qū)別
document.write只能重繪整個頁面
innerHTML可以重繪頁面的一部分
43.瀏覽器檢測通過什么?
(1) navigator.userAgent
(2) 不同瀏覽器的特性,如addEventListener
44.截取字符串“abcdefghi”的“fghi”
var myvalue=”abcdefghi”;
var jiequ=myvalue.substring(myvalue.length-4,myvalue.length);
alert(jiequ);
-寫出下面的運算結(jié)果
alert(typeof(null)); // object
alert(typeof(undefined)); // undefined
alert(typeof(NaN)); // number
alert(NaN==undefined); // false
alert(NaN==NaN); // false
var str="123abc";
alert(typeof(str++)); // number
alert(str);// NaN
45.問執(zhí)行完畢后 x, y, z 的值分別是多少?
var x = 1, y = z = 0;
function add(n) {
n = n+1;
}
y = add(x);
function add(n) {
n = n + 3;
}
z = add(x);
1、undefined、undefined
46.如何阻止事件的冒泡?
//阻止冒泡的方法
function stopPP(e)
{
var evt = e|| window.event;
//IE用cancelBubble=true來阻止而FF下需要用stopPropagation方法
evt.stopPropagation ?evt.stopPropagation() : (evt.cancelBubble=true);
}
47.如何阻止事件的冒泡?
//阻止冒泡的方法
function stopPP(e)
{
var evt = e|| window.event;
//IE用cancelBubble=true來阻止而FF下需要用stopPropagation方法
evt.stopPropagation ?evt.stopPropagation() : (evt.cancelBubble=true);
}
48.寫出程序運行的結(jié)果?
for(var i=0, j=0; i<10, j<6; i++, j++){
k = i + j;
}
10
49.編寫一個方法 求一個字符串的字節(jié)長度
/*假設(shè):一個英文字符占用一個字節(jié),一個中文字符占用兩個字節(jié)*/
function getBytes(str){
var len = str.length,
bytes = len,
i = 0;
for(; i<len; i++){
if (str.charCodeAt(i) > 255) bytes++;
}
return bytes;
}
alert(getBytes("玩,as"));
50.JavaScript中如何對一個對象進行深度clone?
function cloneObject(o) {
if(!o || 'object' !== typeof o) {
return o;
}
var c = 'function' === typeof o.pop ? [] : {};
var p, v;
for(p in o) {
if(o.hasOwnProperty(p)) {
v = o[p];
if(v && 'object' === typeof v) {
c[p] = Ext.ux.clone(v);
}
else {
c[p] = v;
}
}
}
return c;
};