相關(guān)知識(shí)點(diǎn)
數(shù)據(jù)類型贪壳、運(yùn)算、對(duì)象蚜退、function闰靴、繼承、閉包钻注、作用域蚂且、原型鏈、事件队寇、RegExp膘掰、JSON、Ajax佳遣、DOM识埋、BOM、內(nèi)存泄漏零渐、跨域窒舟、異步加載、模板引擎诵盼、前端MVC惠豺、前端MVVM、路由风宁、模塊化洁墙、Http、Canvas戒财、jQuery热监、ECMAScript 2015(ES6)、Node.js饮寞、AngularJS孝扛、Vue列吼、React......
題目&答案
- 介紹一下 JS 的基本數(shù)據(jù)類型。
Undefined苦始、Null寞钥、Boolean、Number陌选、String
- 介紹一下 JS 有哪些內(nèi)置對(duì)象理郑。
Object 是 JavaScript 中所有對(duì)象的父對(duì)象
數(shù)據(jù)封裝類對(duì)象:Object、Array柠贤、Boolean香浩、Number、String
其他對(duì)象:Function臼勉、Argument邻吭、Math、Date宴霸、RegExp囱晴、Error
- 列舉幾條 JavaScript 的基本代碼規(guī)范。
(1)不要在同一行聲明多個(gè)變量
(2)如果你不知道數(shù)組的長(zhǎng)度瓢谢,使用 push
(3)請(qǐng)使用 ===/!== 來比較 true/false 或者數(shù)值
(4)對(duì)字符串使用單引號(hào) ''(因?yàn)榇蠖鄷r(shí)候我們的字符串畸写。特別html會(huì)出現(xiàn)")
(5)使用對(duì)象字面量替代 new Array 這種形式
(6)絕對(duì)不要在一個(gè)非函數(shù)塊里聲明一個(gè)函數(shù),把那個(gè)函數(shù)賦給一個(gè)變量氓扛。瀏覽器允許你這么做枯芬,但是它們解析不同
(7)不要使用全局函數(shù)
(8)總是使用 var 來聲明變量,如果不這么做將導(dǎo)致產(chǎn)生全局變量采郎,我們要避免污染全局命名空間
(9)Switch 語句必須帶有 default 分支
(10)使用 /**...*/ 進(jìn)行多行注釋千所,包括描述,指定類型以及參數(shù)值和返回值
(11)函數(shù)不應(yīng)該有時(shí)候有返回值蒜埋,有時(shí)候沒有返回值
(12)語句結(jié)束一定要加分號(hào)
(13)for 循環(huán)必須使用大括號(hào)
(14)if 語句必須使用大括號(hào)
(15)for-in 循環(huán)中的變量應(yīng)該使用 var 關(guān)鍵字明確限定作用域淫痰,從而避免作用域污染
(16)避免單個(gè)字符名,讓你的變量名有描述意義
(17)當(dāng)命名對(duì)象整份、函數(shù)和實(shí)例時(shí)使用駝峰命名規(guī)則
(18)給對(duì)象原型分配方法待错,而不是用一個(gè)新的對(duì)象覆蓋原型,覆蓋原型會(huì)使繼承出現(xiàn)問題
(19)當(dāng)給事件附加數(shù)據(jù)時(shí)烈评,傳入一個(gè)哈希而不是原始值火俄,這可以讓后面的貢獻(xiàn)者加入更多數(shù)據(jù)到事件數(shù)據(jù)里,而不用找出并更新那個(gè)事件的事件處理器
- call和apply的作用是什么讲冠?區(qū)別是什么烛占?
call和apply的功能基本相同,都是實(shí)現(xiàn)繼承或者轉(zhuǎn)換對(duì)象指針的作用;
唯一不通的是前者參數(shù)是羅列出來的忆家,后者是存到數(shù)組中的;
call或apply功能就是實(shí)現(xiàn)繼承的德迹;與面向?qū)ο蟮睦^承extends功能相似捅膘;但寫法不同层扶;
語法:
.call(對(duì)象[,參數(shù)1,參數(shù)2,....]);//此地參數(shù)是指的是對(duì)象的參數(shù),非方法的參數(shù)糠睡;
.apply(對(duì)象,參數(shù)數(shù)組)//參數(shù)數(shù)組的形式:[參數(shù)1,參數(shù)2,......]
- push()-pop()-shift()-unshift()分別是什么功能瓦宜?
push 方法
將新元素添加到一個(gè)數(shù)組中筐喳,并返回?cái)?shù)組的新長(zhǎng)度值。
var a=[1,2,3,4];
a.push(5);
pop 方法
移除數(shù)組中的最后一個(gè)元素并返回該元素悬而。
var a=[1,2,3,4];
a.pop();
shift 方法
移除數(shù)組中的第一個(gè)元素并返回該元素呜舒。
var a=[1,2];
alert(a.shift());
unshift 方法
將指定的元素插入數(shù)組開始位置并返回該數(shù)組。
- 試寫出大于1024并小于1360屏幕的媒體查詢關(guān)鍵CSS代碼
if ((screen.width == 1360) && (screen.height == 1024)){
setActiveStyleSheet(CSS1);
}
- 表述您對(duì)javascript this工作原理的理解
在函數(shù)中:this 通常是一個(gè)隱含的參數(shù)笨奠。
在函數(shù)外(頂級(jí)作用域中):在瀏覽器中this 指的是全局對(duì)象袭蝗;在Node.js中指的是模塊(module)的導(dǎo)出(exports)。
傳遞到eval()中的字符串:如果eval()是被直接調(diào)用的般婆,this 指的是當(dāng)前對(duì)象到腥;如果eval()是被間接調(diào)用的,this 就是指全局對(duì)象蔚袍。
- 介紹一下 JavaScript 原型乡范,原型鏈,它們有何特點(diǎn)啤咽?
每個(gè)對(duì)象都會(huì)在其內(nèi)部初始化一個(gè)屬性晋辆,就是prototype(原型),當(dāng)我們?cè)L問一個(gè)對(duì)象的屬性時(shí)闰蚕,如果這個(gè)對(duì)象內(nèi)部不存在這個(gè)屬性栈拖,那么他就會(huì)去prototype里找這個(gè)屬性,這個(gè)prototype又會(huì)有自己的prototype没陡,于是就這樣一直找下去涩哟,也就是我們平時(shí)所說的原型鏈的概念。
關(guān)系:instance.constructor.prototype = instance.__proto__
特點(diǎn):JavaScript對(duì)象是通過引用來傳遞的盼玄,我們創(chuàng)建的每個(gè)新對(duì)象實(shí)體中并沒有一份屬于自己的原型副本贴彼,當(dāng)我們修改原型時(shí),與之相關(guān)的對(duì)象也會(huì)繼承這一改變埃儿。
當(dāng)我們需要一個(gè)屬性時(shí)器仗,JavaScript引擎會(huì)先看當(dāng)前對(duì)象中是否有這個(gè)屬性,如果沒有的話,就會(huì)查找它的prototype對(duì)象是否有這個(gè)屬性精钮,如此遞推下去威鹿,一致檢索到Object內(nèi)建對(duì)象。
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ù)類型(對(duì)象脓杉、數(shù)組糟秘、函數(shù))
兩種類型的區(qū)別:
//存儲(chǔ)位置不同
原始數(shù)據(jù)類型直接存儲(chǔ)在棧(stack)中的簡(jiǎn)單數(shù)據(jù)段,占據(jù)空間小球散、大小固定尿赚,屬于被頻繁使用數(shù)據(jù),所以放入棧中存儲(chǔ)沛婴;
引用數(shù)據(jù)類型存儲(chǔ)在堆(heap)中的對(duì)象,占據(jù)空間大吼畏、大小不固定,如果存儲(chǔ)在棧中,將會(huì)影響程序運(yùn)行的性能嘁灯;引用數(shù)據(jù)類型在棧中存儲(chǔ)了指針泻蚊,該指針指向堆中該實(shí)體的起始地址。當(dāng)解釋器尋找引用值時(shí)丑婿,會(huì)首先檢索其在棧中的地址性雄,取得地址后從堆中獲得實(shí)體。
JavaScript 如何實(shí)現(xiàn)繼承羹奉?
(1)構(gòu)造繼承
(2)原型繼承
(3)實(shí)例繼承
(4)拷貝繼承
//原型prototype機(jī)制或apply和call方法去實(shí)現(xiàn)較簡(jiǎ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)建對(duì)象的方式诀拭?
javascript創(chuàng)建對(duì)象簡(jiǎn)單的說,無非就是使用內(nèi)置對(duì)象或各種自定義對(duì)象迁筛,當(dāng)然還可以用JSON;但寫法有很多種耕挨,也能混合使用细卧。
//
(1)對(duì)象字面量的方式
person={firstname:"Mark",lastname:"Yun",age:25,eyecolor:"black"};
(2)用function來模擬無參的構(gòu)造函數(shù)
function Person(){}
var person = new Person(); //定義一個(gè)function,如果使用new"實(shí)例化",該function可以看作是一個(gè)Class
person.name = "Xiaosong";
person.age = "23";
person.work = function() {
alert("Hello " + person.name);
}
person.work();
(3)用function來模擬參構(gòu)造函數(shù)來實(shí)現(xiàn)(用this關(guān)鍵字定義構(gòu)造的上下文屬性)
function Person(name,age,hobby) {
this.name = name; //this作用域:當(dāng)前對(duì)象
this.age = age;
this.work = work;
this.info = function() {
alert("我叫" + this.name + "筒占,今年" + this.age + "歲贪庙,是個(gè)" + this.work);
}
}
var Xiaosong = new Person("WooKong",23,"程序猿"); //實(shí)例化、創(chuàng)建對(duì)象
Xiaosong.info(); //調(diào)用info()方法
(4)用工廠方式來創(chuàng)建(內(nèi)置對(duì)象)
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+"是腳本語言標(biāo)準(zhǔn)規(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","官方翻新機(jī)");
SE.sell();
- eval 是做什么的止邮?
它的功能是把對(duì)應(yīng)的字符串解析成JS代碼并運(yùn)行这橙;
應(yīng)該避免使用eval,因?yàn)椴话踩寂浅:男阅埽?次屈扎,一次解析成js語句,一次執(zhí)行)撩匕。
- null 和 undefined 有何區(qū)別助隧?
null 表示一個(gè)對(duì)象被定義了,值為“空值”滑沧;
undefined 表示不存在這個(gè)值。
typeof undefined //"undefined"
undefined :是一個(gè)表示"無"的原始值或者說表示"缺少值"巍实,就是此處應(yīng)該有一個(gè)值滓技,但是還沒有定義。當(dāng)嘗試讀取時(shí)會(huì)返回 undefined棚潦;
例如變量被聲明了令漂,但沒有賦值時(shí),就等于undefined丸边。
typeof null //"object"
null : 是一個(gè)對(duì)象(空對(duì)象, 沒有任何屬性和方法)叠必;
例如作為函數(shù)的參數(shù),表示該函數(shù)的參數(shù)不是對(duì)象妹窖;
注意: 在驗(yàn)證null時(shí)纬朝,一定要使用 === ,因?yàn)?== 無法分別 null 和 undefined
- 能否寫一個(gè)通用的事件偵聽器函數(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;
}
},
//阻止事件(主要是事件冒泡嫉沽,因?yàn)镮E不支持事件捕獲)
stopPropagation: function(ev) {
if (ev.stopPropagation) {
ev.stopPropagation();
}else {
ev.cancelBubble = true;
}
},
//取消事件的默認(rèn)行為
preventDefault: function(event) {
if (event.preventDefault) {
event.preventDefault();
}else{
event.returnValue = false;
}
},
//獲取事件目標(biāo)
getTarget: function(event) {
return event.target || event.srcElemnt;
},
//獲取event對(duì)象的引用辟犀,取到事件的所有信息,確保隨時(shí)能使用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]
因?yàn)?parseInt 需要兩個(gè)參數(shù)(val,radix),其中 radix 表示解析時(shí)用的基數(shù)臣咖。
map 傳了3個(gè)(element,index,array)跃捣,對(duì)應(yīng)的 radix 不合法導(dǎo)致解析失敗。
- 事件是什么夺蛇?IE與火狐的事件機(jī)制有何區(qū)別疚漆?如何阻止冒泡?
(1)我們?cè)诰W(wǎng)頁中的某個(gè)操作(有的操作對(duì)應(yīng)多個(gè)事件)。
例如:當(dāng)我們點(diǎn)擊一個(gè)按鈕就會(huì)產(chǎn)生一個(gè)事件娶聘。是可以被 JavaScript 偵測(cè)到的行為闻镶。
(2)事件處理機(jī)制:IE是事件冒泡、Firefox同時(shí)支持兩種事件模型丸升,也就是:捕獲型事件和冒泡型事件铆农;
(3)ev.stopPropagation();(舊ie的方法 ev.cancelBubble = true;)
- 什么是閉包(closure),為什么要用它狡耻?
閉包是指有權(quán)訪問另一個(gè)函數(shù)作用域中變量的函數(shù)墩剖,創(chuàng)建閉包的最常見的方式就是在一個(gè)函數(shù)內(nèi)創(chuàng)建另一個(gè)函數(shù),通過另一個(gè)函數(shù)訪問這個(gè)函數(shù)的局部變量夷狰,利用閉包可以突破作用鏈域岭皂,將函數(shù)內(nèi)部的變量和方法傳遞到外部。
//閉包特性:
(1)函數(shù)內(nèi)再嵌套函數(shù)
(2)內(nèi)部函數(shù)可以引用外層的參數(shù)和變量
(3)參數(shù)和變量不會(huì)被垃圾回收機(jī)制回收
//li節(jié)點(diǎn)的onclick事件都能正確的彈出當(dāng)前被點(diǎn)擊的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 添加的(嚴(yán)格)運(yùn)行模式,這種模式使得 Javascript 在更嚴(yán)格的條件下運(yùn)行,使JS編碼更加規(guī)范化的模式,消除Javascript語法的一些不合理进倍、不嚴(yán)謹(jǐn)之處土至,減少一些怪異行為。
默認(rèn)支持的糟糕特性都會(huì)被禁用猾昆,比如不能用with陶因,也不能在意外的情況下給全局變量賦值;
全局變量的顯示聲明,函數(shù)必須聲明在頂層,不允許在非函數(shù)代碼塊內(nèi)聲明函數(shù),arguments.callee也不允許使用毡庆;
消除代碼運(yùn)行的一些不安全之處坑赡,保證代碼運(yùn)行的安全,限制函數(shù)中的arguments修改,嚴(yán)格模式下的eval函數(shù)的行為和非嚴(yán)格模式的也不相同;
提高編譯器效率么抗,增加運(yùn)行速度毅否;
為未來新版本的Javascript標(biāo)準(zhǔn)化做鋪墊。
- new 操作符具體干了什么呢蝇刀?
(1)創(chuàng)建一個(gè)空對(duì)象螟加,并且 this 變量引用該對(duì)象,同時(shí)還繼承了該函數(shù)的原型吞琐。
(2)屬性和方法被加入到 this 引用的對(duì)象中捆探。
(3)新創(chuàng)建的對(duì)象由 this 所引用,并且最后隱式的返回 this 站粟。
//
var obj = {};
obj.__proto__ = Base.prototype;
Base.call(obj);
- JavaScript 中黍图,有一個(gè)函數(shù),執(zhí)行對(duì)象查找時(shí)奴烙,永遠(yuǎn)不會(huì)去查找原型助被,這個(gè)函數(shù)是哪個(gè)剖张?
hasOwnProperty
//
JavaScript 中 hasOwnProperty 函數(shù)方法是返回一個(gè)布爾值,指出一個(gè)對(duì)象是否具有指定名稱的屬性揩环。此方法無法檢查該對(duì)象的原型鏈中是否具有該屬性搔弄;該屬性必須是對(duì)象本身的一個(gè)成員。
//
使用方法:object.hasOwnProperty(proName)其中參數(shù)object是必選項(xiàng)丰滑,一個(gè)對(duì)象的實(shí)例顾犹。proName是必選項(xiàng),一個(gè)屬性名稱的字符串值褒墨。
//
如果 object 具有指定名稱的屬性炫刷,那么JavaScript中hasOwnProperty函數(shù)方法返回 true,反之則返回 false郁妈。
- 你對(duì) JSON 了解嗎柬唯?
JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式。
它是基于JavaScript的一個(gè)子集圃庭。數(shù)據(jù)格式簡(jiǎn)單,易于讀寫失晴,占用帶寬小剧腻。
如:{"age":"12", "name":"back"}
- Ajax 是什么?如何創(chuàng)建一個(gè) Ajax 涂屁?
ajax的全稱:Asynchronous Javascript And XML书在,異步傳輸+js+xml。
所謂異步拆又,在這里簡(jiǎn)單地解釋就是:向服務(wù)器發(fā)送請(qǐng)求的時(shí)候儒旬,我們不必等待結(jié)果,而是可以同時(shí)做其他的事情帖族,等到有了結(jié)果它自己會(huì)根據(jù)設(shè)定進(jìn)行后續(xù)操作栈源,與此同時(shí),頁面是不會(huì)發(fā)生整頁刷新的竖般,提高了用戶體驗(yàn)甚垦。
//
(1)創(chuàng)建XMLHttpRequest對(duì)象,也就是創(chuàng)建一個(gè)異步調(diào)用對(duì)象
(2)創(chuàng)建一個(gè)新的HTTP請(qǐng)求,并指定該HTTP請(qǐng)求的方法、URL及驗(yàn)證信息
(3)設(shè)置響應(yīng)HTTP請(qǐng)求狀態(tài)變化的函數(shù)
(4)發(fā)送HTTP請(qǐng)求
(5)獲取異步調(diào)用返回的數(shù)據(jù)
(6)使用JavaScript和DOM實(shí)現(xiàn)局部刷新
- 同步和異步的區(qū)別涣雕?
同步的概念應(yīng)該是來自于操作系統(tǒng)中關(guān)于同步的概念:不同進(jìn)程為協(xié)同完成某項(xiàng)工作而在先后次序上調(diào)整(通過阻塞,喚醒等方式)艰亮。
同步強(qiáng)調(diào)的是順序性,誰先誰后挣郭;異步則不存在這種順序性迄埃。
//
同步:瀏覽器訪問服務(wù)器請(qǐng)求,用戶看得到頁面刷新兑障,重新發(fā)請(qǐng)求,等請(qǐng)求完侄非,頁面刷新蕉汪,新內(nèi)容出現(xiàn),用戶看到新內(nèi)容,進(jìn)行下一步操作彩库。
//
異步:瀏覽器訪問服務(wù)器請(qǐng)求肤无,用戶正常操作,瀏覽器后端進(jìn)行請(qǐng)求骇钦。等請(qǐng)求完宛渐,頁面不刷新,新內(nèi)容也會(huì)出現(xiàn)眯搭,用戶看到新內(nèi)容窥翩。
- 如何解決跨域問題?
jsonp鳞仙、iframe寇蚊、window.name、window.postMessage棍好、服務(wù)器上設(shè)置代理頁面
- 談一談你對(duì) ECMAScript6 的了解仗岸?
ECMAScript 6 是JavaScript語言的下一代標(biāo)準(zhǔn),已經(jīng)在2015年6月正式發(fā)布了借笙。
它的目標(biāo)扒怖,是使得JavaScript語言可以用來編寫復(fù)雜的大型應(yīng)用程序,成為企業(yè)級(jí)開發(fā)語言业稼。
標(biāo)準(zhǔn)的制定者有計(jì)劃盗痒,以后每年發(fā)布一次標(biāo)準(zhǔn),使用年份作為標(biāo)準(zhǔn)的版本低散。
因?yàn)楫?dāng)前版本的ES6是在2015年發(fā)布的俯邓,所以又稱ECMAScript 2015。
也就是說熔号,ES6就是ES2015
- ECMAScript 6 怎么寫 class 稽鞭,為何會(huì)出現(xiàn) class?
ES6的class可以看作只是一個(gè)語法糖引镊,它的絕大部分功能川慌,ES5都可以做到,新的class寫法只是讓對(duì)象原型的寫法更加清晰祠乃、更像面向?qū)ο缶幊痰恼Z法而已梦重。
//定義類
class Point {
constructor(x,y) {
//構(gòu)造方法
this.x = x; //this關(guān)鍵字代表實(shí)例對(duì)象
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 只能重繪整個(gè)頁面innerHTML 可以重繪頁面的一部分
- DOM 操作——怎樣添加蚓胸、移除挣饥、移動(dòng)、復(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() //在已有的子節(jié)點(diǎn)前插入一個(gè)新的子節(jié)點(diǎn)
(3)查找
getElementsByTagName() //通過標(biāo)簽名稱
getElementsByName() //通過元素的Name屬性的值(IE容錯(cuò)能力較強(qiáng),會(huì)得到一個(gè)數(shù)組叹哭,其中包括id等于name值的)
getElementById() //通過元素Id忍宋,唯一性
如何編寫高性能 JavaScript ?詳細(xì)文章:[淺談編寫高性能的Javascript代碼](http://developer.51cto.com/art/200906/131335.htm)
- 哪些操作會(huì)造成內(nèi)存泄漏风罩?
內(nèi)存泄漏是指任何對(duì)象在您不再擁有或需要它之后任然存在糠排。
垃圾回收器定期掃描對(duì)象,并計(jì)算引用了每個(gè)對(duì)象的其他對(duì)象的數(shù)量超升,如果一個(gè)對(duì)象的引用數(shù)量為0(沒有其他對(duì)象引用過該對(duì)象)入宦,或?qū)υ搶?duì)象的惟一引用是循環(huán)的,那么該對(duì)象的內(nèi)存即可回收室琢。
//
setTimeout 的第一個(gè)參數(shù)使用字符串而非函數(shù)的話云石,會(huì)引發(fā)內(nèi)存泄漏。
閉包研乒、控制臺(tái)日志、循環(huán)(在兩個(gè)對(duì)象彼此引用且彼此保留時(shí)淋硝,就會(huì)產(chǎn)生一個(gè)循環(huán))
jQuery 中如何將數(shù)組轉(zhuǎn)化為 json 字符串雹熬,然后再轉(zhuǎn)化回來?
jQuery 中沒有提供這個(gè)功能谣膳,所以需要先編寫兩個(gè) jQuery 的擴(kuò)展:
$.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])用一個(gè)或多個(gè)其他對(duì)象來擴(kuò)展一個(gè)對(duì)象继谚,返回被擴(kuò)展的對(duì)象
jQuery.fn.extend(object); //對(duì)jQuery.prototype進(jìn)行的擴(kuò)展烈菌,就是為jQuery類添加“成員函數(shù)”。jQuery類的實(shí)例可以使用這個(gè)“成員函數(shù)”花履。
比如我們要開發(fā)一個(gè)插件芽世,做一個(gè)特殊的編輯框,當(dāng)它被點(diǎn)擊時(shí)诡壁,便alert 當(dāng)前編輯框里的內(nèi)容济瓢。可以這么做:
$.fn.extend({
alertWhileClick:function() {
$(this).click(function(){
alert($(this).val());
});
}
});
$("#input1").alertWhileClick(); // 頁面上為$("#input1")為一個(gè)jQuery實(shí)例妹卿,當(dāng)它調(diào)用成員方法 alertWhileClick后旺矾,便實(shí)現(xiàn)了擴(kuò)展蔑鹦,每次被點(diǎn)擊時(shí)它會(huì)先彈出目前編輯里的內(nèi)容。
- 是否了解針對(duì) jQuery 性能的優(yōu)化方法箕宙?
基于Class的選擇性的性能相對(duì)于Id選擇器開銷很大嚎朽,因?yàn)樾璞闅v所有DOM元素。
//
頻繁操作的DOM柬帕,先緩存起來再操作哟忍。用Jquery的鏈?zhǔn)秸{(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è)置一個(gè)變量來存儲(chǔ)這個(gè)數(shù)字魁索,可以讓循環(huán)跑得更快:
for (var i = size, length = arr.length; i < length; i++) {}
- jQuery 與 jQuery UI 有何區(qū)別?
jQuery是一個(gè)js庫盼铁,主要提供的功能是選擇器粗蔚,屬性修改和事件綁定等等。
jQuery UI則是在jQuery的基礎(chǔ)上饶火,利用jQuery的擴(kuò)展性鹏控,設(shè)計(jì)的插件。提供了一些常用的界面元素肤寝,諸如對(duì)話框当辐、拖動(dòng)行為、改變大小行為等等
- 如何判斷當(dāng)前腳本運(yùn)行在瀏覽器還是 node 環(huán)境中鲤看?(阿里)
通過判斷 Global 對(duì)象是否為 window 缘揪,如果不為 window ,當(dāng)前腳本沒有運(yùn)行在瀏覽器中
- 怎樣用js實(shí)現(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;
}
- 檢測(cè)瀏覽器版本有哪些方式找筝?
功能檢測(cè)、userAgent 特征檢測(cè)
比如: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)顏色和線條細(xì)節(jié) | 可以縮放溉瓶,不善于表現(xiàn)細(xì)節(jié) |
--------------------------------- | ----------------------------------- |
網(wǎng)頁游戲急鳄,統(tǒng)計(jì)圖 | 圖標(biāo),統(tǒng)計(jì)圖堰酿,地圖 |
--------------------------------- | ----------------------------------- |
一個(gè)標(biāo)簽(canvas)+一個(gè)對(duì)象(getcontext)疾宏, | |
所有圖形圖像都靠ctx繪制 | 幾十個(gè)標(biāo)簽---每個(gè)圖形對(duì)應(yīng)一個(gè)標(biāo)簽 |
--------------------------------- | ----------------------------------- |
不能被搜索引擎爬蟲所訪問 可以 | |
--------------------------------- | ----------------------------------- |
只能為整個(gè) Canvas綁定監(jiān)聽函數(shù) | 每個(gè)圖形(標(biāo)簽)可以綁定事件監(jiān)聽函數(shù) |
--------------------------------- | ----------------------------------- |
- 談?wù)勀銓?duì) JavaScript 中的模塊規(guī)范 CommonJS、AMD触创、CMD 的了解灾锯?
CommonJS | AMD | CMD |
---|---|---|
Node.js | RequireJS | SeaJS |
//個(gè)人拙見
CommonJS | AMD | CMD |
---|---|---|
Node.js | RequireJS | SeaJS |
詳細(xì)文章:[淺析JS中的模塊規(guī)范(CommonJS,AMD嗅榕,CMD)](http://www.2cto.com/kf/201411/348276.html)顺饮、[關(guān)于 CommonJS AMD CMD UMD](http://my.oschina.net/felumanman/blog/263330?p=1)
- 前端 MVC吵聪、MVVM
1、MVC
![](http://upload-images.jianshu.io/upload_images/4749582-b49cc8f09e938eaa.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)MVC
模型(Model):數(shù)據(jù)保存
視圖(View):用戶界面
控制器(Controller):業(yè)務(wù)邏輯
(1)View 傳送指令到 Controller
(2)Controller 完成業(yè)務(wù)邏輯后兼雄,要求 Model 改變狀態(tài)
(3)Model 將新的數(shù)據(jù)發(fā)送到 View 吟逝,用戶得到反饋所有通信都是單向的。
2赦肋、MVVM
![](http://upload-images.jianshu.io/upload_images/4749582-5f80f772360f2ca8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)MVVM
模型(Model)
視圖(View)
視圖模型(ViewModel)
(1)各部分間都是雙向通信
(2)View 與 Model 不發(fā)生聯(lián)系块攒,都通過 ViewModel 傳遞
(3)View 非常薄,不部署任何業(yè)務(wù)邏輯佃乘,稱為“被動(dòng)視圖”(Passive View)囱井,即沒有任何主動(dòng)性;而 ViewModel 非常厚趣避,所有邏輯都部署在那里庞呕。
采用雙向綁定(data-binding):View 的變動(dòng),自動(dòng)反映在 ViewModel 程帕,反之亦然住练。
- HTTP協(xié)議的狀態(tài)消息都有哪些?(如200、302對(duì)應(yīng)的描述)國(guó)內(nèi)外的JS牛人都知道哪些?
協(xié)議是指計(jì)算機(jī)通信網(wǎng)絡(luò)中兩臺(tái)計(jì)算機(jī)之間進(jìn)行通信所必須共同遵守的規(guī)定或規(guī)則愁拭,超文本傳輸協(xié)議(HTTP)是一種通信協(xié)議讲逛,它允許將超文本標(biāo)記語言(HTML)文檔從Web服務(wù)器傳送到客戶端的瀏覽器,
? “100″ : Continue(繼續(xù)) 初始的請(qǐng)求已經(jīng)接受岭埠,客戶應(yīng)當(dāng)繼續(xù)發(fā)送請(qǐng)求的其余部分盏混。(HTTP 1.1新)
? “101″ : Switching Protocols(切換協(xié)議) 請(qǐng)求者已要求服務(wù)器切換協(xié)議,服務(wù)器已確認(rèn)并準(zhǔn)備進(jìn)行切換惜论。(HTTP 1.1新)
? “200″ : OK(成功) 一切正常许赃,對(duì)GET和POST請(qǐng)求的應(yīng)答文檔跟在后面。
? “201″ : Created(已創(chuàng)建)服務(wù)器已經(jīng)創(chuàng)建了文檔来涨,Location頭給出了它的URL。
? “202″ : Accepted(已接受)服務(wù)器已接受了請(qǐng)求启盛,但尚未對(duì)其進(jìn)行處理蹦掐。
? “203″ : Non-Authoritative Information(非授權(quán)信息) 文檔已經(jīng)正常地返回,但一些應(yīng)答頭可能不正確僵闯,可能來自另一來源 卧抗。(HTTP 1.1新)。
? “204″ : No Content(無內(nèi)容)未返回任何內(nèi)容鳖粟,瀏覽器應(yīng)該繼續(xù)顯示原來的文檔社裆。
? “205″ : Reset Content(重置內(nèi)容)沒有新的內(nèi)容,但瀏覽器應(yīng)該重置它所顯示的內(nèi)容向图。用來強(qiáng)制瀏覽器清除表單輸入內(nèi)容(HTTP 1.1新)泳秀。
? “206″ : Partial Content(部分內(nèi)容)服務(wù)器成功處理了部分 GET 請(qǐng)求标沪。(HTTP 1.1新)
? “300″ : Multiple Choices(多種選擇)客戶請(qǐng)求的文檔可以在多個(gè)位置找到,這些位置已經(jīng)在返回的文檔內(nèi)列出嗜傅。如果服務(wù)器要提出優(yōu)先選擇金句,則應(yīng)該在Location應(yīng)答頭指明。
? “301″ : Moved Permanently(永久移動(dòng))請(qǐng)求的網(wǎng)頁已被永久移動(dòng)到新位置吕嘀。服務(wù)器返回此響應(yīng)(作為對(duì) GET 或 HEAD 請(qǐng)求的響應(yīng))時(shí)违寞,會(huì)自動(dòng)將請(qǐng)求者轉(zhuǎn)到新位置。
? “302″ : Found(臨時(shí)移動(dòng))類似于301偶房,但新的URL應(yīng)該被視為臨時(shí)性的替代趁曼,而不是永久性的。注意棕洋,在HTTP1.0中對(duì)應(yīng)的狀態(tài)信息是“Moved Temporatily”挡闰,出現(xiàn)該狀態(tài)代碼時(shí),瀏覽器能夠自動(dòng)訪問新的URL拍冠,因此它是一個(gè)很有用的狀態(tài)代碼尿这。注意這個(gè)狀態(tài)代碼有時(shí)候可以和301替換使用。例如庆杜,如果瀏覽器錯(cuò)誤地請(qǐng)求http://host/~user(缺少了后面的斜杠)射众,有的服務(wù)器返回301,有的則返回302晃财。嚴(yán)格地說叨橱,我們只能假定只有當(dāng)原來的請(qǐng)求是GET時(shí)瀏覽器才會(huì)自動(dòng)重定向。請(qǐng)參見307断盛。
? “303″ : See Other(查看其他位置)類似于301/302罗洗,不同之處在于,如果原來的請(qǐng)求是POST钢猛,Location頭指定的重定向目標(biāo)文檔應(yīng)該通過GET提然锊恕(HTTP 1.1新)。
? “304″ : Not Modified(未修改)自從上次請(qǐng)求后命迈,請(qǐng)求的網(wǎng)頁未被修改過贩绕。原來緩沖的文檔還可以繼續(xù)使用,不會(huì)返回網(wǎng)頁內(nèi)容壶愤。
? “305″ : Use Proxy(使用代理)只能使用代理訪問請(qǐng)求的網(wǎng)頁淑倾。如果服務(wù)器返回此響應(yīng),那么征椒,服務(wù)器還會(huì)指明請(qǐng)求者應(yīng)當(dāng)使用的代理娇哆。(HTTP 1.1新)
? “307″ : Temporary Redirect(臨時(shí)重定向)和 302(Found)相同。許多瀏覽器會(huì)錯(cuò)誤地響應(yīng)302應(yīng)答進(jìn)行重定向,即使原來的請(qǐng)求是POST碍讨,即使它實(shí)際上只能在POST請(qǐng)求的應(yīng)答是303時(shí)才能重定向治力。由于這個(gè)原因,HTTP 1.1新增了307垄开,以便更加清除地區(qū)分幾個(gè)狀態(tài)代碼:當(dāng)出現(xiàn)303應(yīng)答時(shí)琴许,瀏覽器可以跟隨重定向的GET和POST請(qǐng)求;如果是307應(yīng)答溉躲,則瀏覽器只能跟隨對(duì)GET請(qǐng)求的重定向榜田。(HTTP 1.1新)
? “400″ : Bad Request(錯(cuò)誤請(qǐng)求)請(qǐng)求出現(xiàn)語法錯(cuò)誤。
? “401″ : Unauthorized(未授權(quán))客戶試圖未經(jīng)授權(quán)訪問受密碼保護(hù)的頁面锻梳。應(yīng)答中會(huì)包含一個(gè)WWW-Authenticate頭箭券,瀏覽器據(jù)此顯示用戶名字/密碼對(duì)話框,然后在填寫合適的Authorization頭后再次發(fā)出請(qǐng)求疑枯。
? “403″ : Forbidden(已禁止) 資源不可用辩块。服務(wù)器理解客戶的請(qǐng)求,但拒絕處理它荆永。通常由于服務(wù)器上文件或目錄的權(quán)限設(shè)置導(dǎo)致废亭。
? “404″ : Not Found(未找到)無法找到指定位置的資源。
? “405″ : Method Not Allowed(方法禁用)請(qǐng)求方法(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)過代理服務(wù)器的授權(quán)欧瘪。(HTTP 1.1新)
? “408″ : Request Time-out(請(qǐng)求超時(shí))服務(wù)器等候請(qǐng)求時(shí)超時(shí)眷射。(HTTP 1.1新)
? “409″ : Conflict(沖突)通常和PUT請(qǐng)求有關(guān)。由于請(qǐng)求和資源的當(dāng)前狀態(tài)相沖突佛掖,因此請(qǐng)求不能成功妖碉。(HTTP 1.1新)
? “410″ : Gone(已刪除)如果請(qǐng)求的資源已被永久刪除,那么苦囱,服務(wù)器會(huì)返回此響應(yīng)嗅绸。該代碼與 404(未找到)代碼類似脾猛,但在資源以前有但現(xiàn)在已經(jīng)不復(fù)存在的情況下撕彤,有時(shí)會(huì)替代 404 代碼出現(xiàn)。如果資源已被永久刪除,那么羹铅,您應(yīng)當(dāng)使用 301 代碼指定該資源的新位置蚀狰。(HTTP 1.1新)
? “411″ : Length Required(需要有效長(zhǎng)度)不會(huì)接受包含無效內(nèi)容長(zhǎng)度標(biāo)頭字段的請(qǐng)求。(HTTP 1.1新)
? “412″ : Precondition Failed(未滿足前提條件)服務(wù)器未滿足請(qǐng)求者在請(qǐng)求中設(shè)置的其中一個(gè)前提條件职员。(HTTP 1.1新)
? “413″ : Request Entity Too Large(請(qǐng)求實(shí)體過大)請(qǐng)求實(shí)體過大麻蹋,已超出服務(wù)器的處理能力。如果服務(wù)器認(rèn)為自己能夠稍后再處理該請(qǐng)求焊切,則應(yīng)該提供一個(gè)Retry-After頭扮授。(HTTP 1.1新)
? “414″ : Request-URI Too Large(請(qǐng)求的 URI 過長(zhǎng))請(qǐng)求的 URI(通常為網(wǎng)址)過長(zhǎng),服務(wù)器無法進(jìn)行處理专肪。
? “415″ : Unsupported Media Type(不支持的媒體類型)請(qǐng)求的格式不受請(qǐng)求頁面的支持刹勃。
? “416″ : Requested range not satisfiable(請(qǐng)求范圍不符合要求)服務(wù)器不能滿足客戶在請(qǐng)求中指定的Range頭。(HTTP 1.1新)
? “417″ : Expectation Failed(未滿足期望值)服務(wù)器未滿足”期望”請(qǐng)求標(biāo)頭字段的要求嚎尤。
? “500″ : Internal Server Error(服務(wù)器內(nèi)部錯(cuò)誤)服務(wù)器遇到錯(cuò)誤荔仁,無法完成請(qǐng)求。
? “501″ : Not Implemented(尚未實(shí)施) 服務(wù)器不具備完成請(qǐng)求的功能芽死。例如乏梁,當(dāng)服務(wù)器無法識(shí)別請(qǐng)求方法時(shí),服務(wù)器可能會(huì)返回此代碼关贵。
? “502″ : Bad Gateway(錯(cuò)誤網(wǎng)關(guān))服務(wù)器作為網(wǎng)關(guān)或者代理時(shí)遇骑,為了完成請(qǐng)求訪問下一個(gè)服務(wù)器,但該服務(wù)器返回了非法的應(yīng)答坪哄。
? “503″ : Service Unavailable(服務(wù)不可用)服務(wù)器由于維護(hù)或者負(fù)載過重未能應(yīng)答质蕉。通常,這只是一種暫時(shí)的狀態(tài)翩肌。
? “504″ : Gateway Time-out(網(wǎng)關(guān)超時(shí)) 由作為代理或網(wǎng)關(guān)的服務(wù)器使用模暗,表示不能及時(shí)地從遠(yuǎn)程服務(wù)器獲得應(yīng)答。(HTTP 1.1新)
? “505″ : HTTP Version not supported(HTTP 版本不受支持)不支持請(qǐng)求中所使用的 HTTP 協(xié)議版本念祭。
國(guó)內(nèi)的比較牛的人:淘寶網(wǎng)UED官方博客兑宇。靈玉,大成小胖粱坤,承玉隶糕,拔赤
相關(guān)系列:
[前端開發(fā)面試題總結(jié)之——HTML](http://www.reibang.com/p/872f8fb425ce)
[前端開發(fā)面試題總結(jié)之——CSS3](http://www.reibang.com/p/f60b619aa52b)
[前端開發(fā)面試題總結(jié)之——JAVASCRIPT(二)](http://www.reibang.com/p/1a20dac12cf6)
[前端開發(fā)面試題總結(jié)之——JAVASCRIPT(三)](http://www.reibang.com/p/988840419605)
> 以上所有資料來源于網(wǎng)絡(luò),如有不對(duì)的地方站玄,還請(qǐng)及時(shí)告知枚驻,歡迎大家批評(píng)指正!