以前看《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" 时)!对象