JavaScript 物件字面量(object literal)

風靈使發表於2019-04-20

什麼是字面量

用來為變數賦值時的常數量

物件字面量

物件字面值是封閉在花括號對({})中的一個物件的零個或多個”屬性名:值”列表。

var person={ 
    name:"Jack", 
    age:10,
    5:true  
};
  • 在這個例子中,左邊的花括號({)表示物件字面量的開始,因為它出現在了表示式上下文(expression context)中。
  • JavaScript 中的表示式上下文(expression context)指的是能夠返回一個值(表示式)。
  • 賦值操作符(=)表示後面是一個值,所以左花括號在這裡表示一個表示式的開始。
  • 同樣的花括號,如果出現在一個語句上下文(statement context)中,例如跟在 if語句條件的後面,則表示一個語句塊的開始。
  • 例子中定義了name屬性,之後是一個冒號,再後面是這個屬性的值(name:"Jack")。在物件字面量中,使用逗號來分隔不同的屬性,因此”Jack”後面是一個逗號。但是age屬性的值 10 的後面不能新增逗號,因為 age 是這個物件的最後一個屬性。在最後一個屬性後面新增逗號,會在 IE7及更早版本和Opera 中導致錯誤。 不要忘記結束大括號右邊的(

物件字面量的值可以是任何資料型別包括陣列字面量,函式,巢狀的物件字面量

var Swapper = {
    // 陣列字面量(用逗號分隔,所有都要加引號)
    images: ["smile.gif", "grim.gif", "frown.gif", "bomb.gif"],
    pos: { //巢狀物件字面量
        x: 40,
        y: 300
    },
    onSwap: function() { //函式
    }
};
  • 如果有任何的語法規則被打破,如缺少逗號或冒號或大括號,將會觸發JavaScript錯誤。
  • 瀏覽器的錯誤資訊在指出物件字面量語法錯誤的位置一般有幫助,但他們不一定會在指出錯誤的性質完全準確。

在使用物件字面量時,屬性名也可以用字串

var person={
    "name":"Jack",
    "age":29,
    5:true
};

  • 上述例子會建立一個物件,包含三個屬性,但這裡的數值屬性名會自動轉換為字串。
  • 在通過物件字面量定義物件時,實際上不會呼叫Object建構函式(Firefox 2及更早版本會呼叫Object建構函式;但Firefox3之後就不會了)
  • 這是因為字面量法建立物件強調該物件僅是一個可變的hash對映,而不是從物件中提取的屬性或方法。
    建立物件的兩種方法:
    使用字面量方法建立物件:var student = {name: "張三"};
    使用內建建構函式建立物件:var student = new Object(); student.name = "張三"
    應該儘量使用字面量發建立物件,其顯著優點在於它只需要輸入更少的字元,除此之外,還有幾點原因:選擇字面量法建立物件強調該物件僅是一個可變的hash對映,而不是從物件中提取的屬性或方法。
    與使用Object建構函式相比,使用字面量好處在於它並沒有作用域解析。因為可能當以同樣的名字建立一個區域性函式,直譯器需要從棧中呼叫Object(0的位置開始一直向上查詢作用域鏈,直到發現全域性Object建構函式。)
    建構函式Object僅接受一個引數,並且還依賴傳遞的值,該Object()可能會委派另一個內建函式來建立物件,並且返回了一個並非期望的不同物件。(還不確定這句話是否是對的,如果不對希望廣大網友幫忙改正)如將數字、字串、布林值當做引數傳遞給Object建構函式,其結果是獲得了以不同建構函式所建立的物件,例如:
    var oschina = new Object(1); ochina.constructor
    ochina.constructorNumber;傳遞的值是動態的,直到執行時才確定其型別,這種行為會導致意想不到的結果。
  • 雖然可以使用前面介紹的任何一種方法來定義物件,但開發人員更青睞物件字面量語法,因為這種語法要求的程式碼量少,而且能夠給人封裝資料的感覺。實際上,物件字面量也是向函式傳遞大量可選引數的首選方式。

相關文章