javascript語言精粹摘要

  • JavaScript中五種基本類型:string,number,boolean,null,undefined.還有一個對象類型object.
  • javascript只有一個數字類型。它在內部被表示爲64位的浮點數,和Java的double數字類型同樣。它沒有分離出整數類型,因此1和1.0的值相同。
  • javascript在被建立的時候,Unicode是一個16位的字符集,因此javascript中的全部字符都是16位的。 
  • javascript中沒有字符類型。要表示一個字符,只需創見僅包含一個字符的字符串便可。字符串是不可變的。一旦字符串被建立,就永遠沒法改變。
  • "\"(反斜線符號)是轉義字符。
  • 下面列出的值被當作假:
  1. false
  2. null
  3. undefined
  4. 空字符串''
  5. 數字0
  6. 數字NaN
  • type運算符產生的值有'number'、'string'、'boolean'、'undefined'、'function'、'object'.

        

  • &&    1&&2==2    1||2==1
  • 對象字面量是一種能夠方便的按指定規格建立新對象的表示法。
  1. 一個對象字面量就是包圍在一對花括號中的零或多個'名/值'對。在對象字面量中,若是屬性名是一個合法的JavaScript標識符且不是保留字,則並不強制要求用引號括住屬性名。因此用引號括住'first-name'是必需的,可是否括住first_name則是可選的。
  • JavaScript包含一種原型鏈的特性,容許對象繼承另外一個對象的屬性。正確的使用它能減小對象初始化是消耗的時間和內存。
  • for…in… hasOwnProperty

函數javascript

  • 每一個函數在建立時會附加兩個隱藏屬性:函數的上下文和實現函數行爲的代碼。每一個函數對象在建立時也隨配有一個prototype屬性。它的值是一個擁有constructor屬性且值即爲該函數的對象。這和隱藏鏈接到Function.prototype徹底不一樣。
  • 由於函數是對象,因此他們能夠像任何其餘的值同樣被使用。函數能夠保存在變量、對象和數組中。函數能夠被當作參數傳遞給其餘函數,函數也能夠再返回函數。並且,由於函數是對象,因此函數能夠擁有方法。
  • 函數的不同凡響之處在於它們能夠被調用。
  • 函數四個部分
  1. 保留字function
  2. 函數名(若是沒有給函數命名,它被稱爲匿名函數)
  3. 包圍在圓括號中的一組參數(這些參數的名稱將被定義爲函數中的變量。它們不像普通的變量那樣將被初始化爲undefined,而是在該函數被調用時初始化爲實際提供的參數的值)
  4. 包圍在花括號中的一組語句。這些語句就是函數的主體,它們在函數被調用時執行。

閉包java

  • 一個內部函數除了能夠訪問本身的參數和變量,同時它也能自由訪問把它嵌套在其中的父函數的參數與變量。經過函數字面量建立的函數對象包含一個連到外部上下文的鏈接。這被稱爲閉包。它是JavaScript強大表現力的來源。
 <script type="text/javascript">
        <!-- 在正常的腳本中,某個方法能夠獲取到外部的變量,或者全局變量 -->
        var num = 11;
        function func1(){
            console.log(num);
        }
        func1();

        <!-- 可是在外部是沒法獲取方法內部的局部變量的 -->
        function func2(){
            var num1 = 22;
            num2 = 33;
        }
        func2();
        <!--console.log(num1);  會報錯!-->
        console.log(num2); <!--能夠獲取到num2的值,由於不適用var定義變量時,默認是全局變量 -->

        <!-- 那麼如何在外部獲取到內部的變量呢!javascript能夠辦到 -->
        function func3(){
            var num3 = 44;
            function func4(){
                return num3;
            }
            return func4;
        }
        var func = func3();
        console.log(func());
   </script>

       在外部沒法獲取到func3內部的局部變量,可是func3內部的局部方法func4卻能夠獲取到,所以 返回一個func4的引用 ,這樣在外部經過這個func4就能夠獲取到func3的內部變量。編程

  雖然是繞了一個圈子,可是在方法外部卻經過這樣一個手段獲取到了內部的值。數組

    而這個方法內的局部方法func4就叫作閉包,按照不少書上的概念,這個方法搭建了方法內部與方法外部的橋樑,使得在外部也能夠任意的獲取到方法內部的資源。閉包

  可是閉包會形成變量在內存中持久佔用,所以會有必定的性能問題,最好不要輕易使用,即使使用也要在恰當的實際進行釋放。app

