以前看《javascript高級程序設計》時就遇到過一個問題,就是函數傳參的問題,書上說是按值傳遞,而非按引用傳遞。不少人都會認爲js裏面有兩種傳值方式,一種是複製,另外一種是數組、對象等按引用傳遞,後來看到知乎上面一道題後才發現不是那麼簡單。我我的理解就是,js中所有是按值傳遞。javascript
這個是高級程序設計裏面的例子:
也許不少人會迷惑,person.name不應是Greg嗎?爲何輸出Nicholas?java
由於setName函數裏面其實至關於把person對象的地址複製了一份,而後賦值給了obj,可是obj=new Object()這句將另一個地址賦值給了obj,因此下面obj無論怎麼修改都不會影響person。數組
這裏還有另一個例子:
var a=[1,2,3]; var b=a; a=[1,2,3,4]; console.log(b); //1,2,3
按照正常的想法,a和b是引用的同一個數組對象,當a改變的時候,b也會改變,但是這裏面b卻沒有改變,難道這個是單純的複製a的值給b?函數
這個和上面的例子差很少,也是把a指向對象的地址複製給了b,而後a=[4,5,6]至關於a指向了另一個數組,因此b還指向原來的數組,並不會發生變化。設計
這裏還有一個例子:
var a=[1,2,3]; var b=a; a.push(4); console.log(b); //[1,2,3,4]
這裏面由於a改變的仍是原來數組,因此b也會跟着變化。code
最後奉上一道本身筆試作錯的題。
var test1=new Boolean("false"); console.log(test1); //true
注意:若是邏輯對象無初始值或者其值爲 0、-0、null、""、false、undefined 或者 NaN,那麼對象的值爲 false。不然,其值爲 true(即便當自變量爲字符串 "false" 時)!對象