javascript 學習(3)

1.關於object對象長度javascript

   若用.length測不出其具體長度,返回值爲undefined;可經過for..in來計算出其長度;例:java

1  var ob={a:"test1",b:"test2"};
2         var size = 0;
3          delete ob.a;
4        for(var i in ob){
5               alert(ob[i]);
6               size++;
7        }
8        console.info(ob.length);//undefined
9        console.info(size);//2

 

    若是finally塊使用return,continue,break語句使得解析語句跳出try,不論是否繼續,編譯器都會將其忽略。數組

  3.with語句瀏覽器

      做用是將object添加到做用域鏈的頭部,而後執行指令,最後把做用域恢復到原始狀態。不建議使用,緣由:難優化,運行速度比普通代碼慢閉包

 

 

 對象app

      1.除了字符串,數字,true,false,null和undefined以外,javascript中的值都是對象。函數

         對象常見用法:建立、設置、查找、刪除、檢測、枚舉它的屬性。可是同一對象中不能出現同名屬性。優化

      2.具備三個對象和兩個屬性(三個對象:內置對象,宿主對象,自定義對象;屬性:自有屬性,繼承屬性)this

      3.原型spa

          全部經過對象直接建立的對象都有同一個原型對象,並能夠經過javascript代碼Object.prototype得到原型對象的引用。經過關鍵字new和構造函數調用建立的對象的原型就是構造函數prototype的屬性的值。沒有原型的對象很少如Object.prototype就是其中之一。

    4.object.create()  

       是一個靜態函數,不提供調用方法。有兩個參數。能夠經過傳入null來構建一個沒有原型的新對象。他不會繼承任何東西,包括toString()因此不能和「+」運算符一塊兒正常工做。

   5.對於一個對象的屬性名是保留字或關鍵字必須使用[]來訪問,例:o.["for"];當使用方括號時,咱們說方括號內的表達式必須返回字符串。更嚴格的講,表達式必須返回字符串或返回一個能夠轉換成字符串的值。

   6.繼承:若是o中的屬性p是繼承的,則他爲只讀。

   7.刪除屬性:delete只能刪除自有屬性,不能刪除繼承屬性(要刪除繼承屬性必須定義這個屬性的原型上進行刪除它,並且這個影響到全部繼承自這個原型的對象)。若是delete後不是一個屬性值也會返回true。可是delete刪除那些可配置性爲false的屬性(儘管能夠刪除不可擴展對象的可配置屬性),某些內置對象的屬性是不可配置的如經過變量聲明的和函數聲明的建立的全局對象的屬性,在嚴格模式下,刪一些不可配置屬性會報一個雷型錯誤。

   8.檢測屬性:in,hasOwnPreperty(),propertyIsEnumerale()

      in運算符的左側是屬性名(字符串),右側是對象。若是自有屬性包括或繼承屬性中包括這個屬性則返回true。

      hasOwnPreperty()檢測對象是不是自有屬性。

      propertyIsEnumerale()檢測對象自有屬性是不是可枚舉屬性。

  9.枚舉屬性:

     在ECMAScript 5定義三個用枚舉屬性名稱的函數 :for...in,Object.keys(),Object.getOwnPropertyNames();

     Object.keys():返回一個數組,這個數組由對象中可枚舉的自有屬性的名稱組成。

     Object.getOwnPropertyNames():返回對象全部自有屬性的名稱,而不只僅是可枚舉的屬性。

 10.屬性getter和setter(存取屬性)  存取屬性不具備可寫性

     若是它只有setter方法,那麼它只有一個寫屬性

 11.其餘

     Object.getOwnPropertyDescriptor(),獲取對象中x屬性的屬性描述,代碼及結果以下:

1 Object.getOwnPropertyDescriptor({x:1,y:2},"x")
2 //結果爲 Object {value: 1, writable: true, enumerable: true, configurable: true}

若要設置屬性的特性,或想要新建屬性的某種特質則須要調用Object.defineProperty(對象,對象屬性,須要修改的值)

1 var o = {};
2         Object.defineProperty(o,"x",{value:"hahah",writable:false,enumerable:true, configurable:true});
3         o.x = "jkjskdjksjd";
4         console.info(Object.getOwnPropertyDescriptor(o,"x"));
5 //結果Object {value: "hahah", writable: false, enumerable: true, configurable: true}

