文章加密

;

2019年3月7日 星期四

by reference介紹,物件介紹與使用

https://pjchender.blogspot.com/2016/03/javascriptby-referenceby-value.html

當我們在建立 primitive type BooleanStringNumbernullundefined的變數時,假設我把a 指定成一個 primitive type 的時候,a 會在記憶體中存在一個自己的位置(假設叫做0x001)。這時候,當我指定另一個變數 b,它的值等同於 a 的時候,b 實際上會建立另一個獨立的記憶體位置(假設叫做0x002),接著再把 a 的值存在這個獨立的記憶體位置。也就是說, a 和 b 其實是存在於兩個不同的記憶體位置,因此彼此並不會乎相干擾影響,這種情況,我們就稱為 ++By Value++ ,而這種情形會發生在 primitive type 的變數。

當我將變數 a 設立成一個ObjectObjectArrayFunction時,這時候,一樣會在記憶體中給它一個位置(假設叫做0x001);但是當我建立一個變數 b,並且把變數 b 的值等同於 a 時,這時候並不會再給它一個新的位置,而是一樣指定到物件 a 的位置(即0x001),實際上是不會有新的東西被建立,變數 a 和 b 都會被指稱到相同的位置(即0x001),因此,當 a 的值改變的時候 b 的值也會改變,因為它們實際上是指稱到相同的位置,這種情形我們就稱為 ++By Reference++,這樣情況會發生在 Object 和 Function 這種變數

一般來說,Primitive type 是 by value,而 Object 和 Function 則是 by reference,但有例外的情況。

以下是範例程式

// by value (primitives)
var a = 3;
var b;

b = a;
a = 2;
console.log(a); //2
console.log(b); //3


// by reference (all objects (including functions))
var c = {greeting : 'Hello'};
var d;
d = c;

console.log(c); //Hello
console.log(d); //Hello


c.greeting = "Hola";

console.log(c); //Hola
console.log(d); //Hola

// by reference (even as parameters)
function changeGreeting(obj){
obj.greeting = 'Hi'; //mutate
}

changeGreeting(d);
console.log(c); //Hi
console.log(d); //Hi


// equal operator sets up new memory space (new address)
c = {greeting: "Hola"};
console.log(c); //Hola,這是因為c = {greeting: "Hola"};新建了一個物件,新建的物件在記憶
體中存放的位子就跟之前的不同
console.log(d); //Hi


建立物件的方法有兩種
1. [ ] 在 JavaScript 中被稱做 Computed Member Access
例:
let a = new Object();
a['firstname'] = 'Lin' ;
b['lastname'] = 'david';
→這種可以用變數取代屬性名稱(ex: firstname, lastname)

2. .在 JavaScript 中被稱做 Member Access
例:
a.address = new Object();
a.address.country = 'taiwan';
a.address.city = 'taipei';
a.address.locate = 101;

並且,. 和 [ ] 是可以交替使用的。也就是說,Member Access建立的object可以用Computed Member Access的方式顯示(即console.log(a['address']['country']) // taiwin),反之也可。

建議盡量使用 . 做為建立物件和呼叫物件的方法,這樣比較乾淨簡潔,在 debug 的時候也比較容易。

不建議用 new Object 的方式,而建議用object literal, 即{}建立物件。可以想成,{}和new Object是相同的意思
→上面的例子用{}寫出如下:
let a = {}
let a ={  
  firstname:'Lin',
  lastname:'david'
}
a.address={
  country:'taiwan',
  city:'taipei',
  locate:101
}

或是寫在一起如下
let a={
  firstname:'Lin',
  lastname:'david',
  address:{
    country:'taiwan',
    city:'taipei',

    locate:101
  }
}

搭配函式使用
function sayhi(b){
  console.log("hi, "+b.lastname)
}
sayhi(a);  // hi, david

→也可以直接在呼叫函式時建立物件,這種方式被稱作 creating object on the fly:
sayhi({fistname:'Lin', lastname:'david'})

對物件的結論:
不論你使用的是new Object、" . "、或者直接用"{ }"來建立物件,其實在JavaScript轉譯之後,本質上做的都是同樣的事。它都會將這個物件建立在記憶體中,並建立該物件的屬性(property)和方法(method)在記憶體中

沒有留言:

張貼留言