from:http://blog.csdn.net/q121516340/article/details/51332454
Array.isArray(); es5javascript
toString.call([]);//」[object Array]」php
var arr=[];css
arr.constructor;//Arrayhtml
instanceof Array前端
<div onclick=」」>123</div>java
div1.onclick=function(){};node
符合W3C標準的事件綁定的方式 addEventListener/attachEventjquery
A、非IE瀏覽器:webpack
addEventListenergit
一、 若是說給同一個元素綁定了兩次或者屢次相同類型的事件,因此的綁定將會依次觸發
二、 支持DOM事件流的
三、 進行事件綁定傳參不須要on前綴
addEventListener(「click」,function(){},true);//此時的事件就是在事件捕獲階段執行
第三個參數:表明是否在捕獲階段執行,默認值是false
addEventListener(「click」,function(e){})
addEventListener(「click」,function(){},false) 事件在冒泡階段執行
B、IE瀏覽器
ie9開始,ie11 edge:addEventListener
ie9之前 ie8:attachEvent/detachEvent
一、 進行事件類型傳參須要帶上on前綴
dom1.attachEvent(「onclick」,functioin(){});
二、 這種方式只支持事件冒泡,不支持事件捕獲
ev = ev || window.event 獲取觸發事件的對象
var target = ev.srcElement||ev.target 獲取事件的源對象
document.documentElement.clientWidth || document.body.clientWidth
call和apply相同點:
都是爲了用一個本不屬於一個對象的方法,讓這個對象去執行
toString.call([],1,2,3)
toString.apply([],[1,2,3])
Object.call(this,obj1,obj2,obj3)
Object.apply(this,arguments)
區別:
call第二個參數開始接受一個參數列表
apply第二個參數開始接受一個參數數組
原型鏈繼承,借用構造函數繼承,原型+構造函數組合繼承,寄生式繼承
第一種:對象字面量、Object構造函數
第二種:構造函數
第三種:純構造函數
第四種:空構造函數+原型
第五種:混合構造函數+原型
第六種:動態原型
第七種:寄生構造函數
第八種:Object.create()——ES5 ie9+
如下是寄生構造函數模式:
——實際上是工廠模式的變種,只不過是放在其餘構造函數中建立對象
代碼以下:
function SpecialArray(){ var values = []; values.push.apply(values, arguments); values.toPipedString = function(){ return this.join("|"); }; return values; } var colors = new SpecialArray("red", "blue", "green"); alert(colors.toPipedString()); //"red|blue|green"
this:指向調用上下文
閉包:內層做用域能夠訪問外層做用域的變量
做用域:定義一個函數就開闢了一個局部做用域,整個js執行環境有一個全局做用域
同一來源指的是域名,協議和端口號的組合
協議:http,ftp https
端口名:80:
http協議的默認端口:80
https:協議的默認端口是8083
同源策略帶來的麻煩:ajax在不一樣域名下的請求沒法實現,
若是說想要請求其餘來源的js文件,或者json數據,那麼能夠經過jsonp來解決
JSONP的實現原理:經過動態建立script標籤
[1,3,1,5,2,3,7]=>[1,3,5,2,7]
方法:
一、 先建立一個空數組,用來保存最終的結果
二、 循環原數組中的每一個元素
三、 再對新數組對每一個元素進行位置查找,判斷是否存在,若是沒有,將把這個元素放到新數組中
四、 返回這個新數組
function(){ var newArr=[]; for(var i=0;i<arr.length;i++){ if(newArr.indexOf(arr[i])==-1){ newArr.push(arr[i]) } } return newArr }
運行環境:瀏覽器中的JS引擎(v8.。。 ff:splidemonkey)
運行在Node.js:v8引擎上
語言特性:面向對象(建立對象的多種方式,繼承的多種方式、原型鏈),動態語言
方法1、判斷其是否具備「數組性質」,如slice()方法。可本身給該變量定義slice方法,故有時會失效
方法2、obj instanceof Array 在某些IE版本中不正確
方法3、toString.call([]);//」[object Array]」
方法4、方法一二皆有漏洞,在ECMA Script5中定義了新方法Array.isArray(), 保證其兼容性,最好的方法以下:
if(typeof Array.isArray==="undefined"){
Array.isArray = function(arg){
return Object.prototype.toString.call(arg)==="[object Array]"
};
}
var domList = document.getElementsByTagName(‘input’) var checkBoxList = [];//返回的全部的checkbox var len = domList.length; //緩存到局部變量 while (len--) { if (domList[len].type == ‘checkbox’) { checkBoxList.push(domList[len]); } }
「事件冒泡」:事件開始由最具體的元素接受,而後逐級向上傳播
「事件捕捉」:事件由最不具體的節點先接收,而後逐級向下,一直到最具體的
「DOM事件流」:三個階段:事件捕捉,目標階段,事件冒泡
var a; alert(typeof a); // 「undefined」 //alert(b); // 報錯 b=10; alert(typeof b);//」number」
undefined會在如下三種狀況下產生:
a、一個變量定義了卻沒有被賦值
b、想要獲取一個對象上不存在的屬性或者方法:
c、一個數組中沒有被賦值的元素
var a = new Object(); a.value = 1; b = a; b.value = 2; alert(a.value);//2
答案:2(考察引用數據類型細節)
1) 實現對該數組的倒排,反轉,輸出[5,1,4,2,6,3]
reverse()
2) 實現對該數組的降序排列,輸出[6,5,4,3,2,1]
冒泡排序
var d = new Date(); // 獲取年,getFullYear()返回4位的數字 //今年:2016 var year = d.getFullYear(); // 獲取月,月份比較特殊,0是1月,11是12月 var month = d.getMonth() + 1; // 變成兩位 month = month < 10 ? '0' + month : month; // 獲取日 var day = d.getDate(); day = day < 10 ? '0' + day : day; alert(year + '-' + month + '-' + day);
答案:」<tr><td>{$id}</td><td>{$id}_{$name}</td></tr>」.replace(/{\$id}/g, ’10′).replace(/{\$name}/g, ‘Tony’);
這種寫法稱之爲短路表達式
答案:if(!foo) foo = bar; //若是foo存在,值不變,不然把bar的值賦給foo。
短路表達式:做爲」&&」和」||」操做符的操做數表達式,這些表達式在進行求值時,只要最終的結果已經能夠肯定是真或假,求值過程便了結止,這稱之爲短路求值。
注意if條件的真假斷定,記住如下是false的狀況:
空字符串、false、undefined、null、0
var foo = 1; function(){ var foo; console.log(foo); //undefined foo = 2; console.log(foo); // 2; }
函數聲明與變量聲明會被JavaScript引擎隱式地提高到當前做用域的頂部,可是隻提高名稱不會提高賦值部分。
for(var i=1;i<=3;i++){ setTimeout(function(){ console.log(i); },0); };
答案:4 4 4。
緣由:setTimeout會在js引擎空閒的時候再執行
JavaScript事件處理器在線程空閒以前不會運行。追問,
for(var i=1;i<=3;i++){ setTimeout((function(a){ //改爲當即執行函數 console.log(a); })(i),0); };
使用自帶接口trim(),考慮兼容性:
if (!String.prototype.trim) { String.prototype.trim = function() { return this.replace(/^\s+/, "").replace(/\s+$/,""); //\s匹配空白字符:回車、換行、製表符tab 空格 } } // test the function var str = " \t\n test string ".trim(); alert(str == "test string"); // alerts "true"
arguments.callee:得到當前函數的引用
caller是返回一個對函數的引用,該函數調用了當前函數;若是不是由其餘函數調用的,那麼返回值就是null
callee是返回正在被執行的function函數,也就是所指定的function對象的正文。
那麼問題來了?
若是一對兔子每個月生一對兔子;一對新生兔,從第二個月起就開始生兔子;假定每對兔子都是一雌一雄,試問一對兔子,第n個月能繁殖成多少對兔子?(使用callee完成)
A、var obj=NaN;
B、var 0bj = [];(這裏是一個數字0)
C、var obj = //;
D、var obj = {};
A、var a=undefind; b=NaN //拼寫 undefined
B、var a=‘123’; b=NaN //字符串
C、var a =undefined , b =NaN
D、var a=NaN , b='undefined' //」NaNundefined」
A、34 B、35 C、36 D、37
//21+4+10
for(i=0, j=0; i<10, j<6; i++, j++){ //終止條件:j=5 i=5 k = i + j;//k=10 } //結果:10
var arr = new Array(1 ,3 ,5); arr[4]='z';//[1,3,5,undefined,’z’] arr2 = arr.reverse(); //arr2=[’z’,undefined,5,3,1]; //arr=[’z’,undefined,5,3,1] arr3 = arr.concat(arr2); alert(arr3);
彈出提示對話框:z,,5,3,1,z,,5,3,1
confirm
window.close()
對象:window document location screen history navigator
方法:alert() confirm() prompt() open() close()
Document.getElementById 根據元素id查找元素
Document.getElementByName 根據元素name查找元素
Document.getElementTagName 根據指定的元素名查找元素
第一種(函數聲明):
function sum1(num1,num2){
return num1+num2;
}
第二種(函數表達式):
var sum2 = function(num1,num2){
return num1+num2;
}
匿名函數:
function(){}:只能本身執行本身
第三種(函數對象方式):瞭解
var sum3 = new Function("num1","num2","return num1+num2");
document.write 只能重繪整個頁面
innerHTML 能夠重繪頁面的一部分
內存泄漏指任何對象在您再也不擁有或須要它以後仍然存在。
垃圾回收器按期掃描對象,並計算引用了每一個對象的其餘對象的數量。
若是一個對象的引用數量爲 0(沒有其餘對象引用過該對象),或對該對象的唯一引用是循環的,那麼該對象的內存便可回收。
答:var str = 'asdfssaaasasasasaa';
var json = {};
for (var i = 0; i < str.length; i++) {
if(!json[str.charAt(i)]){ //str.charAt(i) =」a」
json[str.charAt(i)] = 1; //json[「a」]=1
}else{
json[str.charAt(i)]++; //讓a鍵的值+1,也就是這個字符多出現了一次
}
};
var iMax = 0;
var iIndex = '';
for(var i in json){
if(json[i]>iMax){
iMax = json[i];
iIndex = i;
}
}
alert('出現次數最多的是:'+iIndex+'出現'+iMax+'次');
function getStyle(obj,attr,value){
if(!value){
if(obj.currentStyle)//ie{
return obj.currentStyle(attr);
}else{//標準瀏覽器
obj.getComputedStyle(attr,false);
}
}else{
obj.style[attr] = value;
}
}
動態建立script標籤,給請求的地址中添加一個get參數,這個參數表明回調函數,也就是但願服務器處理完個人請求以後,在前端執行這個對調函數
本地對象爲array obj regexp等能夠new實例化
Array RegExp String Boolean 。。。
內置對象爲global、Math 等不能夠實例化的
關於global對象咱們沒法在瀏覽器中發現她的存在,由於他的屬性和方法都被綁定在了window對象中
每個宿主對象他的實現都是取決於不一樣的瀏覽器的,這樣就產生了瀏覽器兼容性問題
宿主爲瀏覽器自帶的document,window 等
//大牛作法; //思路:先將字符串轉換爲數組 split(),利用數組的反序函數 reverse()顛倒數組,再利用 jion() 轉換爲字符串 var str = '12345678'; str = str.split('').reverse().join('');
答:查詢(參數)部分。除了給動態語言賦值之外,咱們一樣能夠給靜態頁面,並使用javascript來得到相信應的參數值
返回值:?ver=1.0&id=timlq 也就是問號後面的!
//url:http://www.sina.co//url:http://www.sina.com/getage?number=1&year=2016//url:http://www.sina.com/getage?number=1&year=2016//url:http://www.sina.com/getage?number=1&year=2016m/getage?number=1&year=2016
答:錨點 , 返回值:#love ;
//url:http://www.sina.com/getage?#age
這時就返回」#age」
答:刷新當前頁面。
function f1(){ var tmp = 1; this.x = 3;
console.log(tmp); console.log(this.x); } var obj = new f1(); console.log(obj.x) //3 console.log(f1()); //1 undefined
var o1 = new Object(); var o2 = o1; o2.name = "CSSer"; console.log(o1.name); //」CSSer」
var a = 6; setTimeout(function () { var a = 666;//因爲變量a是一個局部變量 alert(a); // 輸出666, }, 0); a = 66; console.log(a); //先打印全局變量a的值:66 再執行setTimeout裏面的局部變量
由於var a = 666;定義了局部變量a,而且賦值爲666,根據變量做用域鏈,
全局變量處在做用域末端,優先訪問了局部變量,從而覆蓋了全局變量 。
window.color = 'red'; var o = {color: 'blue'}; function sayColor(){ alert(this.color); } 考點:1、this的指向 2、call的用法 sayColor(); //red sayColor.call(this); //red this指向的是window對象 sayColor.call(window); //red sayColor.call(o); //blue
function foo(){ foo.a = function(){alert(1)}; this.a = function(){alert(2)}; //obj.a a = function(){alert(3)}; var a = function(){alert(4)}; }; foo.prototype.a = function(){alert(5)}; foo.a = function(){alert(6)}; foo.a(); //6 var obj = new foo(); obj.a(); //2 foo.a(); //1
var a = 5; function test(){ var a; a = 0; alert(a); alert(this.a); //沒有定義 a這個屬性 alert(a) } test(); // 0, 5, 0 var obj=new test(); // 0, undefined, 0 //因爲類它自身沒有屬性a, 因此是undefined
var bool = !!2; alert(bool);//true;
技巧:雙向非操做能夠把字符串和數字轉換爲布爾值。
var reg = /^[a-zA-Z_][a-zA-Z0-9_]{4,19}/
一、window對象 ,是JS的最頂層對象,其餘的BOM對象都是window對象的屬性;
二、document對象,文檔對象;
三、location對象,瀏覽器當前URL信息;
四、navigator對象,瀏覽器自己信息;
五、screen對象,客戶端屏幕信息;
六、history對象,瀏覽器訪問歷史信息;
——>call方法!
//頂一個父母類,注意:類名都是首字母大寫的哦! function Parent(name, money){ this.name = name; this.money = money; this.info = function(){ alert('姓名: '+this.name+' 錢: '+ this.money); } } //定義孩子類 function Children(name){ Parent.call(this, name); //繼承 姓名屬性,不要錢。 this.info = function(){ alert('姓名: '+this.name); } } //實例化類 var per = new Parent('parent', 800000000000); var chi = new Children('child'); per.info(); chi.info();
bind: 綁定事件,對新添加的事件不起做用,方法用於將一個處理程序附加到每一個匹配元素的事件上並返回jQuery對象。
live: 方法將一個事件處理程序附加到與當前選擇器匹配的全部元素(包含現有的或未來添加的)的指定事件上並返回jQuery對象。
delegate: 方法基於一組特定的根元素將處理程序附加到匹配選擇器的全部元素(現有的或未來的)的一個或多個事件上。
最佳實現:jquery 1.7以後:就推薦使用on() off()
區別1:link是XHTML標籤,除了加載CSS外,還能夠定義RSS等其餘事務;@import屬於CSS範疇,只能加載CSS。
區別2:link引用CSS時,在頁面載入時同時加載;@import須要頁面網頁徹底載入之後加載。
區別3:link是XHTML標籤,無兼容問題;@import是在CSS2.1提出的,低版本的瀏覽器不支持。
區別4:link支持使用Javascript控制DOM去改變樣式;而@import不支持。
var foo = "11"+2-"1"; console.log(foo); console.log(typeof foo); //「number」 執行完後foo的值爲111,foo的類型爲Number。
代碼重用:聲明函數把整個過程封裝起來;把他們弄成一些對象
避免全局變量(命名空間,封閉空間,模塊化mvc..) AngularJS
拆分函數避免函數過於臃腫:單一職責原則:條理更加清晰,更好的維護
適當的註釋,尤爲是一些複雜的業務邏輯或者是計算邏輯,都應該寫出這個業務邏輯的具體過程
內存管理,尤爲是閉包中的變量釋放
變量的命名規範:尤爲是在實際項目中
$div:表明一個jquery對象
dom:表明一個原生的dom對象
但願一個函數是構造函數:函數的首字母都要大寫
變量必定要語義化:
//search部分的參數格式:a=1&b=2&c=3 function getJsonFromUrlSearch(search){ var item; var result={}; if(search.indexOf('&')<0){ item=search.split('='); result[item[0]]=item[1]; return result; } var splitArray=search.split('&'); for (var i = 0; i < splitArray.length; i++) { var obj = splitArray[i]; item=obj.split('='); result[item[0]]=item[1]; } return result; } var c=getJsonFromUrlSearch("a=1&b=2&c=3");
ajax
先建立一個HttpRequest()
再設置他的請求頭:請求的數據類型:json/xml
再設置他的onreadstatechange
最後再提交這個請求
//參見雅虎14web優化規則
//0、減小http請求:
//一、小圖弄成大圖(雪碧圖、精靈圖),
//二、合理的設置緩存 localStorage cookie
//三、資源合併、壓縮 html代碼的最小化,壓縮體積:就是減小帶寬
//四、一些小的js文件合併成大的js文件
//五、將外部的js文件置底
readonly只針對input(text / password)和textarea有效,
而disabled對於全部的表單元素都有效,當表單元素在使用了disabled後,當咱們將表單以POST或GET的方式提交的話,這個元素的值不會被傳遞出去,而readonly會將該值傳遞出去
思路:先解釋異步,再解釋ajax如何使用
異步是爲了進行局部刷新,提高用戶體驗
2005 年誕生ajax
Ajax的原理簡單來講經過XmlHttpRequest對象來向服務器發異步請求,從服務器得到數據,而後用javascript來操做DOM而更新頁面。這其中最關鍵的一步就是從服務器得到請求數據。要清楚這個過程和原理,咱們必須對 XMLHttpRequest有所瞭解。
XMLHttpRequest是ajax的核心機制,它是在IE5中首先引入的,是一種支持異步請求的技術。簡單的說,也就是javascript能夠及時向服務器提出請求和處理響應,而不阻塞用戶。達到無刷新的效果。
由於擴展內置對象會影響整個程序中所使用到的該內置對象的原型屬性
//若是說是整個項目中都適用的功能,那麼能夠進行擴展
? :
由於運算符會涉及3個表達式
var a=3>2?5:2;
function module(a,b){
return a%b;//return a/b;
}
get傳送的數據長度有限制,post沒有
get經過url傳遞,在瀏覽器地址欄可見,post是在報文中傳遞
適用場景:
post通常用於表單提交
get通常用於簡單的數據查詢,嚴格要求不是那麼高的場景
200:請求已成功,請求所但願的響應頭或數據體將隨此響應返回。
302:請求的資源臨時從不一樣的 URI響應請求。因爲這樣的重定向是臨時的,客戶端應當繼續向原有地址發送之後的請求。只有在Cache-Control或Expires中進行了指定的狀況下,這個響應纔是可緩存的
304:若是客戶端發送了一個帶條件的 GET 請求且該請求已被容許,而文檔的內容(自上次訪問以來或者根據請求的條件)並無改變,則服務器應當返回這個狀態碼。304響應禁止包含消息體,所以始終以消息頭後的第一個空行結尾。
403:服務器已經理解請求,可是拒絕執行它。
404:請求失敗,請求所但願獲得的資源未被在服務器上發現。
500:服務器遇到了一個不曾預料的情況,致使了它沒法完成對請求的處理。通常來講,這個問題都會在服務器端的源代碼出現錯誤時出現。
Last-Modified |
文 檔的最後改動時間。客戶能夠經過If-Modified-Since請求頭提供一個日期,該請求將被視爲一個條件GET,只有改動時間遲於指定時間的文檔 纔會返回,不然返回一個304(Not Modified)狀態。Last-Modified也可用setDateHeader方法來設置。 |
Expires |
應該在何時認爲文檔已通過期,從而再也不緩存它? |
方法 |
描述 |
鏈接兩個或更多的數組,並返回結果。 |
|
把數組的全部元素放入一個字符串。元素經過指定的分隔符進行分隔。 |
|
刪除並返回數組的最後一個元素 |
|
向數組的末尾添加一個或更多元素,並返回新的長度。 |
|
顛倒數組中元素的順序。 |
|
刪除並返回數組的第一個元素 |
|
從某個已有的數組返回選定的元素 |
|
對數組的元素進行排序 |
|
刪除元素,並向數組添加新元素。 |
|
返回該對象的源代碼。 |
|
把數組轉換爲字符串,並返回結果。 |
|
把數組轉換爲本地數組,並返回結果。 |
|
向數組的開頭添加一個或更多元素,並返回新的長度。 |
|
返回數組對象的原始值 |
jquery:簡化了js的一些操做,而且提供了一些很是好用的API
jquery ui、jquery-easyui:在jqeury的基礎上提供了一些經常使用的組件 日期,下拉框,表格這些組件
require.js、sea.js(阿里的玉帛)+》模塊化開發使用的
jquery mobile:是jquery本身出的支持移動端網頁開發,不過很是笨重,可是功能很是強大
zepto:精簡版的jquery,經常使用於手機web前端開發 提供了一些手機頁面實用功能,touch
ext.js:跟jquery差很少,可是不開源,也沒有jquery輕量
angular、knockoutjs、avalon(去哪兒前端總監,做者:司徒正美):MV*框架,適合用於單頁應用開發(SPA)
Object.keys——IE9+ ES5
或者使用for…in並過濾出繼承的屬性
for(o in obj){
if(obj.hasOwnproperty(o)){//判斷o不是繼承來的屬性
//把o這個屬性放入到一個數組中
}
}
for(var i=0;i<5;++i){
setTimeout(function(){
console.log(i+’’);
},100*i);
}
[role=nav]>ul a:not([href^-mailto]){}
A:Http狀態碼302表示暫時性轉移 對
B:domContentLoaded事件早於onload事件 //正確
當 onload 事件觸發時,頁面上全部的DOM,樣式表,腳本,圖片,flash都已經加載完成了。
當 DOMContentLoaded 事件觸發時,僅當DOM加載完成,不包括樣式表,圖片,flash。
C: IE678不支持事件捕獲
D:localStorage 存儲的數據在電腦重啓後丟失 //錯誤,由於沒有時間限制
A: link屬於XHTML標籤,而@import是CSS提供的;
B:頁面被加載時,link會同時被加載,然後者引用的CSS會等到頁面被加載完再加載
C:import只在IE5以上才能識別 而link是XHTML標籤,無兼容問題
D: link方式的樣式的權重高於@import的權重
import誕生於CSS2.1規範,任何支持CSS2.1以上版本的瀏覽器都支持Import
link方式的樣式跟import沒有權重高低這麼個說法,只有書寫順序的不一樣纔會決定樣式
alert
confirm
prompt
$.ajax({
url:"1.html",
data:{name:"張三",age:18},//post數據
dataType:"json",
type:"POST",
success:function(data){
//data:返回的數據
},
error:function(){
//異常處理
}
});
type
類型:String
默認值: "GET")。請求方式 ("POST" 或 "GET"), 默認爲 "GET"。注意:其它 HTTP 請求方法,如 PUT 和 DELETE 也可使用,但僅部分瀏覽器支持。
url
類型:String
默認值: 當前頁地址。發送請求的地址。
success
類型:Function
請求成功後的回調函數。
參數:由服務器返回,並根據 dataType 參數進行處理後的數據;描述狀態的字符串。
這是一個 Ajax 事件。
options
類型:Object
可選。AJAX 請求設置。全部選項都是可選的。
async
類型:Boolean
默認值: true。默認設置下,全部請求均爲異步請求。若是須要發送同步請求,請將此選項設置爲 false。
注意,同步請求將鎖住瀏覽器,用戶其它操做必須等待請求完成才能夠執行。
beforeSend(XHR)
類型:Function
發送請求前可修改 XMLHttpRequest 對象的函數,如添加自定義 HTTP 頭。
XMLHttpRequest 對象是惟一的參數。
這是一個 Ajax 事件。若是返回 false 能夠取消本次 ajax 請求。
cache
類型:Boolean
默認值: true,dataType 爲 script 和 jsonp 時默認爲 false。設置爲 false 將不緩存此頁面。
jQuery 1.2 新功能。
contentType
類型:String
默認值: "application/x-www-form-urlencoded"。發送信息至服務器時內容編碼類型。
默認值適合大多數狀況。若是你明確地傳遞了一個 content-type 給 $.ajax() 那麼它一定會發送給服務器(即便沒有數據要發送)。
data
類型:String
發送到服務器的數據。將自動轉換爲請求字符串格式。GET 請求中將附加在 URL 後。查看 processData 選項說明以禁止此自動轉換。必須爲Key/Value 格式。若是爲數組,jQuery 將自動爲不一樣值對應同一個名稱。如 {foo:["bar1", "bar2"]} 轉換爲 '&foo=bar1&foo=bar2'。
dataFilter
類型:Function
給 Ajax 返回的原始數據的進行預處理的函數。提供 data 和 type 兩個參數:data 是 Ajax 返回的原始數據,type 是調用 jQuery.ajax 時提供的dataType 參數。函數返回的值將由 jQuery 進一步處理。
dataType
類型:String
預期服務器返回的數據類型。若是不指定,jQuery 將自動根據 HTTP 包 MIME 信息來智能判斷,好比 XML MIME 類型就被識別爲 XML。在 1.4中,JSON 就會生成一個 JavaScript 對象,而 script 則會執行這個腳本。隨後服務器端返回的數據會根據這個值解析後,傳遞給回調函數。可用值:
· "xml": 返回 XML 文檔,可用 jQuery 處理。
· "html": 返回純文本 HTML 信息;包含的 script 標籤會在插入 dom 時執行。
· "script": 返回純文本 JavaScript 代碼。不會自動緩存結果。除非設置了 "cache" 參數。注意:在遠程請求時(不在同一個域下),全部 POST 請求都將轉爲 GET 請求。(由於將使用 DOM 的 script標籤來加載)
· "json": 返回 JSON 數據 。
· "jsonp": JSONP 格式。使用 JSONP 形式調用函數時,如 "myurl?callback=?" jQuery 將自動替換 ? 爲正確的函數名,以執行回調函數。
· "text": 返回純文本字符串
error
類型:Function
默認值: 自動判斷 (xml 或 html)。請求失敗時調用此函數。
有如下三個參數:XMLHttpRequest 對象、錯誤信息、(可選)捕獲的異常對象。
若是發生了錯誤,錯誤信息(第二個參數)除了獲得 null 以外,還多是 "timeout", "error", "notmodified" 和 "parsererror"。
這是一個 Ajax 事件。
<ul id="test">
<li>這是第一條</li>
<li>這是第二條</li>
<li>這是第三條</li>
</ul>
//非閉包實現
var lis=document.querySelectorAll('li');
document.querySelector('#test').onclick=function(e){
for (var i = 0; i < lis.length; i++) {
var li = lis[i];
if(li==e.target){
alert(i);
}
}
};
//閉包實現
var lis=document.querySelectorAll('li');
for (var i = 0; i < lis.length; i++) {
var li = lis[i];
li.onclick=(function(index){
return function(e){
alert(index);
};
})(i);
}
caller是返回一個對函數的引用,該函數調用了當前函數;
用法:fn.caller
callee是返回正在被執行的function函數,也就是所指定的function對象的正文。
用法:arguments.callee
僞數組(類數組):沒法直接調用數組方法或指望length屬性有什麼特殊的行爲,但仍能夠對真正數組遍歷方法來遍歷它們。典型的是函數的argument參數,還有像調用getElementsByTagName,document.childNodes之類的,它們都返回NodeList對象都屬於僞數組。
可使用Array.prototype.slice.call(fakeArray)將數組轉化爲真正的Array對象。
經常使用正則表達式語法要熟悉
/0[0-9]{2,3}-\d{7,8}/ 010 021 020 025 028 0755:深圳
var User = { 對象
count = 1,屬性
getCount:function(){ 方法
return this.count;
}
}
console.log(User.getCount());
var func = User.getCount;
console.log(func());
答案:1 undefined
(function test(){
var a=b=5; //b是一個隱式的全局變量
alert(typeof a);
alert(typeof b);
})();
alert(typeof a);
alert(typeof b);
//number number undefined number
var iNum = 0;
for(var i = 1; i< 10; i++){
if(i % 5 == 0){
continue;
}
iNum++;
}
分析:
i=1 1
i=2 2
i=3 3
i=4 4
i=5
i=6 5
i=7 6
i=8 7
i=9 8
1)
var a;
var b = a * 0;
if (b == b) {
console.log(b * 2 + "2" - 0 + 4);
} else {//b=NaN
console.log(!b * 2 + "2" - 0 + 4); //1*2+」2」-0+4
}
答案:26
考點:乘號運算符的運算規則:
一、 若是其中一個數是NaN,則結果就是NaN
二、若是乘積超過了ECMAScript設定的範圍,那麼就會返回Infinity、-Infinity
三、若是參與乘法運算的某個操做數不是數值,js引擎會先調用Number()將這個數變成一個數值類型,
好比:空字符串就會變成0 布爾值true就會變成1,空數組[]也會變成0,undefined轉換結果則是變成了NaN
<script>
var a = 1;
</script>
<script>
var a;
var b = a * 0;
if (b == b) { //b=0
console.log(b * 2 + "2" - 0 + 4); //0*2+」2」-0+4
} else {
console.log(!b * 2 + "2" - 0 + 4);
}
</script>
答案:6
var t = 10;
function test(t){
var t = t++;//此時的t是一個局部變量,全局變量沒有任何變化
console.log(t);//此時的結果又是多少?
}
test(t);
console.log(t);
答案:10
var t = 10;
function test(test){
var t = test++;
}test(t);
console.log(t);
答案:10
var t = 10;
function test(test){
t = test++;//這一步全局變量t的值等於改變前的test的值
}test(t);
console.log(t);
答案:10
var t = 10;
function test(test){
t = t + test;//undefined+10=NaN
console.log(t);
var t = 3;
}test(t);
console.log(t);
答案:NaN 10
var a;
var b = a / 0;
if (b == b) {//b=NaN
console.log(!b * 2 + "2" - 0 + 4);
} else {
console.log(!b * 2 + "2" - 0 + 4);
}
答案:26
<script>
var a = 1;
</script>
<script>
var a;
var b = a / 0;
if (b == b) { //b=Infinity
console.log(b * 2 + "2" + 4);
} else {
console.log(!b * 2 + "2" + 4);
}
</script>
答案:Infinity24
<button id='btn'>點擊我</button>
var btn = document.getElementById('btn');
var handler = {
id: '_eventHandler',
exec: function(){
alert(this.id);
}
}
btn.addEventListener('click', handler.exec);
答案:btn,由於handler.exec是由btn這個按鈕執行的
var obj = {proto: {a:1,b:2}};
function F(){};
F.prototype = obj.proto;
var f = new F();
obj.proto.c = 3;
obj.proto = {a:-1, b:-2};
alert(f.a);//1
alert(f.c);//3
delete F.prototype['a'];
alert(f.a);//undefined
alert(obj.proto.a);//-1
<ul id='list'>
<li>item</li>
<li>item</li>
<li>item</li>
<li>item</li>
<li>item</li>
</ul>
var items = document.querySelectorAll('#list>li');
for(var i = 0;i < items.length; i++){
setTimeout(function(){
items[i].style.backgroundColor = '#fee';
}, 5);
}
答案:異常
window.error=function(){};
try{}catch(){}finally{}
if (!String.prototype.trim) {
String.prototype.trim = function() {
return this.replace(/^\s+/, "").replace(/\s+$/,"");
} }
function setName(){
name="張三";
}
setName();
console.log(name);
答案:"張三"
//考點:一、變量聲明提高 二、變量搜索機制
var a=1;
function test(){
console.log(a);
var a=1;
}
test();
答案:undefined
var b=2;
function test2(){
window.b=3;
console.log(b);
}
test2();
答案:3
c=5;//聲明一個全局變量c
function test3(){
window.c=3;
console.log(c); //答案:undefined,緣由:因爲此時的c是一個局部變量c,而且沒有被賦值
var c;
console.log(window.c);//答案:3,緣由:這裏的c就是一個全局變量c
}
test3();
var arr = [];
arr[0] = 'a';
arr[1] = 'b';
arr[10] = 'c';
alert(arr.length); //答案:11
console.log(arr[5]); //答案:undefined
var a=1;
console.log(a++); //答案:1
console.log(++a); //答案:3
console.log(null==undefined); //答案:true
console.log("1"==1); //答案:true,由於會將數字1先轉換爲字符串1
console.log("1"===1); //答案:false,由於數據類型不一致
parseInt(3.14); //3
parseFloat("3asdf"); //3
parseInt("1.23abc456");
parseInt(true);// "true"=> NaN
//對一個非數字或者一個非字符串類型進行數據轉換的時候,會先把這個數據轉換爲一個字符串類型,而後再轉換爲數值類型
考點:考察非數字轉換爲整數的熟練度
//考點:函數聲明提早
function bar() {
return foo;
foo = 10;
function foo() {}
//var foo = 11;
}
alert(typeof bar());//"function"
考點:函數聲明提早
var foo = 1;
function bar() {
foo = 10;
return;
function foo() {}
}
bar();
alert(foo);//答案:1
console.log(a);//是一個函數
var a = 3;
function a(){}
console.log(a);////3
//考點:對arguments的操做
function foo(a) {
arguments[0] = 2;
alert(a);//答案:2,由於:a、arguments是對實參的訪問,b、經過arguments[i]能夠修改指定實參的值
}
foo(1);
function foo(a) {
alert(arguments.length);//答案:3,由於arguments是對實參的訪問
}
foo(1, 2, 3);
bar();//報錯 由於bar這個名稱只能在函數內部被訪問
var foo = function bar(name) {
console.log("hello"+name);
console.log(bar);
};
//alert(typeof bar);
foo("world");//"hello"
console.log(bar);//undefined
console.log(foo.toString());
bar();//報錯
function test(){
console.log("test函數");
}
setTimeout(function(){
console.log("定時器回調函數");
}, 0)
test();
function foo(){
var name="hello";
}
先stop(true,true)後slideUp()
示例代碼參考:J:\代碼,PPT,筆記,電子書\面試題\面試題_jquery_slideup.html
關於stop()參考:J:\代碼,PPT,筆記,電子書\面試題\面試題_jquery.png
Ajax並不算是一種新的技術,全稱是asynchronous javascript and xml,能夠說是已有技術的組合,主要用來實現客戶端與服務器端的異步通訊效果,實現頁面的局部刷新,早期的瀏覽器並不能原生支持ajax,可使用隱藏幀(iframe)方式變相實現異步效果,後來的瀏覽器提供了對ajax的原生支持
使用ajax原生方式發送請求主要經過XMLHttpRequest(標準瀏覽器)、ActiveXObject(IE瀏覽器)對象實現異步通訊效果
基本步驟:
var xhr =null;//建立對象
if(window.XMLHttpRequest){
xhr = new XMLHttpRequest();
}else{
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
xhr.open(「方式」,」地址」,」標誌位」);//初始化請求
xhr.setRequestHeader(「」,」」);//設置http頭信息
xhr.onreadystatechange =function(){}//指定回調函數
xhr.send();//發送請求
同步:阻塞的
-張三叫李四去吃飯,李四一直忙得不停,張三一直等着,直到李四忙完兩我的一塊去吃飯
=瀏覽器向服務器請求數據,服務器比較忙,瀏覽器一直等着(頁面白屏),直到服務器返回數據,瀏覽器才能顯示頁面
異步:非阻塞的
-張三叫李四去吃飯,李四在忙,張三說了一聲而後本身就去吃飯了,李四忙完後本身去吃
=瀏覽器向服務器請求數據,服務器比較忙,瀏覽器能夠自如的幹原來的事情(顯示頁面),服務器返回數據的時候通知瀏覽器一聲,瀏覽器把返回的數據再渲染到頁面,局部更新
GET:通常用於信息獲取,使用URL傳遞參數,對所發送信息的數量也有限制,通常在2000個字符,有的瀏覽器是8000個字符
POST:通常用於修改服務器上的資源,對所發送的信息沒有限制
在如下狀況中,請使用 POST 請求:
1. 沒法使用緩存文件(更新服務器上的文件或數據庫)
2. 向服務器發送大量數據(POST 沒有數據量限制)
3. 發送包含未知字符的用戶輸入時,POST 比 GET 更穩定也更可靠
一、ajax不支持瀏覽器back按鈕。
二、安全問題 AJAX暴露了與服務器交互的細節。
三、對搜索引擎的支持比較弱。//不會執行你的js腳本,只會操做你的網頁源代碼
四、破壞了程序的異常機制。
五、沒法跨域請求,解決方式:jsonp
200 OK //客戶端請求成功
400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解
403 Forbidden //服務器收到請求,可是拒絕提供服務
404 Not Found //請求資源不存在,輸入了錯誤的URL
500 Internal Server Error //服務器發生不可預期的錯誤
503 Server Unavailable //服務器當前不能處理客戶端的請求,一段時間後可能恢復正常
連接:http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html
全局變量顯式聲明
靜態綁定
禁止使用with語句
eval中定義的變量都是局部變量
禁止this關鍵字指向全局對象
禁止在函數內部遍歷調用棧 arguments.callee
嚴格模式下沒法刪除變量。只有configurable設置爲true的對象屬性,才能被刪除
正常模式下,對一個對象的只讀屬性進行賦值,不會報錯,只會默默地失敗。嚴格模式下,將報錯。
嚴格模式下,對一個使用getter方法讀取的屬性進行賦值,會報錯。
嚴格模式下,對禁止擴展的對象添加新屬性,會報錯。
嚴格模式下,刪除一個不可刪除的屬性,會報錯。
正常模式下,若是對象有多個重名屬性,最後賦值的那個屬性會覆蓋前面的值。嚴格模式下,這屬於語法錯誤。
正常模式下,若是函數有多個重名的參數,能夠用arguments[i]讀取。嚴格模式下,這屬於語法錯誤。
正常模式下,整數的第一位若是是0,表示這是八進制數,好比0100等於十進制的64。嚴格模式禁止這種表示法,整數第一位爲0,將報錯。
不容許對arguments賦值
arguments再也不追蹤參數的變化
禁止使用arguments.callee
嚴格模式只容許在全局做用域或函數做用域的頂層聲明函數。也就是說,不容許在非函數的代碼塊內聲明函數
if else while for 沒法聲明函數
嚴格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield。
一、建立一個空對象,而且 this 變量引用該對象,同時還繼承了該函數的原型。
二、屬性和方法被加入到 this 引用的對象中。
三、新建立的對象由 this 所引用,而且最後隱式的返回 this 。
理解模塊化開發模式:瀏覽器端requirejs,seajs;服務器端nodejs;ES6模塊化;fis、webpack等前端總體模塊化解決方案;grunt、gulp等前端工做流的使用
理解這兩種規範的差別,主要經過requirejs與seajs的對比,理解模塊的定義與引用方式
的差別以及這兩種規範的設計原則
參考連接1:https://www.zhihu.com/question/20351507/answer/14859415
參考連接2:https://github.com/seajs/seajs/issues/277
一、對於依賴的模塊,AMD 是提早執行,CMD 是延遲執行。不過 RequireJS 從 2.0 開始,也改爲能夠延遲執行(根據寫法不一樣,處理方式不一樣)。CMD 推崇 as lazy as possible.
二、CMD 推崇依賴就近,AMD 推崇依賴前置。
3. AMD 的 API 默認是一個當多個用,CMD 的 API 嚴格區分,推崇職責單一。好比 AMD 裏,require 分全局 require 和局部 require,都叫 require。CMD 裏,沒有全局 require,而是根據模塊系統的完備性,提供 seajs.use 來實現模塊系統的加載啓動。CMD 裏,每一個 API 都簡單純粹。
核心是js的加載模塊,經過正則匹配模塊以及模塊的依賴關係,保證文件加載的前後順序,根據文件的路徑對加載過的文件作了緩存
ES6新的語法糖,類,模塊化等新特性
關於ES6參考連接:http://es6.ruanyifeng.com/
2. let和const命令
3. 變量的解構賦值
4. 字符串的擴展
5. 正則的擴展
6. 數值的擴展
7. 數組的擴展
8. 函數的擴展
9. 對象的擴展
10. Symbol
11. Proxy和Reflect
12. 二進制數組
15. Generator函數
16. Promise對象
17. 異步操做和Async函數
18. Class
19. Decorator
20. Module
1. 工廠模式
2. 構造函數模式
3. 原型模式
4. 混合構造函數和原型模式
5. 動態原型模式
6. 寄生構造函數模式
7. 穩妥構造函數模式
1. 原型鏈繼承
2. 借用構造函數繼承
3. 組合繼承(原型+借用構造)
4. 原型式繼承
5. 寄生式繼承
6. 寄生組合式繼承
1. 原型對象也是普通的對象,是對象一個自帶隱式的 __proto__ 屬性,原型也有可能有本身的原型,若是一個原型對象的原型不爲 null 的話,咱們就稱之爲原型鏈
2. 原型鏈是由一些用來繼承和共享屬性的對象組成的(有限的)對象鏈
一、儘可能減小 HTTP 請求
二、使用瀏覽器緩存
三、使用壓縮組件
四、圖片、JS的預載入
五、將腳本放在底部
六、將樣式文件放在頁面頂部
七、使用外部的JS和CSS
八、精簡代碼
一、 使用字面量實現命名空間(YUI):
Itcast.common.dom={};
Itcast.common.css={};
Itcast.common.event={};
二、使用閉包
當即執行函數,不暴露私有成員
var module1 = (function(){
var _count = 0;
var m1 = function(){
//...
};
var m2 = function(){
//...
};
return {
m1 : m1,
m2 : m2
};
})();