JavaScript基礎(Video Lectures Note)

JavaScript知識:javascript

一、HTML元素上的事件onclick,onmouseover(鼠標移入),onmouseout等是HTML語言定義的標準,是HTML語言和腳本語言溝通的渠道。事件的執行能夠是javascript語言、還能夠是vbscript語言等腳本語言。css

二、HTML <script> 標籤用於定義客戶端腳本。 因此script標籤是屬於HTML標準的,用於定義頁面的腳本。必需的 type 屬性規定腳本的 MIME 類型,如:<script type="text/javascript"> </script>。 script 元素既能夠用來包裹腳本語句,也能夠經過 src 屬性指向外部腳本文件。 html

二、<div onclick="div1.style.display='none';" id="div1> </div> 這樣直接在事件內寫代碼會很亂,並且這樣直接在事件內寫代碼且使用ID存在瀏覽器兼容性問題。可是document.getElementById在任何瀏覽器下都可支持使用。
並且,document.getElementById不只解決了兼容性問題,在改變元素屬性和樣式方面的便捷和jquery差很少,如:
var oDiv1 = document.getElementById("div1"); oDiv1.value="111"; oDiv1.style.border = "1px solid black;
總結:HTML中元素的屬性和樣式style的鍵值對怎麼寫,JS中就怎麼寫。惟一的例外是改變元素的class必須用ele.className="box" ,由於class是js中的保留字(關鍵字)。java

三、使用 標籤在 HTML 中建立連接。 注意: 標籤中必須提供 href 屬性或 name 屬性。jquery

href屬性的值能夠是:網頁URL,頁面中的錨,或者JS代碼。  name屬性建立文檔內的書籤(錨)。
例子:
<a href=「javascript:;」></a>  或者  <a href=「javascript:void(0);」></a>  用於置空<a>標籤,javascript後能夠放js代碼,可是這樣寫很差。
定義錨: <a name="mao">錨</a>    使用錨:<a href=「#mao></a>     此外:<a href=「#></a> 會跳到頁面頂部。

四、網頁換膚實現:經過js改變引入的css文件實現(不一樣的css給body,input等元素指定了不一樣的顏色)ajax

五、js中操做對象屬性的兩種方法: var divEle = document.getElementById("div1"); (PS:JS中一切皆對象)算法

第一種:obj.key = value;     divEle.title = "tip";
第二種:obj[key] = value;    divEle['title']="tip";

總結:通常用第一種比較簡便,可是第二種方法更靈活,要改變的屬性不固定時使用。json

DOM操做元素屬性的方法:    getAtrribute(), setAttribute(), removeAtrribute()

六、style與className: 元素.style.屬性=xxx 是修改行間樣式,以後再修改className不會對該屬性有效果.數組

style.屬性寫法遇到屬性名中有橫杆時採用駝峯寫法。

七、var div1 = document.getElementById("div1"); 是從整個document裏面找元素,
var inputEles = div1.getElementByTagName("input");則是從div1裏面找子元素了。瀏覽器

八、#div1 .ccc{ 如此定義的樣式表只能在ID爲div1的子元素中使用。

......
}

九、JS中的this

var btns = document.getElementByTagName("button");   
btns.onclick=function() {console.log(this.value);};    //this表示當前發生事件的元素(this 指向觸發函數運行時的那個對象 )
// getElementByTagName()獲得的是元素數組,能夠給每一個按鈕元素添加一個本身的屬性,如btns[i].index == i; 之後就可使用這個標識

十、window.onload = function(){}; jQuery的$(document).ready(function(){}); 區別:執行時間不一樣,事件可綁定次數不一樣等等

十一、遇到遞增數列如一、二、三、4....,每一個數字對應一個取值時,首先要使用數組實現,而不是if else或者switch。

例如:var arr = ["一月「,」二月「...];  直接取arr[數字],而不是if(1==數字) {return 」一月"};

總結:數組是效率最高的集合,能使用數組實現的首選數組。

