iT邦幫忙

2021 iThome 鐵人賽

DAY 12
1
自我挑戰組

JavaScript 核心觀念系列 第 12

【Day12】原始型別及物件型別

JavaScript 中型別主要分為原始型別和物件型別兩種

原始型別

原始型別中包含七種型別,

而這些型別有各自的方法,

這些方法可以藉由包裹物件來查看,

其中只有 undefinednull 沒有包裹物件,

每個型別所對應的包裹物件如下表所示:

型別 包裹物件
字串(String) new String()
數字(Numnber) new Number()
布林(Boolean) new Boolean()
未定義(Undefined) -
空(Null) -
整數數值(Bigint) BigInt()
(Symbol) Symbol()

範例:

var a, b, c;
console.log(typeof a);  // undefined
a = 0;
b = 'weiwei';
c = true;
console.log(typeof a);  // number
console.log(typeof b);  // string
console.log(typeof c);  // boolean

從範例可以得知變數在宣告後且尚未賦予值前型別為 undefined

隨後賦予不同型別的值,因此使用 typeof 分別會顯示不同的結果

var b = null;
console.log(typeof b);  // object

那麼為何 null 的型別為 object 而不是 null 呢?

因為這是 JavaScript 中的一個錯誤,而現在也不能修正這個錯誤,

原因是有許多網站利用這種錯誤來完成的,

一旦修正許多網站都會出錯,所以將錯誤保留至今

console.log(typeof c);  // undefined

我們看到變數 c 沒有被定義為何使用 typeof 時不會出錯呢?

因為這是 typeof 的針對未定義變數的保護措施,

因此使用 typeof 對未定義變數取型別時,會顯示 undefined

var a = 'weiwei';
console.log(a.toUpperCase());  // WEIWEI
console.log(a.length);  // 5

// 使用包裹物件查尋 a 有哪些方法可以使用
var b = new String(a);
console.log(b);
console.log(typeof b);  // object

當我們要查看一個變數有哪些方法使用時,可以使用包裹物件來尋找


我們點開 String 再點開 Prototype 後,

可以看到裡面有許多方法,而範例中使用的 toUpperCase()length 也包含在內,

當我們使用包裹物件宣告變數時,該變數的型別為物件型別

物件型別

原始型別以外的型別都是物件型別,EX:物件、陣列、函式...

範例:

var a = {};
var b = [];
var c = function(){};

console.log(typeof a);  // object
console.log(typeof b);  // object
console.log(typeof c);  // function

我們會看見 c 的型別為 function

function 為物件的子型別,

我們可以使用 instanceof 來確認函式是否為物件的子型別

var c = function(){};

console.log(typeof c);  // function

console.log(c instanceof Object);  // true

結果為 true,因此函式也是物件的一種

以上就是今天的內容,我們明天見!!


上一篇
【Day11】動態型別
下一篇
【Day13】運算子(Operator)
系列文
JavaScript 核心觀念30

尚未有邦友留言

立即登入留言