12.對象的三個屬性:原型(prototype),類(class),可擴展性(extensible attribute).

     原型(prototype):經過new表達式建立的對象包含一個名爲constructor的屬性,這個屬性指代建立個對象的構造函數。

13.對象序列化

    可經過JOSN.stringify()和JSON.parse()來序列化對象和還原對象。

    注:日期對象序列化結果是ISO格式的日期字符串,但JSON.parse()依然保存他們字符串形式,而不會將它還原成原始日期對象。

         函數,RegExp,Error對象和undefined值不能序列化和還原

          JOSN.stringify()只能還原枚舉屬性對象。

14.對象方法

    在Array類的toLocalString()和toString()很像,惟一不一樣的是每一個數組元素會調用toLocalString()方法來轉換字符串

    valueOf()要在將對象轉換成某種原始值而非字符串時才調用,尤爲是轉換數字的時候。若是在須要使用原始值的上下文使用了對象,javascript就會自動調用這個方法。

    toString()返回一個表示調用這個方法的對象值得字符串。

 

數組

 1.數組中的值能夠是常量,表達式,對象直接量或其餘數組直接量例:

1 var a="this is a test";
2 var arr = [1,"a",a,{f1:"hahah",f2:2},[1,2,3]];

 2.若是省略組數直接量中的某個值,省略的元素將被賦予undefined值。

 3.可使用負數或非整數來索引數組,這種狀況下數值會轉換成字符串,字符串做爲屬性來用,只能當作對象屬性。

 4.稀疏數組:包含從0開始的不連續索引的數組。稀疏數組中,元素的length大於元素個數。

 5.向數組中添加和刪除元素

     push()在數組尾端添加一個或多個元素。

     unshift() 在數組首部插入一個元素,而且將其餘元素已到更高的索引

     delete a[i]刪除數組元素與爲其賦值undefined值時相似的,可是不會修改數組的length屬性,也不會將元素從高索引處移下來填充刪除屬性的留白,若是從一個數組中刪除一個元素,則這個數組變成了稀疏數組。

 6.數組方法

    array.join()將數組中的全部元素都轉化爲字符串並鏈接起來,最後返回一個字符串。默認是用逗號鏈接。

   array.reverse()將數組中元素順序進行顛倒。返回逆序數組。

   array.sort()將數組排序後返回,不帶參數時爲升序排列。是按ascii碼進行排序的。

   array.concat()建立並返回一個新數組。

   array.slice()方法返回指定數組的一個片斷或子數組。它的兩個參數分別指定了片斷的開始和結束的位置。返回的數組將包含從開始位置到數組結束位置之間的全部數組元素。若是隻出現一個參數,返回的數組將包含從開始位置到數組結束位子之間全部元素。若是指定一個參數,返回的數組將包含從開始位置到數組結尾的全部元素。若是出現負數,他表示相對於最後一個元素位置。

   array.splice()前兩個參數指定了須要刪除的數組元素。緊隨其後的任意參數指定了須要插入到數組中的元素。從第一個參數指定的地方開始插入。

   array.pop()和array.push()數組實現先進後出的棧。

   array.shift()和array.unshift() 後進後出。

   array.toString()和array.toLocalString()

   array.forEach() 重頭到尾遍歷數組,爲每一個元素調用指定函數。forEach()有三個參數:數組元素,元素的索引,元素自己。forEach()不能用break終止,若要終止函數將條件放入try..cach中而且能拋出異常,若是foreach調用foreach.break異常,循環會提早終止。在空數組調用上every()返回true,some()返回false。

   array.map() 將調用的數組的每一個元素傳遞給指定函數,並返回一個數組,他包含該數組的返回值,返回的是個新數組。若是是稀疏數組,相同的地方返回稀疏數組。長度相同,缺失元素相同。

   array.filter()返回的數組元素是調用的數組的子集。它會跳過稀疏數組,返回數組老是稠密的。

 1 var data = [1,2,3,,4,5];
 2     var sum = 0;
 3     data.forEach(function(value){
 4         sum +=value; 
 5         });
 6         console.info(sum);  //15
 7     var data2 = data.map(function(x){return x*x});  // [1, 4, 9, 0, 16, 25]
 8         console.info(data2);
 9     var filter1 = data.filter(function(x){return x < data.length});