十二、JavaScript組成:
ECMAScript(核心):定義了腳本語言的全部屬性、方法和對象,稱爲解釋器。 幾乎沒有兼容性問題。(不一樣瀏覽器之間)
DOM賦予了JS操做HTML的入口,即document。 有一些操做不兼容。
BOM賦予了JS操做瀏覽器的入口,即window。 徹底不兼容,少用。

1三、JS裏面的變量沒有類型,經過var定義變量,變量的類型取決於其裏面的值的類型。typeof用於檢測變量值的類型。

parseInt('a') 將報錯NaN:Not a Number。 所以判斷一個字符串是否數字字符串時就能夠這樣寫:isNaN(parsetInt('a12'));
parseFloat('3.5'); 將字符串轉爲浮點數,小數。

1四、隱式類型轉換例子: var a=5; var b='5'; var c='12';

a==b;  // true        == 先轉換值類型,而後比較值(通常用這個注意點就好了,不必定要全用全等顯得那麼嚴謹)
a===b; // false         === 不轉換值類型,直接比較值(簡稱全等)
c + b; // 125        +號在js中有兩種用途: 一、字符串相加  二、數字相加
c - b; // 7          -號在JS中只有一種用途:一、數字相減,所以會想把c和b先所有轉爲數字,再數字相減

1五、JS中由函數開闢做用域,Java中大括號開闢做用域。

JS閉包:子函數可使用父函數的局部變量。   至關於Java中的子大括號代碼能夠訪問父大括號中的局部變量一個道理。
本質:子做用域能夠訪問父做用域中的局部變量。

1六、命名規範:匈牙利命名法,變量名=類型(小寫)+對象描述(首字母大寫),其餘公司的不一樣命名規範幾乎都是在此基礎上的修改。

1七、JSON 指的是 JavaScript 對象表示法,JSON 語法是 JavaScript 對象表示法語法的子集。

注意:JSON中的值能夠經過jsonObj.key訪問,也能夠經過jsonObj['key']訪問。
    此外,JSON對象是沒有長度的,因此沒法直接經過下標jsonObj[i]的方式訪問,可是用for in循環能夠實現JSON對象的遍歷:
    for(var index in jsonObj) {
        console.log(jsonObj[index]);     //經過for循環才能完成JSON對象的遍歷
    }
Blue建議:數組循環時用for 0-len
          JSON對象循環時才用for in , 這樣纔不容易出錯,緣由後面解釋。

1八、JS函數對象的arguments屬性:函數對象的arguments屬性是一個數組,保存了傳入函數的全部參數。arguments也被稱爲可變參或不定參,

有了arguments那麼JS函數的可變參數功能很方便就實現了。  在函數內部可直接使用arguments[0]、arguments[1]等訪問傳入參數。

1九、獲取行間樣式:var oDiv = this.getElementById("div1");

alert(oDiv.width);  // 若是元素的width屬性定義在行間樣式style中,能夠取到,若是定義在樣式表中沒法取到。
緣由:(外部或內部)樣式表中的樣式須要計算後才應用到元素,跟行間樣式不一樣,所以取法也不一樣。
IE和高版本Chrome取法: oDiv.currentStyle.width     Chrome和Firefox標準取法:getComputedStyle(oDiv,null).width
因此經過JS取元素樣式要考慮行間樣式問題和瀏覽器兼容性問題。此外,JS只能取元素單同樣式,不能取複合樣式(樣式值由多個組成)。

20、數組基礎:

定義: var arr=[1,2]; var arr=new Array(1,2);  沒有任何差異,[]的性能略高,由於代碼短,能夠說JS中代碼越短性能越高。
length屬性: 既能夠獲取,又能夠設置。如arr.length = 3,將清空第3個之後的元素;如arr.length = 0,將清空整個數組。
添加元素:push()\unshift()  頭部\尾部添加          刪除元素:pop()\shift()  尾部\頭部彈出 
元素任意操做:splice()    用法以下:
     刪除:arr.splice(起點,長度)             arr.splice(2,3) 從下標2開始刪除3個元素
     插入:arr.splice(起點,長度,元素...)   arr.splice(2,0,'a','b','c') 從下標2開始刪除0個元素後插入'a','b','c'三個元素
     更新:arr.splice(起點,長度,元素...)   arr.splice(2,2,'a','b') 從下標2開始刪除2個元素後插入'a','b'兩個元素,等價於更新第三、4個元素
