再谈js传值和传址

js的传值和传址仍是真绕,前回文说道web

1.值类型是传值的数组

2.对象和数组是传址的函数

这两点经过例子的到了证明spa

然而还有一种状况没有讨论code

 

对象

 

函数的参数的传值和传址blog

经过实验,在函数中用一个新对象去覆盖传入的对象,则相似于传值的效果,原数据没法获得新值io

var s = {value:1}
var s1 = {value:2}

function setValue(arg){
    arg = s1
}

setValue(s)


console.log(s.value)
console.log(s1.value)

这个例子的结果是 s.value = 1 s1.value=2 ,相互没有影响。console

 

那么问题来了function

 

有时候硬是要经过传入参数取回返回值要如何作呢?

其实按照定义,是能够这么理解的,若是你覆盖了这个对象,则不是传址了,若是修改对象的一部分,则仍是传址,不妨再作一个实验。

var s = {sn:{value:1}}
var s1 = {value:2}


function setValue(arg){
    arg.sn = s1
}

setValue(s)


console.log(s.sn.value)
console.log(s1.value)

结果都是 2

经过外层再包装一层对象,成功的 把 s1取了出来,算是一种变通的方法吧

 

一个应用场景,实际上是我在作web文件管理器时遇到的东西。

文件管理器要选择文件,单击一个文件,该文件会显示选中状态,按住ctrl继续单击其余文件,又会有一个文件显示选中状态

若是放开ctrl去选择另外的文件时要求曾经被选中的取消选中状态。说的有点儿绕,脑补吧,我也不知道咋描述了。

一个办法是你能够去用循环去取消以前的选中文件的选中状态,而另外一个方法

将选中文件的状态都指向同一个状态对象,该对象的值是true,当要取消以前的若干选中时,只要把这个对象的值设置为false,则当即取消了全部被选中的文件。

而不用去循环处理过往数据。

以上

相关文章
相关标签/搜索