Array對象

1. 修改原數組java

  push/ unshift 返回值 數組長度正則表達式

  pop/shift 返回值 刪除、增長值數組

  reversedom

  sort() 若無參數,則比較的是字符串,會先用toString()轉爲字符類型函數

  splice: 刪除 (a, b)this

     插入 (a, 0, c, ...)spa

     替換 (a, b, c, ...)prototype

2. 不修改原數組插件

  concatcode

  slice (a, b) 若a,b爲負,則爲length+a/b,而且若a>b,則返回[]

  join 

  

*補充知識點

淺複製

  淺複製是複製引用,複製後的引用都是指向同一個對象的實例,彼此之間的操做會互相影響

深複製

  深複製不是簡單的複製引用,而是在堆中從新分配內存,而且把源對象實例的全部屬性都進行新建複製,以保證深複製的對象的引用圖不包含任何原有對象或對象圖上的任何對象,複製後的對象與原來的對象是徹底隔離的

深複製方法

1. Array的slice和concat方法

1) 單純數組

  var array = [1,2,3];

  var array_shallow = array;

  var array_concat = array.concat();

  var array_slice = array.slice(0);

  console.log(array === array_shallow);   //true

  console.log(array === array_slice);     //false

  console.log(array === array_concat);    //false

2) 數組中包含對象

  var array = [1, [1,2,3], {name:"array"}];

  var array_concat = array.concat();

  var array_slice = array.slice(0);

  //改變array_concat中數組元素的值

  array_concat[1][0] = 5;

  console.log(array[1]);    //[5,2,3]

  console.log(array_slice[1]);  //[5,2,3]

  //改變array_slice中對象元素的值

  array_slice[2].name = "array_slice";

  console.log(array[2].name);   //array_slice

  console.log(array_concat[2].name); //array_slice

能夠看出concat和slice並非真正的深複製,數組中的對象元素(Object,Array等)只是複製了引用.

2. JSON對象的parse和stringify

  var source = {

      name:"source",

      child:{

          name:"child"

      }

  }

  var target = JSON.parse(JSON.stringify(source));

  //改變target的name屬性

  target.name = "target";

  console.log(source.name);   //source

  console.log(target.name);   //target

  //改變target的child

  target.child.name = "target child";

  console.log(source.child.name);  //child

  console.log(target.child.name);  //target child

  這個方法使用較爲簡單,能夠知足基本的深複製需求,並且可以處理JSON格式能表示的全部數據類型,可是對於正則表達式類型、函數類型等沒法進行深複製(並且會直接丟失相應的值),同時若是對象中存在循環引用的狀況也沒法正確處理

3.   jQuery中的extend

1.  jQuery.extend( target [, object1 ] [, objectN ] )

合併object1, objectN到target對象,若是隻有一個參數,則該target對象會被合併到jQuery對象中

  var result=$.extend( false, {}, 

  { name: "John", location:{city: "Boston",county:"USA"} }, 

  { last: "Resig", location: {state: "MA",county:"China"} }  );

  result={name:"John",last:"Resig",location:{state:"MA",county:"China"}};

2.  jQuery.extend([deep], target [, object1 ] [, objectN ] )

  深度複製合併對象,第一個參數是boolean類型的true時,將object1, objectN深度複製後合併到target中;關於深度複製,是將除null, undefined,window對象,dom對象,經過繼承建立的對象外的其它對象克隆後保存到target中;

  var result=$.extend( true, {}, 

  { name: "John", location:{city: "Boston",county:"USA"} }, 

  { last: "Resig", location: {state: "MA",county:"China"} }  );

  result={name:"John",last:"Resig",location:{city:"Boston",state:"MA",county:"China"}};

jQuery擴展:

  1.  jQuery.extend()

  jQuery.extend中的jQuery類型是function,即typeof jQuery值爲字符串「function」。若是把jQuery當成一個類,jQuery.extend至關於爲該類添加了靜態方法extend。靜態方法是不須要new一個實例再去調用的,經過「類名+方法名」直接調用。

  2.  jQuery.fn.extend()

  jQuery.fn等於jQuery.prototype。經過調用jQuery.fn.extend(object)來擴展時(注意只傳一個參數object),extend函數中仍然會執行。而這時的this則是jQuery.prototype。即給jQuery.prototype上添加了許多屬性,方法。當jQuery函數執行時,如$()或jQuery()。該函數會new一個jQuery。這時則把擴展的屬性,方法都附加到new生成的對象上了。

jQuery插件開發:

  一、  類級別的插件開發

    1.1 添加一個新的全局函數

      添加一個全局函數,咱們只需以下定義:

      jQuery.foo = function() {   alert('This is a test. This is only a test.');  };    

    1.2 增長多個全局函數

      添加多個全局函數,可採用以下定義:

      jQuery.foo = function() {   alert('This is a test. This is only a test.');  };  

      jQuery.bar = function(param) {  alert(param);  };   

      調用時和一個函數的同樣的:jQuery.foo();jQuery.bar();或者$.foo();$.bar('bar');  

    1.3 使用jQuery.extend(object); 

      jQuery.extend({      

        foo: function() {  alert('This is a test. This is only a test.');    },      

        bar: function(param) { alert(param); }     

      });

  1.4 使用命名空間

    雖然在jQuery命名空間中,咱們禁止使用了大量的javaScript函數名和變量名。可是仍然不可避免某些函數或變量名將於其餘jQuery插件衝突,所以我

  們習慣將一些方法封裝到另外一個自定義的命名空間。

  jQuery.myPlugin = {          

    foo:function() { alert('This is a test. This is only a test.');    },          

    bar:function(param) { alert(param); }         

  };  

  採用命名空間的函數仍然是全局函數,調用時採用的方法:  

  $.myPlugin.foo();         $.myPlugin.bar('baz');

  二、  對象級別的插件開發

  對象級別的插件開發須要以下的兩種形式:、

  形式1:  

   (function($){     

    $.fn.extend({     

      pluginName:function(opt,callback){     // code      }     

    })     

  })(jQuery);     

  形式2:

   (function($) {       

    $.fn.pluginName = function() {   // code };     

  })(jQuery);      

       上面定義了一個jQuery函數,形參是$,函數定義完成以後,把jQuery這個實參傳遞進去.當即調用執行。這樣的好處是,咱們在寫jQuery插件時,也可使用$這個別名,而不會與prototype引發衝突.

相關文章
相關標籤/搜索