concat拼接:arrA.concat(arrB)   將兩個數組拼接後返回
join鏈接:arr.join('-')    用分隔符,組合數組元素,生成字符串  
sort()排序:默認按字符串排序,可傳入比較函數改變排序規則。
        例子:arr.sort(function(n1,n2) {return n1-n2});

2一、關閉定時器: var timer = setInterval(function(){},1000); clearInteval(timer); //關閉定時器 定時器只有啓動和關閉,沒有暫停或重啓。

炫酷數字時鐘、延時提示框作法:見第9課

2二、offsetleft是物體相對於文檔document的左偏移,offsetleft最大的優勢在於能夠綜合考慮全部影響物體位置的因素(好比margin,左邊其餘元素及其margin、空白等等)最後計算得出元素相對文檔的左偏移,無需本身計算。offsetLeft只能取值,不能賦值,賦值要用left。

相應的還有offsetTop,  offsetWidth/offsetHeight(獲取元素盒模型的寬度和高度,包括了padding,border)

2三、利用JS作動畫「無縫滾動」(跑馬燈) :見第10課

DOM知識:

2四、DOM 是 W3C(萬維網聯盟)的標準。DOM 將 HTML、XML 文檔表達爲樹結構,HTML DOM定義了訪問和操做 HTML文檔的標準方法。HTML DOM 定義了多種查找元素的方法,除了getElementById() 以外,還有 getElementsByName() 和 getElementsByTagName()。

2五、獲取子節點: oDiv.children(); //返回第一層子元素節點 oDiv.childNodes; //返回第一層子元素節點和文本節點

獲取父節點: oDiv.parentNode
offsetParent: 獲取最近的祖先定位元素,定位元素指的是元素的 CSS position 屬性不爲static(默認值)的元素,即被設置爲 relative、absolute 或 fixed 的元素。

2六、首尾子節點:firstChild/lastChild, firstElementChilde/lastElementChild(有兼容性問題,兼容性問題都是用if else判斷解決)。

兄弟節點:previousSibling/nextSibling, previousElementSibling/nextElementSibling(一樣有兼容性問題)

2七、建立DOM元素:建立一個節點:document.createElement(標籤名) 刪除元素:父節點.removeChild(節點)

追加一個節點(追加到末尾):appendChild(節點)。     //先把元素從原有父級上刪掉,再添加到新的父級;若是元素是DOM建立的,則沒有刪除這一步。     插入元素(在已有元素前插入):insertBefore(節點,原有節點) 。

2八、文檔碎片:能夠提升DOM操做性能(在低級瀏覽器IE6,IE7中才能直接提高性能;在高級瀏覽器Chrome,IE9中對性能幾乎無任何提高,有時還會下降。如今基本上也不用了。)

var oFrag = document.createDocumentFragement();  //文檔碎片就像一個袋子,將多個JS建立的元素加入到袋子中,而後一次性將袋子插入到HTML中

2九、表格操做:在90年代,沒人提DIV+CSS佈局,你們都在用table佈局,全部JS開發者爲table操做提供了一些便捷的API。如:

表格獲取:tBodies(獲取table的全部bodies),tHead(獲取表頭,只有一個),tFoot(獲取表尾,只有一個),rows,cells
    代碼:oTable.tBodies[0].rows[0].cells[0];   //獲取表格oTable的第一個body的第一行的第一列
          oTable.tBodies[0].rows[0].style.background="#CCC"; //改變行的背景色、還能夠給行加鼠標移入高亮、篩選等等
表格插入行:DOM建立行,而後插入到表格尾部    表格刪除行:類似操做

30、oDiv.appendChild(oLi) 方法

3一、DOM獲取的元素數組與JS中數組Array不同,DOM獲取的元素數組只有length,[index]操做,沒有Array的sort,splice,join,push,pop等操做。

