var
a= 2;
varb= a;
//b是a的乙個副本
b++; a;
//2b;//3
基本資料型別是值複製
varc=[ 1,
2,3,
4];var
d= c;
//d是[1,2,3,4]的乙個引用
d.push(
5);c;
//[1,2,3,4,5]
d;//[1,2,3,4,5]
復合型別是引用複製
c和d分別指向乙個[1,2,3,4]的兩個不同的引用,c和d僅僅是指向[1,2,3,4],並非持有,所以更改的是同乙個值
由於引用指向的是指本身而非變數,所以乙個引用無法更改另乙個引用的指向
varc=[
1,2,
3];var
d= c;
c;//[1,2,3]
d;//[1,2,3]
d=[ 4,
5,6];
c;//[1,2,3]
d;//[4,5,6]
function
foo(
x);vara=[
1,2];
foo(
a);console.
log(
a);//[1,2,0]
我們向函式傳遞引數的時候,實際上是將引用a的乙個副本賦值給x,a仍然指向[1,2],在函式中我們可以通過引用x來改變陣列的值
但x=[7
,8]並不影響a的指向,所以a仍然指向[1,2,0]
我們不能通過x來更改a的指向,只能更改a和x共同指向的值
function
foo(
x);vara=[
1,2];
foo(
a);console.
log(
a);//[7,8,9]
如果要將標量基本型別值傳遞到函式中進行更改,需要將該值封裝到復合值中:
function
foo(
wrap);
varobj=;
foo(
obj);
obj.
a;//42
js語言精粹
1 typeof null object 所以不能通過typeof object 判斷為物件 a 判斷為null的,直接 null b 判斷物件 typeof object 因為null為假 2 prototype和 proto 的概念 prototype是函式的乙個屬性 每個函式都有乙個proto...
js語言精粹 繼承
當乙個函式物件被建立時,function構造器產生的函式物件會執行類似這樣的 this.prototype 當採用構造器呼叫模式,即使用new字首去呼叫乙個函式時,這將修改函式執行的方式。如果new運算子是乙個方法而不是乙個運算子,它可能會像這樣執行 function.method new func...
js 值和引用
js對值和引用的賦值 傳遞在語法上沒有區別,完全根據值得型別決定 簡單值 即標量基本型別值 總是通過值複製的方式來賦值 傳遞,包括null,undefined,字串,數字,布林值和es6中的symbol。復合值 物件 包括陣列和封裝物件 和函式,則總是通過引用複製的方式來賦值 傳遞。簡單值var a...