今天又回顧了一下js基礎,發現本身很渣,後來看了一下js函數啊的傳遞,那麼js究竟是按值傳遞仍是按引用傳遞呢?(本人新手一枚,若是有什麼不正確的地方,還請各位大神指點博正)javascript
答案是確定的,按值傳遞。java
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;blog
再看下面這個例子你們就能夠明白了ip
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應該指向新的對象啊。io
因此綜上所述,JS參數的傳遞是按值傳遞的,引用類型傳遞是一個指針的副本。console