DOM獲取的元素數組排序解決辦法:用for循環將元素數組塞到JS數組裏面,而後再調用sort(排序規則函數)函數。

3二、什麼是表單:向服務器提交數據,action屬性指明提交到哪裏。

表單事件:onsubmit:提交時發生(最有用), onreset:重置時發生
    表單控件的name屬性和value屬性,在表單提交時做爲鍵值對傳給後臺。
有了Ajax不須要表單也能夠向服務器提交請求或發送數據。
(重點)Blue石川:不管是ajax仍是jsonp等數據交互方式,它們的本質都是對錶單的模擬。實際上,http規定了表單是瀏覽器對服務器請求數據的惟一方式,所以雖然咱們可能不多用到表單,卻萬萬不能忽視表單的重要性。

3三、表單內容驗證:onsubmit和事件的阻止默認事件配合起來作表單驗證。

無論JS檢查的再怎麼巧妙,再怎麼靠譜,再怎麼考慮周全,仍是不行。用戶能夠禁用JS(禁用後JS校驗不會執行,form表單點擊submit直接提交數據),
    或者寫假裝頁面來提交數據(寫僞頁面模仿真實頁面表單提交請求),都是有可能。
    因此無論前臺再怎麼校驗,後臺也還必須的作檢查,這個是沒辦法的事,畢竟一切來自用戶的數據都是不可信的。

Blue日常常常說的一句話:掌握多少個函數,掌握多少個庫,這個基本上沒什麼用。最重要的是你的思想如何,你的思想到哪兒了,你啥都不會,有一天就學會了,就這麼簡單。

JS運動知識

3四、運動的物體基本上要絕對定位:position:absolute

位置運動基本是:訪問offsetLeft,offsetTop屬性和操做left,top屬性。  //像素的最小單位是1px,若是給left,top賦予小數,則計算機往下取整

3五、框架:說的很簡單,就是前人在作一件事的時候總結出來了這麼一套規律,之後你作相同的事只要按照這個步驟走這事就靠譜了。

框架的做用一是幫助你,二是約束你。
      JS運動的基本框架(即寫運動的基本寫法):見第15課 ;   多物體運動框架:見第17課;     完美運動框架:見第19課 ;

總結:寫程序寫到高級的地方會發現最後都是數字的遊戲了。

3六、多個DIV同時動時,須要多個定時器,能夠在JS中定義多個定時器,更好的方法是給每一個DIV對象加個屬性來存儲本身的定時器。

代碼:var oDiv = document.get..ById("div1");    oDiv.timer = function(... setInterval();  ...);

3七、console.log(0.007*100); //0.7000000000000001 輸出結果是float類型,可是不許確,是由於float是用近似值來表示?

3八、鏈式運動:一個運動結束後執行另外一個運動。

作法:給第一個運動函數傳入參數(第二個運動函數),第一個運動函數執行完時調用第二個運動函數。

3九、offsetHeight,offsetWidth(獲取元素盒模型的高度和寬度)是計算事後的高度和寬度,這兩個屬性在插入元素後立馬就能取元素高度和寬度,

方便作運動效果。(好比留言板插入,想讓新的留言不是忽然一下插到首條留言,而是慢慢的從上往下展開下來,就能夠插入新留言li
後獲取li高度,而後設置爲0,讓其高度從0展開到獲取的高度,同時還可讓透明度運動)

JS事件基礎、中級、高級:

40、event對象:豐富咱們獲取事件的信息。

獲取event對象(兼容性寫法):var oEvent = ev||event; (JS第二定律:凡是好用的東西一定不兼容,如event,)
獲取頁面的scrollTop(兼容性寫法):var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
小經驗:但凡用到clientX,clientY的時候,必定要加上scrollLeft,scrollTop,不然很容易就出問題。

4一、document表明整個頁面, document.childNodes[1].tagName; //HTML [0]:DOCTYPE

