ecmascript變數包含兩種不同的型別的資料原始值和引用值。
原始值就是最簡單的資料(undefined,null,boolean,number,string,symbol)。
引用值是由多個值構成的物件(object)。
儲存原始值的變數是按值訪問的,因為我們操作的就是儲存在變數中的實際值。
引用值是儲存在記憶體中的物件,與其它的語言不相同的是,js不允許直接訪問記憶體位置,因此也就不能直接操作物件所在的記憶體空間。在操作物件的時候,實際操作的是對該物件的引用而非實際的物件本身。因此,儲存引用值的變數是按引用訪問的。
ecmascript中所有的函式的引數都是按值傳遞的。這就意味著函式外的值會被複製到函式內部的引數中,就如同乙個變數複製到另乙個變數中一樣。
來乙個demo:
function
demo
( number )
let count =20;
let result =
demo
( count )
;//函式內部將操作完之後的值返回,用result接收
//如果說變數是按引用傳遞,則count的值就不會是20,而是進過number += 10之後成為30;
console.
log( count )
;//20
console.
log( result )
;//30
接下來建立乙個物件:
function
setstudent
( object )
let student =
newobject()
;setstudent
( student )
; console.
log( student.score )
;//輸出:100
/* 不是所有的函式的形參都是按值傳遞的嗎?怎麼這裡好像是按引用傳遞的了?
這是因為在函式的內部,student和object都指向同乙個物件,及時物件是按值傳入函式的,
object也會通過引用訪問物件。當函式內部給object增添了score屬性,函式外部的物件也會
反映這個變化,因為object指向的物件儲存在全域性作用域的堆記憶體上。
*/
接下來乙個案列,你就會清楚其中的門道了。
function
setstudent
( object )
let student =
newobject()
;setstudent
( student )
; console.
log( student.score )
;// 100;
/* why ? ? ? ?
當引數object傳入setstudent()時,score屬性被設定為100,然後變數object被設定為新物件,
且score屬性為99,如過student是按引用傳遞的,那麼student應該將指標改為指向score屬性為
99的物件,但是score的值任然是100;其中object = new object()所產生的物件在
函式結束的時候就被銷毀了。
*/
ECMAScript中變數的解構賦值
ecmascript中變數的解構賦值 es6 允許從陣列和物件中提取值,對變數進行賦值。解構賦值的基本用法 1 陣列的解構賦值 let a,b,c 1,2,3 console.log a 1 console.log b 2 console.log c 3 2 物件的解構賦值 let console....
ECMA Script 6 變數的解構賦值
1 陣列的結構和賦值 es6 允許按照一定模式,從陣列和物件中提取值,對變數進行賦值,這被稱為解構 2 物件等可以這麼賦值 3 函式引數的解構賦值 function add x,y add 1,2 3 基本用途 交換變數 a,b b,a 函式返回多個值 類似於陣列 返回乙個陣列 function e...
ECMAScript6 2 變數的解構賦值
1 對陣列變數賦值 let foo,bar baz 1,2 3 foo 1 bar 2 baz 3 let third1 foo bar baz third1 baz let aa,bb 1,2,3 aa 1 bb 3 let head,tail 1,2,3,4 head 1 tail 2,3,4 ...