[js step] 都是物件

JavaScript 的變數都有物件的型態跟特性,什麼型態都可以當成物件來用。物件是指?可以擁有資料跟方法的變數。

例如這個 obj 物件。

var obj = {};
obj.data = 1;
obj.method = function() { console.log("data = " + this.data); }
obj.method();
//print 1

而其他也是物件的型態有

陣列

var arr = [1, 2, 3];
arr.data = 1;
arr.method = function() { console.log("data = " + this.data); }
arr.method();
//data = 1
console.log(arr);
//[1, 2, 3]
console.log(arr[0]);
//1
console.log((null, arr));
//[1, 2, 3, data: 1, method: function]
 1

函式

var fn = function() { return "hello"; };
fn.data = 1;
fn.method = function() { console.log("data = " + this.data); }
fn.method();
//data = 1
console.log(fn);
//function () { console.log("hello"); }
console.log(fn());
//hello

陣列跟函式都有他原本的功能,但是也帶有物件的特性。就連原生型態數字、布林、字串也都有物件的版本,可以用物件的方式處理。

var n = new Number(100);
n.data = 1;
n.method = function() { console.log("data = " + this.data); }
n.method();
//data = 1
console.log(n);
//Number {data: 1, method: function}
console.log(n+1);
//101

如果沒看到建構 n 的方法,會不會把 n 認作一個物件勒~所以有一些函式可以用來判別變數的型態

n instanceof Number
//true
typeof n
// object
type of 1
// number
n.valueOf();
//100
n.toString();
//"100"

所以複寫 valueOf 跟 toString 可以讓一般物件運作起來像是數字或字串,js 會在執行運算時轉型來決定呼叫哪個函式。

var what = {valueOf: function() { return 100;}};
console.log(what+50);
//150

what = {toString: function() { return "I am what"; }}
console.log("Who are you. "+ what); 
//Who are you. I am whatwha