實際上document是第一級標籤<!DOCTYPE html> 和 <html>的父級。
因此要給整個頁面加事件必定要給document加,而不是body,由於body要被撐開且佔滿屏幕高度才能保證觸發事件。

4二、事件冒泡:平時不多主動用這個,更多的是給我們帶來了麻煩。 取消冒泡:event.cancelBubble = true; //讓事件再也不往父級傳

(例如子元素、父元素各有點擊事件,可是不能同時執行,這時就不能讓子元素的點擊事件冒泡給父元素觸發父元素的點擊事件)
事件捕獲與事件冒泡:當事件發生時,事件對象先從上(document)往下傳,再從下往上傳走一個圈。每一個元素對象均可以添加
不一樣事件的捕獲函數和冒泡函數:oElement.addEventListener('click',function(){},false/true)  默認值false表示事件冒泡函數
onclick、onmousedown...設置的是冒泡函數。

4三、按鍵控制方向:按下不鬆第一下有卡頓。爲何? 第20課40分鐘。

4四、鍵盤事件的主要屬性:keyCode、ctrlKey、shiftKey、altKey

oInput.onkeydown=function(){   //給元素添加鍵盤按下事件(元素獲取焦點的狀態下才會觸發)
var oEvent = ev||event;
    if(oEvent.keyCode==13){};   //按Enter觸發
    if(oEvent.keyCode==13 && oEvent.ctrlKey){};  //按CTRL + Enter觸發,定義快捷鍵
};

4五、事件默認行爲:瀏覽器自帶的事件行爲。 阻止默認行爲:return false 或者 event.preventDefault()

例1:自定義右鍵菜單(阻止右鍵默認行爲)
document.oncontextmenu=function(ev){    //oncontextmenu,點擊右鍵事件  
    var oEvent = ev||event;
    oDiv.style.display = block;         //顯示自定義菜單
    return false;                          // 屏蔽系統右鍵菜單
}; 
例2:表單控件只能輸入數字(阻止按鍵默認行爲)
var oInput = document.getElementById("txt1");
oInput.onkeydown = function(ev) {
    var oEvent = ev||event;
    if(oEvent.keyCode < 48 || oEvent.keyCode>57 && oEvent.keyCode!=8 )  // 8:backspace刪除鍵 48-57:數字鍵
        return false;
}
例3:鼠標拖拽物體移動:  見第21課。
oDiv.onmousedown = function() {
    ...獲取div和鼠標的座標差...
    document.onmousemove = function() {
        //讓div跟着鼠標移動
    }
    document.onmouseup = function () {
        document.onmousemove = null;
        document.onmouseup = null;
    }
    return false;   //避免了firefox中的拖拽bug和不一樣瀏覽器下的某些問題
}

JS事件高級應用:

4六、事件綁定:實現一個事件上綁不少函數。 應用:鼠標拖拽與吸盤,第22課

綁定:addEventListener(事件名稱,函數,捕獲或冒泡);   解綁:removeEventListener(事件名稱,函數,捕獲或冒泡)
    IE:attachEvent(事件名,函數),detachEvent(事件名,函數)
此外,IE和Chrome+Firefox在事件名稱上還有區別,IE事件名要帶on,如onclick,onmouseover; Chrome和Firefox不須要帶on
IE的oDiv.setCapture():把全部事件集中到oDiv上來處理。

4七、自定義滾動條:第23課( 基礎是鼠標拖拽,第22課 )

思路:自定義滾動條及其滾動條框是固定高度的,拖動滾動條時計算出滾動距離的比例。要滾動的div3的父div2的overflow:hidden。
     經過控制div3的top值實現其滾動效果,top值經過比例以及div2和div3的高度計算。
     
Ajax基礎和中級:

4八、Ajax功能:在不刷新頁面的前提下去請求服務器數據。 服務器跟PC沒啥區別。 WAMP服務器程序。

Ajax請求過程:建立Ajax對象--》鏈接到服務器,open()--》發送請求,send()--》接收返回數據

4九、緩存:根據URL來緩存的,即緩存訪問過的URL的內容。 開發階段解決緩存干擾辦法:讓URL一直變,如在URL後面加個沒用的Get參數

