1. 程式人生 > >JavaScript 整理筆記(三)

JavaScript 整理筆記(三)

1.1 語法

1.1.6 表示式

表示式後面一般跟著:
    一個運算子 與 另一個表示式
    三元運算子
    函式呼叫
    屬性提取表示式

運算子優先順序 從上往下優先順序由高到低 
    . [] ()                          - 提取屬性與呼叫函式
    delete new typeof + - !          - 一元運算子
    * / %                            - 乘法 除法 求餘
    + -                              - 加法/連線 減法
    >= <= > <                        - 大於等於 小於等於 大於 小於
    === !==                          - 全等於 不去等於
    &&                               - 邏輯與
    ||                               - 邏輯或
    ?:                               - 三元運算子

typeof 運算子產生的值只有 'number'、'string'、'boolean'、'undefined'、'function'和'object'這六個值。
其中 typeof null === 'object', typeof [] === 'object',這是不對的。
通常用函式來判斷:
    function DataType(obj, type) {
        return Object.prototype.toString.call(obj) === "[object " + type + "]" ? true : false;
    }

+ 運算子 可以進行加法運算或字串連線。加法時確保兩個運算數都是數字。否則會進行隱式轉換。
例:
    '0' + 1 === '01'; // true
    1 + '0' === '10'; // true
    1 + 0 === 1; // true

&& 運算子 邏輯與 真&&真為真,真&&假為假,假&&真為假,假&&假為假。
例1:
    var a = 0;
    a && a++; // false
    a; // 0
例2: 
    var b = 1;
    b && b++; // true
    b; // 2
第一個運算數(或表示式)如果為false,則不執行第二個運算數(或表示式)。
第一個運算數(或表示式)如果為true,則執行第二個運算數(或表示式)。

|| 運算子 邏輯或 真||真為真,真||假為真,假||真為真,假||假為假。
例1:
    var c = 0;
    c || c++; // true
    c; // 1
例2: 
    var d = 1;
    d || d++; // true
    d; // 1
第一個運算數(或表示式)如果為false,則執行第二個運算數(或表示式)。
第一個運算數(或表示式)如果為true,則不執行第二個運算數(或表示式)。

! 運算子 邏輯非 !真為假,!假為真。
例:
    !true === false; // true
    !false === true; // true
    !undefined === true; // true
    !null === true; // true
    !"" === true; // true
    !0 === ture; // true
    !NaN === true; // true

1.2 物件

1.2.1 物件字面量

建立新物件值的表示法。
例:
    var obj = {};
    var obj_2 = {
        name: "Ama_zhe",
        "": "hello world"
    };
    obj_2[""] === "hello world"; // true
屬性名可以是包括空字串的任何字串。屬性名如果是合法的JavaScript識別符號
並且不是保留字,則屬性名不需要引號。
例:
    var obj_3 = {
        value: 1,
        "first-name": "fan"
    }

1.2.3 檢索

檢索物件裡的值
優先使用.語法,其次是[]語法。如果檢索的屬性名是一個表示式來表示則使用[]來獲取。
檢索不存在的屬性會返回undefined。
可以使用||運算子來預設填充:
例:
    var hello = obj_3.status || "0"; // "0"
如果從undefined中獲取屬性會報錯,用&&來提前判斷
例:
    var hi = obj_3.status && obj_3.status.value; // undefined

1.2.4 更新

物件的屬性名如果已經存在,再對物件的屬性名賦值時會更新其屬性的值。
例:
    obj_3.value = 2;
    obj_3.value === 2; // true
如果物件之前沒有該屬性名,則會給物件新增該屬性。
例:
    obj_3.name = "Stafan";
    obj_3; // { value: 2, "first-name": "fan", name: "Stafan" }

1.2.5 引用

物件是通過引用來傳遞值。它們永遠不會被複制。
var a = obj_3;
a.status = "1";
var b = obj_3.status;
b; // "1" a和obj_3指向同一個物件引用,a.status相當於給obj_3添加了status屬性,所有b的值為"1"。
var c = {}, d = {}, e = {}; 分別引用不同的空物件
c === d; // false
c === e; // false
d === e; // false
var f = g = h = {}; 都引用同一個空物件
f === g; // true
f === h; // true
g === h; // true

1.2.6 原型

每個物件都連線到一個原型物件。所有通過字面量建立的物件都連線到 Object.prototype。
if(typeof Object.create != "function"){
    Object.create = function(obj){
        var Fn = function(){};
        Fn.prototype = obj;
        return new Fn();
    }
}
var obj = {
    name: "a",
    value: "100"
};
var obj2 = Object.create(obj);
obj2.name = "b";     該物件改變是不會影響到該物件的原型
obj2.value = "200";  該物件改變是不會影響到該物件的原型
obj.name; // "a"
obj.value; // "100"
obj2.name; // "b"    該物件改變是不會影響到該物件的原型
obj2.value; // "200" 該物件改變是不會影響到該物件的原型

但是在檢索物件的屬性時,如果該物件沒有要檢索的屬性,則會從原型物件中去獲取。如果物件及
其原型鏈中都沒有要獲取的屬性,則返回 undefined。
obj.data = "data";
obj2.data; // "data"
obj2.opt; // undefined

1.2.7 反射

檢查物件的屬性的型別:
    var obj3 = {
        name: "Ama_zhe",
        number: 2,
        obj: {}
    };
    typeof obj3.name === "string"; // true
    typeof obj3.number === "number"; // true
    typeof obj3.obj === "object"; // true
    typeof obj3.aaa === "undefined"; // true

檢查原型鏈中的任何屬性都會返回 "funtion":
    typeof obj3.toString === "function"; // true
    typeof obj3.constructor === "function"; // true
    typeof obj3.valueOf === "function"; // true

hasOwnProperty 會檢查物件獨有的屬性,而不會檢查原型鏈:
    obj3.hasOwnProperty(name) === true; // true
    obj3.hasOwnProperty(toString) === false; // true

1.2.8 列舉

for...in 會列舉物件中的所有的屬性名(包括原型鏈中的屬性),用hasOwnProperty 和
typeof 來過濾掉不想要的屬性或函式。
屬性名出現的順序是不確定的,如果想要屬性以特定的順序出現,最好避免使用for...in。

1.2.9 刪除

delete 運算子用來刪除物件的屬性。不會刪除原型鏈中的同名屬性。
例1:
    var obj6 = {
        a: 1,
        b: 2
    };
    delete obj6.a;
    obj6; // { b: 2 }
例2:
    var obj = {
        a: 1,
        b: 2,
        name: "seven"
    };
    var Fn = function(){};
    Fn.prototype = obj;
    var obj_n = new Fn();
    obj_n.name = "eight";
    obj_n.name; // "eight"
    delete obj_n.name;
    obj_n.name; // "seven"

1.2.10 減少全域性變數汙染

最小化全域性變數的方法就是隻建立唯一的一個全域性變數:
    var GLOBAL_VARIABLE = {};
定義其他的變數為該全域性變數的屬性:
    GLOBAL_VARIABLE.API = {
        common_link: ""
    };
    GLOBAL_VARIABLE.initFn = {
        add: function(){
            var sum = 0;
            Array.apply(this, arguments).map(function(a){
                sum += a;
            });
            return sum;
        }
    };

——–內容繫個人整理,如有錯誤,歡迎指出。謝謝!——–