在 JavaScript 中除了 原始型別 以外的一切都是物件
物件還有分成以下數種內建的子型別:
其中String
、Number
、Boolean
有對應的原始型別
利用 new
來創建 內建物件
var myStringObj = new String('hello world');
console.log(myStringObj); // String {"hello world"}
var myNumberObj = new Number(123);
console.log(myNumberObj); // Number {123}
var myBooleanObj = new Boolean(true); // Boolean {true}
console.log(myBooleanObj);
var myObject = new Object();
console.log(myObject); // {}
var myArray = new Array();
console.log(myArray); // []
var myDate = new Date();
console.log(myDate); // Wed Dec 22 2017 21:47:10 GMT+0800
利用 字面值 ( Literals, 註1 ) 創建
適用於 Object
、Array
、Function
、RegExp
。
Note:用 字面值方式 創建的物件與 new
出來的物件是一樣的。
var myLiteralObject = {};
console.log(myLiteralObject); // {}
var myLiteralArray = [];
console.log(myLiteralArray); // []
利用 typeof()
可以查看 變數/屬性/值 的內容為何種型別
承接上一個範例:
typeof myStringObj; // "object"
typeof myNumberObj; // "object"
typeof myBooleanObj; // "object"
typeof myArray; // "object"
我們可以看到,String
,Number
、Boolean
的型別都是物件,而非原始型別。
但要怎麼知道物件屬於哪個子型別呢?
利用 Object.prototype.toString.call()
查看所屬的子型別:
會回傳 [型別 子型別]
。 call
與 prototype
的詳細內容會在之後介紹。
Object.prototype.toString.call(myStringObj); // "[object String]"
Object.prototype.toString.call(myNumberObj); // "[object Number]"
Object.prototype.toString.call(myBooleanObj); // "[object Boolean]"
Object.prototype.toString.call(myArray); // "[object Array]"
利用 instanceOf
可以查看某物件是不是屬於特定的子型別
會回傳 boolean,代表是不是屬於該子型別。
myStringObj instanceOf String; // "true"
myStringObj instanceOf Number; // "false"
myObject instanceOf Object // "true"
myLiteralObject instanceOf Object // "true"
myArray instanceOf Array // "true"
myLiteralArray instanceOf Array // "true"
valueOf()
可以取得物件的原始內容
myStringObj.valueOf(); // "hello world"
myNumberObj.valueOf(); // 123
myBooleanObj.valueOf(); // true
myArray.valueOf(); // []
物件允許寫入屬性,原始型別則無法
原始型別無法寫入屬性請參考上一篇。
'use strict';
// test read property
myStringObj.length; // 11
// test write property
myStringObj.myProperty = 'testWrite';
myStringObj.myProperty; // "testWrite"
new
對 Object
、Array
、Function
、RegExp
來說,用 字面值 與用 new
產生物件結果是一樣的。
對 String
、Number
、Boolean
來說,字面值宣告會產生原始型別,但因為 必要時會自動強制轉型成物件型別的特性,所以在使用上與其物件型別並無不同。
也就是說,除了 Date
、Error
這兩個型別以外必須使用 new
才能創建以外,其餘的內建物件在大部分的時候都是可以用 字面值 替代 new
的。
為了簡短、直觀、效能考量 ( 因為不需要 new
),請盡量使用字面值宣告物件。
今天概述了 JavaScript 的內建物件 (Built-in Objects),主要討論到的內容有:
new
來創建 內建物件typeOf
Object.prototype.toString.call()
可以查看instanceOf
會回傳 boolean,可以用來查看某物件是不是屬於特定的子型別valueOf()
可以取出物件的原始內容由於我們知道,用 字面值 方式與用 new
產生出的物件,在使用上其實並無不同,因此在實作上為了簡短、直觀、效能考量,我們應該盡量使用 字面值來取代 new
方式以提高可讀性。
以字面的方式來表示特定型別的固定值
在 JavaScript 中,我們可以用字面值來表示以下幾種型別:
'hello world'; // string literal
true; // boolean literal
123; // number literal
123.4; // float number literal
null // null literal
{}; // object literal
[]; // array literal
/ab+c/; // regExp literal
如範例所示,我們可以用字面值來表示 undefined
以外的原始型別,而物件型別如 Object
、Array
、RegExp
也有其對應的字面值。
https://www.w3schools.com/js/js_arrays.asp
https://www.w3schools.com/js/js_object_definition.asp
https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Guide/Grammar_and_types