get方式:有緩存。  post方式:無緩存。

50、XMLHttpRequest對象

readyState屬性:瀏覽器和服務器的交互,進行到哪一步了   //3(解析):正在解析響應內容  4(完成):響應內容解析完成,能夠在客戶端調用了。 
  注意:讀取HTTP響應完成並不表明請求成功。
status屬性:HTTP響應狀態碼。   // 200:請求成功

5一、XML能夠說已經被歷史淘汰了,基本是老式的程序在用。由於同等數據量下,XML比JSON大得多,浪費帶寬。

字符集全都統一爲utf-8就沒編碼問題了。

JS面向對象基礎,中級,高級:

5二、第26課開始, 待繼續。。。。。。

其餘:
一、setTimeout(func, delay, param1, param2, ...) 第三個參數及之後的參數均可以做爲func函數的參數

二、[10, 20, 1, 2].sort(); //沒法理解的結果: [1, 10, 2, 20]
這是由於Array的sort()方法默認把全部元素先轉換爲String再排序,默認對字符串排序是按照ASCII的大小比較的。
sort()方法也是一個高階函數,它還能夠接收一個比較函數來實現自定義的排序:一般規定,對於兩個元素x和y,若是認爲x > y(x < y),則返回1(-1),
若是認爲x == y,則返回0,這樣,排序算法就不用關心具體的比較過程,而是根據比較結果直接排序。若是要倒序排序,顛倒比較函數的返回值就好了。

