今天在Stackoverflow上看到一個問題 - Overwriting variables inside functions in JS
很多人都搞不懂這個重要觀念,因此在幫忙解答後,決定PO在這裡和大家分享。
Q1:為何這樣寫 o 還是沒有變,請各位也一起思考看看:
很多人都搞不懂這個重要觀念,因此在幫忙解答後,決定PO在這裡和大家分享。
Q1:為何這樣寫 o 還是沒有變,請各位也一起思考看看:
var o = {x: 1};
function foo(){
// Overwrite var `o` with a string
arguments[0] = "string";
}
foo(o);
console.log(o); // Why is `o` still an object and not the string `string`?
var o = {x: 1};
function foo(a){
// Overwrite var `o` with a string
a = "string";
}
foo(o);
console.log(o); // Why is `o` still an object and not the string `string`?
答:這是因為在Javascript中,如果在function裡只改變物件"本身的值(value)",是不會改變原本物件的,意即上述做法不會更改變數o的值。但如果改變物件的內部,就會去永久改到原先的物件。因此以下方式改寫才能改變 o 的值:
var o = {x: 1};
function foo(){
// Overwrite var `o` with a string
arguments[0] = "string";
return arguments[0];}
o = foo(o);
console.log(o);//will be "string"
或
var o = {x: 1};
function foo(){
// Overwrite var `o` with a string
arguments[0].x = "string";
}
foo(o);
console.log(o);//will be {x: "string"}
Q2:下面這樣為什麼會變呢?
var a = ["a","b"];
function foo(){
// Overwrite var `o` with a string
arguments[0][0] = "c";}
foo(a)
console.log(a)//will be ["c", "b"]
如同先前提到的,這裡我們改變了array a 的 a[0] 屬性,因此當然就會變囉!
Q3:為甚麼又改不到a的值了?
Q3:為甚麼又改不到a的值了?
var a = ["a", "b"];
function foo(){
arguments[0] = "c";}
foo(a[0]);
console.log(a);//will be ["a", "b"]
如同先前強調的,這裡我們只是改變 a[0] 這個物件"本身的值",當然就不會改到array a 了!
沒有留言:
張貼留言