1.JavaScript只有一個單一的數字類型,它在內部被表示爲64位的浮點數。因此1和1.0是相同的值。值NaN是一個數值,它表示一個不能產生正常結果的運算結果。NaN不等於任何值,包括它本身。值Infinity表示全部大於1.79769313486231570e+308值javascript
2.JavaScript在被建立的時候,Unicode是一個16位的字符集,因此JavaScript中全部字符都是16位的。 JavaScript沒有字符類型,要表示一個字符,只須建立僅包含一個字符的字符串便可。java
3.字符串有一個length屬性正則表達式
4.字符串是不可變的,一旦字符串被建立,就永遠沒法改變它。但經過+運算符去鏈接其餘的字符串從而獲得一個新字符串是很容易的。‘c’+'a'+'t'==='cat'是true編程
5.在JavaScript中下面列出的值被看成假 false,null,undefined,空字符串‘ ’,數字0,數字NaN 其它全部值都被看成真,包括true.字符串‘false’,以及全部對象數組
6.typeof運算符產生的值有‘number’,‘string’,'boolean','undefined','function'和‘object’ *****************************閉包
7.javascript的簡單類型包括數字,字符串,布爾值(true和false),null值和undefined值。其它全部的都是對象。數字,字符串和布爾值「貌似」對象,由於它們擁有方法,但它們是不可變的。JavaScript中的對象是可變的鍵控集合。在JavaScript中,數組是對象,函數是對象,正則表達式是對象,固然,對象天然也是對象。 對象是屬性的容器,其中每一個屬性都擁有名字和值。屬性的名字能夠是包括空字符串在內的任意字符串。屬性值能夠是除undefined值以外的任何值。 javaScript中的對象是無類別的,它對新屬性的名字和值沒有約束。對象適合用於收集和管理數據。對象能夠包含其餘對象。 javascript包括一個原型鏈特性。容許對象繼承另外一個對象的屬性。正確地使用它能減小對象初始化的時間和內存消耗。app
8.對象字面量 對象字面量提供了一種很是方便地建立新對象值的表示法。一個對象字面量就是包圍在一對花括號中的零或多個「名/值」對。逗號用來分隔多個「名/值」對。屬性的值能夠從包括另外一個對象字面量在內的任意表達式中得到。對象是可嵌套的。編程語言
9.檢索 要檢索對象中包含的值,能夠採用在[]後綴中括住一個字符串表達式。若是字符串表達式是一個常數,並且它是一個合法的JavaScript標識符而並不是保留字,那麼也能夠用.表示法代替.優先考慮使用.表示法。 stooge['first-name'] flight.departure.IATA 若是你檢索一個並不存在的成員元素的值,將返回一個undefined值。 ||運算科符能夠用來填充默認值: var middle = stooge['middle-name'] || "(none)" var status = flight.status || "unknown"; 嘗試檢索一個undefined值將會致使TypeError異常。之能夠經過&&運算符來避免錯誤函數
10.更新 對象中的值能夠經過賦值語句來更新。若是屬性名已經存在於對象中,那麼這個屬性的值被替換。若是對象以前並無擁有那個屬性名,那麼該屬性就被擴充到該對象中。this
11.引用 對象經過引用來傳遞。它們永遠不會被拷貝。
12.原型 每一個對象都鏈接到一個原型對象,並用它能夠從中繼承屬性。全部經過對象字面量建立的對象都鏈接到Object.prototype這個JavaScript中標準的對象。
當你建立一個新對象時,你能夠選擇某個對象做爲它的原型。JavaScript提供的實現機制雜亂而複雜,但其實它能夠被明顯地簡化。咱們將給Object增長一個beget方法,這個beget方法建立一個使用原對象做爲其原型的新對象。
if(typeof Object.beget !== 'function'){ Object.beget = function(o){ var F = function(){}; F.prototype = o; return new F();
}; }
var another_stooge = Object.beget(stooge);
原型鏈接在更新時是不起做用的,當咱們對某個對象作出改變時,不會觸及到該對象的原型。 原型鏈接只有在檢索值的時候才被用到。若是咱們嘗試去獲取對象的某個屬性值,且該對象沒有此屬性名,那麼JavaScript會試着從原型對象中獲取屬性值。若是那個原型對象也沒有該屬性,那麼再從它的原型中尋找,依此類推,直到該過程最後到達終點Object.prototype.若是想要的屬性徹底不存在於原型鏈中,那麼結果就是undefined值。這個過程稱爲「委託」。 原型關係是一種動態的關係。若是咱們添加一個新的屬性到原型中,該屬性當即對全部基於該原型建立的對象可見。
13. 反射 注意原型鏈中的任何屬性都會產生一個值。有兩個方法去處理這些不須要的屬性。第一個是讓你的程序檢查並剔除函數值。通常來講作反射的目標是數據,所以你應該意識到一些值可能會是函數。 另外一個方法是使用hasOwnProperty方法,若是對象擁有獨有的屬性,它將返回true。hasOwnProperty方法不會檢查原型鏈。
14.枚舉 for in 語句可用來遍歷一個對象中的全部屬性名。該枚舉過程會列出全部的屬性--包括函數和你可能不關心的原型中的屬性---因此在必要過濾掉那些你不想要的值。最爲經常使用的過濾器是hasOwnProperty方法,以用用typeof來排除函數; var name; for(name in another_stooge){ if(typeof another_stooge[name] !=='function'){ document.writeln(name + ':'+another_stooge[name]); } }屬性名出現的順序是不肯定的。
15.刪除 delete運算符能夠用來刪除對象的屬性。它將會移除對象中肯定包含的屬性,它不會觸及原型鏈中的任何對象。刪除對象的屬性可能會讓來自原型鏈中的屬性浮現出來
16.減小全局變量污染 javaScript能夠很隨意地定義那些可保存全部應用資源的全局變量。不幸的 ,全局變量消弱了程序的靈活性,因此應該避免。 最小化使用全局變量的一個方法是在你的應用中只建立惟一一個全局變量。 var MYAPP= {}; 該變量此時變成了你的應用的容器。 ****************************** 函數包含一組語句,它們是JavaScript的基礎模塊單元,用於代碼複用,信息隱藏和組合調用。
17.函數對象 在JavaScript中函數就是對象。對象是「名/值」對的集合並擁有一個鏈接到原型對象的隱藏鏈接。對象字面量產生的對象鏈接到Object.prototype。函數對象鏈接到Function.prototype(該原型對象自己鏈接到Object.prototype).每一個函數在建立時附加有兩個附加的隱藏屬性:函數的上下文和實現函數行爲的代碼(JavaScript建立一個函數對象時,會給該對象設置一個‘調用’屬性。當JavaScript調用一個函數時,可理解爲調用此函數的‘調用’屬性)。 每一個函數對象在建立時也隨帶有一個prototype屬性,它的值是一個擁有constructor屬該且值即爲該函數的對象。這和隱藏鏈接到Function.prototype徹底不一樣。 由於函數是對象,因此它們能夠像任何其餘的值同樣被使用。函數能夠存放在變量,對象和數組中,函數能夠被看成參數傳遞給其餘函數,函數也能夠再返回函數,並且,由於函數是對象,因此函數能夠擁有方法。 函數的不同凡響以外在於它們能夠被調用。
18,函數字面量 函數對象能夠經過函數字面量來建立: var add = function(a,b){ return a+ b;} 函數字面量包括4個部分。第一個部分是保留字function.第二個部分是函數名,它能夠被省略。函數能夠用它的名字來遞歸地調用 本身。若是沒有給函數命名,它就匿名函數。函數的第三個部分是包圍在圓括號中的一組參數。其中每一個參數用逗號分隔。這些名稱被定義爲函數中的變量。它們不像變通的變量那樣被初始化爲undefined,而是在該函數被調用時初始化爲實際提供的參數的值。第四部分是包圍在花括號中的一組語句。 函數字面量能夠出如今任何容許表達式的地方。函數也能夠被定義在其餘函數中。一個內部函數天然能夠訪問本身的參數和變量,同時它也能方便地訪問它被嵌套在其中的那個函數的參數與變量。經過函數字面量建立的函數對象包含一個鏈接到外部上下文的鏈接。這被稱爲「閉包」。它是JavaScript強大表現力的根基。
19.調用
調用一個函數將暫停當前函數的執行,傳遞控制權和參數給新函數,除了聲明時定義的形式參數,每一個函數接收兩個附加的參數:this和arguments.參數this在面向對象編程中很是重要,它的值取決於調用的模式。在javascript中有4種調用模式:方法調用,函數調用,構造器調用和apply調用。這此模式在如何初始化this上存在差別。 調用運算符是跟在任何產生一個函數值的表達式以後的一對圓括號,圓括號內可包含零個或多個用逗號隔開的表達式。每一個表達式產生一個參數值。每一個參數值被賦予函數聲明時定義的形式參數名。當實際參數的個數與形式參數的個數不匹配時不會致使運行時錯誤。若是實際參數值過多了,超出的參數值將被忽略,若是參數值過少,缺乏的值將會被替換爲undefined。對參數值不會進行類型檢查:任何類型的值均可以被傳遞給參數。 1》方法調用模式 當一個函數被保存爲對象的一個屬性時,咱們稱它爲一個方法。當一個方法被調用時,this被綁定到該對象。若是一個調用表達式包含一個屬性存取表達式(即一個.點表達式或[]下標表達式),那麼它被看成一個方法來調用。 //建立myObject,它有一個value屬性和一個increment方法 //increment方法接受一個可選的參數。若是參數不是數字,那麼默認使用數字1
var myObject = { value:0; increment:function(inc){ this.value += typeof inc==='number'?inc:1; }}; myObject.increment(); document.writelen(myObject.value);//1 myObject.increment(); document.writelen(myObject.value);//3 方法可使用this去訪問對象,因此它能從對象中取值或修改該對象。this到對象的綁定發生在調用的時候。這個「超級」遲綁定使得函數能夠對this高度複用。經過this可取得它們所屬對象的上下文的方法稱爲公共方法。
2》函數調用模式 當一個函數並不是一個對象的屬性時,那麼它被看成一個函數來調用: var sun = add(3,4); //sun的值爲7 當函數以此模式調用時,this被綁定到全局對象。這是語言設計上的一個錯誤。假若語言設計正確,當內部函數被調用時,this應該仍然綁定到外部函數的this變量。這個設計錯誤的後果是方法不能利用內部函數來幫助它工做,由於內部函數的this被綁定了錯誤的值,因此不能共享該方法對對象的訪問權。幸運的是,有一個很容易的解決方案:若是該方法定義一個變量並給它賦值爲this,那麼內部函數就能夠經過那個變量訪問到this.按照約定,我給那個變量命名爲that; //給myObject增長一個double方法 myObject.double = function(){ var that = this;//解決方法 var helper = function(){ that.value = add(that.value,that.value); }; helper();//以函數形式調用helper }; //以方法的形式調用double myObject.double(); document.writelen(myObject.getValue());//6
3》構造器調用模式 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()};//使人困惑 目的就是結合new前綴調用的函數就是構造器函數。按照約定,它們保存以大寫格式命名的變量裏。若是調用構造器函數時沒有在前面加上new ,可能發生很是糟糕的事情,即沒有編譯時警告,也沒有運行時警告,因此大寫給定很是重要。 不推薦使用這種形式的構造器函數
4》Apply調用模式
由於javascript是一門函數式的面積對象編程語言,因此函數能夠擁有方法。 apply方法讓咱們構建一個參數數組並用其去調用函數。它也容許咱們選擇this的值。apply方法接收兩個參數。第一個是將被綁定給this的值。第二個就是一個參數數組。 //構造一個包含兩個數字的數組,並將它們相加。 var array = {3,4}; var sun = 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」 20.參數 當函數被調用時,會獲得一個「免費」奉送的參數,那就是argumentss數組。經過它函數能夠訪問全部它被調用時傳遞給它的參數列表,包括那些沒有被分配給函數聲明時定義的形式參數的多餘參數。 arguments並非一個真正的數組。它只是一個「相似數組」的對象。arguments擁有一個length屬性,但它缺乏全部的數組方法。
21.返回 return語句可用來使函數提早返回。一個函數老是會返回一個值,若是沒有指定返回值,則返回undefined.
22.異常 var add = fucntion(a,b){ if(typeof a !=='number' || typeof b !=='number' ){ throw{ name:'TypeError', message:'add needs numbers'}; } return a + b; } throw語句中斷函數的執行,它應該拋出一個exception對象,該對象包含可識別異常類型的name屬性和一個描述性的message屬性。你也可添加其餘屬性。
22.給類型增長方法 javascript容許給語言的基本類型增長方法。經過Object.prototype添加方法來使得該方法對全部對象可用。這樣的方式對函數,數組,字符串,數字,正則表達式和布爾值一樣適用。舉例來講,咱們能夠經過給Function.prototype增長方法來使得該方法對全部函數可用
23.模塊 模塊是一個提供接口卻隱藏狀態與實現的函數或對象。經過使用函數去產生模塊,咱們幾乎能夠徹底摒棄全局變量的使用,從而緩解這個JavaScript的最爲糟糕的特性之一所帶來的影響。
24.級聯 有一些方法沒有返回值,如,一些設置或修改對象的某個狀態卻不返回任何值的方法就是典型的例子。若是咱們讓這些方法返回this而不是undefined,就能夠啓用級聯。在一個級聯中,咱們能夠在單獨一條語句中依次調用同一個對象的不少方法。
25.套用 套用容許咱們將函數與傳遞給它的參數相結合產生一個新的函數、 var add1 = add.curry(1); document.writeln(add1(6));//7 add1是把1傳遞給add函數的curry方法後建立的一個函數。add1函數把傳遞給它的參數的值加1.
*********************************************************** 繼承 js是一門弱類型語言,從不須要類型轉換,對象的起源是可有可無的。對於一個對象來講重要的是它能作什麼,而不是它從那裏來。