JS權威指南閱讀筆記

詞法結構

  • unicode以\u爲前綴,其後跟隨4個十六進制數
  • 標識符必須以字母、下劃線或$開始,後續字符能夠是字母、數字、下劃線或$。

類型、值和變量

  • js數據類型分爲兩類:原始類型和對象類型
  • 原始類型包括:Number,String和Boolean
  • 兩個特殊原始值:null和undefined
  • js解釋器有本身的內存管理機制,能夠自動對內存進行垃圾回收(Garbage Collection)。
  • js整數範圍是 -2^53 ~ 2^53
  • 無窮大能夠用Infinity表示
  • Infinity = Number.POSITIVE_INFINITY = 1/0 = Number.MAX_VALUE + 1
  • 非數字值用NaN
  • NaN = Number.NaN = 0/0 = Number.MIN_VALUE/2
  • -NaN和任何值都不相等,包括本身。要使用x!=x來判斷x是不是NaN或者使用isNaN()
  • 二進制浮點數表示法不能精確表示相似0.1這樣的數字:
var x = .3 - .2;
var y = .2 - .1;
x == y; // false
  • String是一組16位值組成的不可變的有序序列
  • undefined,null,0,-0,NaN,"" 都會被轉換成false,其餘值包括對象(數組)會轉換成true
  • null執行typeof運算,結果返回"object"
  • 兩個單獨的對象永不相等,兩個單獨的數組永不相等:
var o = {x:1},p = {x:1};
o == p; // => false
o === p; // => false
var a = [], b = [];
a == b; // => false
a === b; // => false
  • Javascript類型轉換
轉換爲 - - -
- 字符串 數字 布爾值 對象
undefined "undefined" NaN false throws TypeError
null "null" 0 false throws TypeError
true "true" 1 - new Boolean(true)
false "false" 0 - new Boolean(false)
"" - 0 false new String("")
"1.2" - 1.2 true new String("1.2")
"sevens" - NanN true new String("sevens")
0 "0" - false new Number(0)
-0 "0" - false new Number(-0)
NaN "NaN" - false new Number(NaN)
1 "1" - true new Number(1)
{} 參考3.8.3節 參考3.8.3節 true  
[] "" 0 true  
[9] "9" 9 true  
['a'] 使用join方法 NaN true  
function(){} 參考3.8.3節 NaN true  
  • 關於==相等性判斷
null == undefined; // true
"0" == 0; //比較前字符串轉換成數字 true
0 == false; //布爾轉換成數字 true
"0" == false; //字符串和布爾值都轉換成數字 true

- 對日期對象進行轉換
````javascript
var now = new Date();
typeof (now + 1); // => string , "+"將日期轉換成了字符串
typeof (now - 1); // => Number: "-" 將對象轉換成了數字

聲明提早

var scope = "global";
function f(){
    console.log(scope); // undefined
    var scope = "local";
    console.log(scope); // local
}

因爲局部變量在整個函數體始終都有定義的,就是說,在函數體內局部變量遮蓋了同名全局變量。可是!只有在執行到var的時候纔會被賦值。所以,上面的代碼至關於:javascript

var scope = "global";
function f(){
    var scope;
    console.log(scope); // undefined
    scope = "local";
    console.log(scope); // local
}
  • 做用域鏈 *

表達式和運算符

  • 2 + null => 2
  • 2 + undefined => NaN
  • "==" 會將左右兩邊值若是不存在字符串則先轉換數字類型再比較,轉換圖看上面。

語句

  • 若是var語句出如今函數體內,那麼它定義的是一個局部變量,做用域是這個函數。若是在頂層代碼中使用var語句,它聲明的是全局變量,在整個javascript程序中都是可見的。var聲明的全局變量是沒法經過delete刪除的。
  • 由於for/in循環中variable的值能夠當作賦值表達式的左值,能夠利用for..in..快速將一個對象的屬性key複製到數組中:
var o = {x:1,y:2,z:3};
var a = [],i = 0;
for(a[i++] in o) ;
  • "use strict" 做用在使用指定的做用域

對象

  • 模擬繼承,經過原型繼承建立一個新對象
function inherit(p) {
    if (p == null) throw TypeError();
    //若是Object.create()存在,則直接使用它
    if (Object.create)
        return Object.create(p)
    //不然進一步檢測
    var t = typeof p;
    if (t !== "object" && t !== 'function')
        throw TypeError();
    //定義一個空構造函數
    function f() {}; 
    //將其原型屬性設置爲p
    f.prototype = p;
    return new f();
}
  • inherit()函數的其中一個用途就是防止庫函數無心間修改那些不受咱們控制的對象。不是將對象直接做爲參數傳入函數,而是將它的繼承對象傳入函數。
  • var len = book && book.subtitle && book.subtitle.length
  • 經過in,hasOwnProperty()來判斷目標對象是否存在目標屬性
  • 數據屬性的描述符對象的屬性有value,writable,enumerable和configurable.
  • 複製屬性的繼承函數
Object.defineProperty(Object.prototype,"extend",
    {
        writable: true,
        enumerable: false,
        configurable: true,
        value: function (o){
            //獲得全部自有屬性,包括不可枚舉屬性
            var names = Object.getOwnPropertyNames(o);
            //遍歷
            for (var i = 0; i < names.length; i++){
                if (names[i] in this) continue;
                var desc = Object.getOwnPropertyDescriptor(o,names[i]);
                Object.defineProperty(this,names[i],desc);
            }
        }
    }
);

To be Continue.. java

相關文章
相關標籤/搜索