今天又回顧了一下js基礎,發現自己很渣,后來看了一下js函數啊的傳遞,那么js到底是按值傳遞還是按引用傳遞呢?(本人新手一枚,如果有什么不正確的地方,還請各位大神指點博正)
答案是肯定的,按值傳遞。
JS所有的函數參數的傳遞都是按值傳遞的,而引用類型傳遞的也是一個值(指向堆內存中的對象的指針副本),這里只說引用類型的傳遞。
先給大家看一個比較常見的,讓人誤解為引用傳遞的。
function changeObj(o){ o.name = "changeobj"; } var p = {}; changeObj(p); console.log(p.name);
看到這里大家肯定會認為這是按引用傳遞的啊,因為在函數內部添加了對象的屬性,在外邊也添加了。那么接下來再看這個例子。
var o = { name : 'tt' } var b = new Object(); b.name = 'b'; o = b; console.log(o.name);
上述代碼先創建了一個對象,然后將其賦值非變量o,接着又用構造器創建了一個對象,並修改其屬性,然后將其復制給變量對象o,然后訪問o的時候name被修改為b了。這里o的引用指向了新對象b;
再看下面這個例子大家就可以明白了
function quoteFn(obj){ var o = new Object(); obj = o; obj.name = "tony"; obj.age = 24; obj.sex = "Men"; } var person = { name : "miracle", age : 12 } console.log(person.name); console.log(person.age); console.log(person.sex);
在這個例子中先創建了person對象,並設定其name 屬性值為"miracle",age屬性值為 12。接着調用quoteFn()函數,並將person對象的值(這里說的是值,這個值是一個指向person對象的指針)傳遞給了參數obj。
然后在quoteFn函數中穿件了一個局部對象o,並將其復制給了參數obj,然后添加了新的幾個屬性。最后我們打印person.name 發現屬性沒有改變。如果是按引用傳遞,那么person應該指向新的對象啊。
所以綜上所述,JS參數的傳遞是按值傳遞的,引用類型傳遞是一個指針的副本。