函數調用編程語言

  調用一個函數會暫停當前函數的執行,傳遞控制權和參數給新函數。除了聲明時定義的形式參數,每一個函數還接收兩個附加的參數:this和arguments.函數

  • 參數this在面向對象編程中很是重要,它的值取決於調用模式。
  • 在JavaScript中一共有4種調用模式
  1. 方法調用模式
  2. 函數調用模式
  3. 構造器調用模式
  4. apply調用模式
  • 這些模式在如何初始化關鍵參數this上存在差別。
  • 函數運算符是跟在任何產生一個函數值的表達式以後的一對圓括號。
  • 當實際參數的個數與形式參數的個數不匹配時
  1. 實際參數的個數>形式參數的個數  超出部分會被忽略
  2. 實際參數的個數<形式參數的個數  缺失的值會被替換爲undefined.
  3. 對參數值不會進行類型檢查:任何類型的值均可以被傳遞給任何參數。

方法調用模式性能

  • 當一個函數被保存爲對象的一個屬性時,咱們稱它爲一個方法。當一個方法被調用時,this被綁定到該對象。若是調用表達式包含一個提取屬性的動做(即包含一個 . 點表達式或[subscript]下標表達式),那麼它就是被當作一個方法來調用。

  //建立myObject對象。它有一個value屬性和一個increment方法this

  //increment方法接受一個可選的參數。若是參數不是數字,那麼默認使用數字1

  var myObject = {

    value:0,

    increment:function(inc){

      this.value +=typeof inc ==='number'?inc:1;

    }

  };

  myObject.increment();

  document.writeln(myObject.value);//1

  

  myObject.increment(2);

  document.writeln(myObject.value);//3

  • 方法可使用this訪問本身所屬的對象,因此它能從對象中取值或對對象進行修改。this到對象的綁定發生在調用的時候。這個「超級」延遲綁定使得函數能夠對this高度複用。經過this可取得它們所屬對象的上下文的方法稱爲公共方法。

  函數調用模式

  • 當一個函數並不是一個對象的屬性時,那麼它就是被當作一個函數來調用的。  
  • 以此模式調用函數時,this被綁定到全局對象。(解決辦法:若是該方法定義一個變量並給它賦值爲this,那麼內部函數就能夠經過那個變量訪問到this.按照約定,我把那個變量命名爲that)

 構造器調用模式

  • JavaScript是一門基於原型繼承的語言。這意味着對象能夠直接從其餘對象繼承屬性。該語言是無類型的。
  • 若是在一個函數前面帶上new來調用,那麼背地裏將會建立一個鏈接到該函數的prototype成員的新對象,同時this會被綁定到那個新對象上。

  //建立一個名爲Quo的構造器函數。它構造一個帶有status屬性的對象。

  var Quo = function(string){

    this.status = string;

  }

  //給Quo的全部實例提供一個名爲get_status的公共方法

  Quo.prototype.get_status = function(){

    return this.status;

  }

  //構造一個Quo實例

  var myQuo = new Quo("confused");

  document.writeln(myQuo.get_status());//打印顯示confused.

  • 一個函數,若是建立的目的就是但願結合new前綴來調用,那它就被稱爲構造器函數。按照約定,它們保存在以大寫格式命名的變量裏。若是調用構造器函數時沒有在前面加上new,可能會發生很是糟糕的事情,既沒有編譯時警告,也沒有運行時警告,因此大寫約定很是重要。(不推薦這種構造器)

Apply調用模式

  • 由於JavaScript是一門函數式的面向對象的編程語言,因此函數能夠擁有方法。
  • apply方法讓咱們構建一個參數數組傳遞給調用函數。它也容許咱們選擇this的值。apply方法接收兩個參數,第一個是要綁定給this的值,第二個就是一個參數數組。

  //構造一個包含兩個數字的數組,並將它們相加

   var array = [3,4];

   var sum = add.apply(null,array);//sum值爲7

   //構造一個包含status成員的對象

   var statusObject = {

    status:'A-OK'

  }

  //statusObject並無繼承自Quo.prototype,但咱們能夠在statusObject上調用get_status方法,儘管statusObject並無一個名爲get_status的方法。

  var status = Quo.prototype.get_status.apply(statusObject); //status值爲‘A-OK’