10         console.info(filter1); //[1, 2, 3, null, 4, 5]

   array.some()和array.every() 數組的邏輯斷定:它們對數組元素應用指定的函數進行斷定,返回true或false。 array.some()規則和「或」類似,array.every()規則和「與」類似。

   array.reduce()和array.reduceRight() 使用指定的函數對數組進行組合,生成單個值。第一個是執行化簡操做的函數。第二個(可選)的參數是一個傳遞給函數的初始值。

  array.indexOf()和array.lastIndexOf() 若沒搜索到,返回-1,有兩個參數,第一個是索引值,第二個是起始值。

  7.類數組對象

    把擁有一個數值length屬性和對應負整數屬性的對象看作一種類型的數組。

 8.做爲數組的字符串

    字符串的行爲相似於只讀的數組,除了用charAt()方法訪問單個字符外還可使用方括號。

 

 

函數

 
  1.return語句終止函數執行,並返回表達式的值。若return中沒有一個相關的值,則返回undefined。若是函數中沒有return語句,則函數語句依次執行,最後返回undefined。

  2.函數聲明語句的話,函數名稱和函數體均提早:腳本中的全部函數和函數中全部嵌套的函數都會在當前上下文其餘代碼以前聲明。同時函數聲明語句建立的變量是沒法刪除的。不能出如今循環或判斷語句裏。

  3.任何函數只要做爲方法調用實際上都會傳入一個隱式的實參——這個實參是一個對象,方法調用的母體就是這個對象。

  4.關鍵字this沒有做用域的限制,嵌套的函數不會從調用它的函數中繼承this。若是嵌套函數做爲方法調用,其this的值不是全局對象就是undefined。不少人誤認爲調用嵌套函數的this會調用外層函數的上下文。若是你要訪問外部函數的this值,須要將this值保存在一個變量中。這個變量和內部函數都同在一個做用域內。

 1 var test = {
 2         m:function(){
 3             var self = this;
 4             f();
 5             function f(){
 6                 console.info(self === test);//true
 7                 console.info(this === test);//false
 8                 }
 9             }
10         }
11         test.m();

5.argument[]適用於包含固定個數的命名和必須參數,以及隨後個數不定的可選參數。argument不是真正的數組,而是一個實參對象。

3.嵌套函數

   變量做用域規則:它們能夠訪問嵌套它們(或多重嵌套)的函數的參數或變量

4.callee和caller屬性

    在非嚴格模式下,ECMAScript標準規範規定callee屬性指代當前正在執行的函數。caller是非標準的,但大多數瀏覽器都實現了這個屬性,它指代當前正在執行的函數。經過caller屬性能夠訪問調用棧。callee屬性在某些時候會很是有用,好比在匿名函數中經過callee遞歸調用自身函數。

5.做爲命名空間的函數

   函數中聲明的 變量在函數體內可見,在函數外部不可見。在javascript中沒法聲明只在一個代碼塊內可見的變量,因而,咱們經常簡單的定義一個函數用作臨時命名空間。這個命名空間內定義的變量不會污染全局命名空間。

6.閉包

   他們是對象,都關係做用域。做用域鏈在調用函數時的做用依然有用

 

 1  var test_1 = "this is a test1";
 2         function test_2(){
 3           var test_1 = "this is a test2";
 4           function test_3(){
 5              var test_1 = "this is a test3";
 6              return test_1;
 7           }
 8           return test_3;
 9         }
10         console.info(test_2()()

  閉包具備本身所綁定的arguments,所以,閉包沒法直接訪問外部函數的參數數組,除非外部函數將參數數組保存在另外一變量中。

7.函數屬性,方法和構造函數

   length屬性  表示的是當前函數形參的個數,和arguments不一樣,arguments表示的是該函數實參的一個數組。

   call()和apply()方法:①在嚴格模式下:call()和apply()第一個參數都會變成this的值,apply()和傳入的實參都是放在一個數組當中。

   bind()這個方法的主要做用是把函數綁定到某個對象上。

   Function()構造函數

相關文章
相關標籤/搜索