welcome to Cheeto's blog

0%

JavaScript核心篇:物件與純值

物件與純值

在 JavaScript 當中,純值是無法新增屬性的,只有物件型別可以新增屬性。

1
2
3
var newString = '小明家';
newString.name = '小明';
console.log(newString) // 小明家

因純值無法新增屬性,所以 newString 還是會維持本來的字串,不會做任何的修改。


現在我們來看第二個範例

1
2
3
4
var newString = new String('小明家');
newString.name = '小明家';

console.log(newString)

會顯示如下 ↓

包裹物件範例

因為包裹物件本來就會讓值轉為物件,所以 newString 自然就變為物件型別了,物件型別當然就能夠新增屬性啦!


再來我們看到陣列的範例

1
2
3
4
var newArray = [1, 2, 3];
newArray.name = '小明';
console.log(newArray);
console.log('typeof newArray: ' + typeof newArray);

會顯示如下 ↓

陣列型別

這樣應該就很清楚為什麼陣列可以新增屬性了吧!


最後讓我們看看 function(函式) 的範例

1
2
3
4
function callName() {
console.log('呼叫小明');
}
console.log(typeof callName); // function

這邊在 typeof 會出現 function 是因為函式其實算是物件型別下的一個子型別,所以 function 算是物件型別。

接下來我們設定屬性看看 ↓

1
2
3
4
5
function callName() {
console.log('呼叫小明');
}
callName.name = '小明';
console.dir(callName)

console.dir 是能夠在 console 裡面展開函式的一個作法。

函式型別範例1

這邊會發現為什麼 callName.name = '小明'; 沒有作用,因為函式本身的 name 是無法被修改的,這邊的 name 其實就是函式本身的名稱。

1
2
3
4
5
function callName() {
console.log('呼叫小明');
}
callName.ming = '小明';
console.dir(callName)

所以如果不是設定 name 為屬性的話,就可以順利的新增一個屬性了。 如下 ↓

函式型別範例2