三、Array的高階函數map(0/reduce(),filter()都接收一個運算函數,遍歷數組元素的進行相應運算。

四、閉包:咱們在函數lazy_sum中又定義了函數sum,而且,內部函數sum能夠引用外部函數lazy_sum的參數和局部變量,當lazy_sum返回函數sum時,相關參數和變量都保存在返回的函數中,這種稱爲「閉包(Closure)」的程序結構擁有極大的威力。 閉包的做用域是靜態的,能夠永久保存局部資源,而函數做用域只存在於運行時,函數執行結束後當即銷燬。

若是內部函數sum使用了外部函數lazy_sum的相關參數和變量,則返回的sum使用的是最終的參數值和變量值。例如:
function count(j) { var i = 1; var arr = []; arr.push(function(){return i*i;}); i=2; arr.push(function(){return i*i;}); j++; arr.push(function(){return j*j;}); return arr;};
var res = count(3);  res[0](); //4   res[1](); //4   res[2](); //16         //  返回的函數使用的參數j和變量i都是最終的參數值和變量值。

五、generator(生成器):和函數不一樣的是,generator由function定義(注意多出的號),而且,除了return語句,還能夠用yield返回屢次。yield要在return以前返回。

大多數同窗馬上就暈了,generator就是可以返回屢次的「函數」?返回屢次有啥用?(見廖雪峯官網)

六、JS的原型和原型鏈: (最好的解釋參見:https://www.jianshu.com/p/dee...
JS是一種基於對象的語言,但在ES6以前是不支持繼承的,爲了具有繼承的能力,Javascript在函數對象上創建了原型對象prototype,並以函數對象爲主線,從上至下,在JS內部構建了一條 原型鏈 。原型鏈把一個個獨立的對象聯繫在一塊兒,Object則是全部對象的祖宗, 任何對象所創建的原型鏈最終都指向了Object,並以 Object 終結。

記住如下兩點:
1.__proto__是每一個對象都有的一個屬性,而prototype是函數纔會有的屬性。  
PS:數據類型String,Array,Number,Boolean,Object都是函數。   // typeof(Array) typeof(number)... 都是function; Math是個例外,是對象,不是函數。
2. __proto__指向的是當前對象的原型對象,而prototype指向的,是以當前函數做爲構造函數構造出來的對象的原型對象。
3.原型和原型鏈是JS實現繼承的一種模型。原型鏈的造成正是靠__proto__,而非prototype.

(我的總結):每一個函數(Person)對應一個原型對象,原型對象(Person.prototype)是構造函數(Person)的一個實例,原型對象有一個默認屬性constructor,每一個對象都是依據原型對象建立的。建立的對象從原型對象上繼承屬性(另外經過構造函數中初始化本身的屬性),同時也繼承了原型鏈上的屬性。

能夠給原型對象添加屬性,從而讓建立的對象繼承了這些屬性。

那原型對象是用來作什麼的呢?主要做用是用於繼承。   
全部函數對象的proto都指向Function.prototype,且全部函數對象的構造函數都是Function,由於全部函數對象都是依據Function函數的原型對象建立的。

七、JavaScript中的this究竟是什麼? (參考:http://mp.weixin.qq.com/s/ksq...

函數調用的最終形式:func.call(context, p1, p2)  // 暫不談func.apply(this, [arg1, arg2]) 
this,就是上面代碼中的 context。就這麼簡單。
this 是你 call 一個函數時傳的 context,因爲你歷來不用 call 形式的函數調用,因此你一直不知道。

如何肯定this?

this 均指向觸發函數運行時的那個對象。而在函數運行時,this 的值是不能被改變的。
若是你傳的context 是 null 或者 undefined,那麼 window 對象就是默認的 context(嚴格模式下默認 context 是 undefined)。

八、JavaScript函數對象的call,apply,bind方法:Function對象提供了call、apply
和 bind 等方法來改變函數體內的 this 指向,其中,call 和 apply 主動執行函數,bind通常在事件回調中使用,而 call 和 apply
的區別只是參數的傳遞方式不一樣。
call,appply用途:某個對象借用別的對象的方法來處理自身的數據。 例如:A對象有say方法,B對象沒有。 A.say.call(B); //B對象調用A對象say方法

九、JavaScript delete操做符: delete 操做符用於刪除對象的某個屬性, delete object.property 或 delete object['property']。

delete操做符具備返回值,返回值爲布爾值,刪除不存在的屬性會返回true。
    使用var聲明的屬性(包括函數),不能從全局做用域或函數做用域中刪除。
    任何用let或const聲明的屬性不可以從它被聲明的做用域中刪除。

十、訪問js對象的成員的兩種方式:方式一:點語法 方式二:經過使用object[propertyName] (對象[屬性名])

通常狀況下,使用最多的是第一種方式,即:點語法。可是,當你使用動態屬性名稱而且當屬性名必須包含js不支持的字符時,就不能使用點了,此時方式二變得很是有用。

十一、null,undefined 的區別?

null        表示一個對象被定義了,值爲「空值」;
undefined   表示不存在這個值。
怎麼判斷一個變量沒有被定義:typeof bianliang ==」undefined」

十二、怎麼判斷一個變量arr的話是否爲數組(此題用typeof不行):Arr instanceof Array 或者 Array.isArray()

1三、事件委託是什麼

事件委託就是事件目標自身不處理事件,而是把處理任務委託給其父元素或者祖先元素,甚至根元素(document)。
事件委託還有一個名字叫事件代理,JavaScript高級程序設計上講:事件委託就是利用事件冒泡,只指定一個事件處理程序,就能夠管理某一類型的全部事件。

1四、Math 對象並不像 Date 和 String 那樣是對象的類,所以沒有構造函數 Math()。您無需建立它,經過把 Math 做爲對象使用就能夠調用其全部屬性和方法。

Date,String都是函數,須要new對象後才能調用方法。

1五、.寫一個通用的去除字符串左右空格的函數?

String.prototype.strim = function(){
  return this.replace(/(^\s|\s$)/g,」」);
}

1六、javascript檢測瀏覽器是否支持某些事件

功能檢測 「touchstart」 in document  //使用 in 運算符,檢測對象中是否存在事件  
特徵檢測  navigator.userAgent  //檢測瀏覽器內核、版本等信息

1七、var aa = new Function() 它的本意實際上是經過實例化一個Function原型,獲得一個數據類型爲function的對象,也就是一個函數,而該變量就是函數名。

等價於: function aa() { ...... }
相關文章
相關標籤/搜索