參數

  • 當函數被調用時,會獲得一個「免費」配送的參數,那就是arguments數組。
  • 函數能夠經過此參數訪問全部它被調用時傳遞給它的參數列表,包括那些沒有被分配給函數聲明時定義的形式參數的多餘參數。
  • 這使得編寫一個無須指定參數個數的函數成爲可能:

  //構造一個將大量的值相加的函數。

  //注意該函數的內部定義的變量sum不會與函數外部定義的sum產生衝突

  //該函數只會看到內部的那個變量

  var sum = function(){

    var i,sum =0;

    for(i=0;i<arguments.length;i+=1){

      sum+=arguments[i];

    }

    return sum;

  };

  document.writeln(sum(4,8,15,16,26,42));//108

  • 由於語言的一個設計錯誤,arguments並非一個真正的數組。它只是一個「相似數組(array-like)」的對象。
  • arguments擁有一個length屬性,但它沒有任何數組的方法。

返回

  • 當一個函數被調用時,它從第一個語句開始執行,並在遇到關閉函數體的}時結束。而後,函數把控制權交還給調用該函數的程序。
  • return語句可用來使函數提早返回。當return被執行時,函數當即返回而再也不執行餘下的語句。
  • 一個函數老是會返回一個值。若是沒有指定返回值,則返回undefined。
  • 若是函數調用時在前面加上了new前綴,且返回值不是一個對象,則返回this(該新對象)  

異常

  • JavaScript提供了一套異常處理機制。異常是干擾程序的正常流程的不尋常(但並不是徹底是出乎意料的)的事故。

  var add = function(a,b){

    if(typeof a!=='number'||typeof b!=='number'){

      throw{

        name:'TypeError',

        message:'add nedds numbers'

      };

    }

    return a+b;

  }

  • throw語句中斷函數的執行。它應該拋出一個exception對象,該對象包含一個用來識別異常類型的name屬性和一個描述性的message屬性。你也能夠添加其餘的屬性。
  • 該exception對象將被傳遞到一個try語句的catch從句:

  //構造一個try_it函數,以不正確的方式調用以前的add函數

  var try_it = function(){

    try{

      add("seven");

    }catch(e){

      document.writeln(e.name+':'+e.message);

    }

  }

  try_it();

擴充類型的功能

  • 咱們能夠經過給Function.prototype增長方法來使得該方法對全部函數可用:

  Function.prototype.method = function(name,func){

    this.prototype[name] = func;

    return this;

  }

  經過給Function.prototype增長一個method方法,咱們下次給對象增長方法的時候就沒必要鍵入prototype這幾個字符,省掉了一點麻煩。

  • 給Number.prototype增長一個integer方法來改善它。它會根據數字的正負來判斷是使用Math.ceiling仍是Math.floor.

  Number.method('integer',function(){

     return Math[this<0?'ceil':'floor'](this); 

  });

  document.writeln((-10/3).integer());//-3

  • JavaScript缺乏一個移除字符串首尾空白的方法。這個小疏忽很容易彌補:

  String.method('trim',function(){

    return this.replace(/^\s+|\s+$/g,'');

  })

  document.writeln('"+"    neat     ".trim()+'"');

  • 經過給基本類型增長方法,咱們能夠極大地提升語言的表現力。
  • 由於JavaScript原型繼承的動態本質,新的方法馬上被賦予到全部的對象實例上,哪怕對象實例是在方法被增長以前就建立好了。
  • 基本類型的原型是公共結構,因此在類庫混用時務必當心。一個保險的作法就是隻在肯定沒有該方法時才添加它。

  //符合條件時才增長方法

  Function.prototype.method = function(name,func){

    if(!this.prototype[name]){

      this.prototype[name] = func;

    }

    return this;

  }

遞歸

  • 遞歸函數就是會直接或間接地調用自身的一種函數。

繼承

  • JavaScript是一門弱類型語言,從不須要類型轉換。
  • 在基於類的語言中,對象是類的實例,而且類能夠從另外一個類繼承。JavaScript是一門基於原型的語言,這意味着對象直接從其餘的對象繼承。

this

未完待續……

 

 


注:如若喜歡,歡迎轉載,請在文章頁面明顯位置給出此文連接!
若您以爲這篇文章還不錯請點擊下右下角的推薦,有了您的支持才能激發做者更大的寫做熱情,很是感謝!

相關文章
相關標籤/搜索