zoukankan      html  css  js  c++  java
  • 再谈js传值和传址

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

    1.值类型是传值的

    2.对象和数组是传址的

    这两点通过例子的到了证实

    然而还有一种情况没有讨论

    函数的参数的传值和传址

    通过实验,在函数中用一个新对象去覆盖传入的对象,则类似于传值的效果,原数据无法得到新值

    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 ,相互没有影响。

    那么问题来了

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

    其实按照定义,是可以这么理解的,如果你覆盖了这个对象,则不是传址了,如果修改对象的一部分,则还是传址,不妨再做一个实验。

    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,则立即取消了所有被选中的文件。

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

    以上

  • 相关阅读:
    金融风控100道面试题:传统银行开发转行互金top3公司并年薪40多万
    想学好矩阵?首先你要知道矩阵的历史!​
    什么是卷积?
    CNN的卷积核是单层的还是多层的?
    AI换脸之后“AI换声”来了!,一小时诈骗173万!
    介绍两个面试神器
    Github最火!程序员必须知道22大定律和法则
    SQL常用运算符
    SQL利用通配符进行模式查询
    隐藏DataList里面的某一行数据
  • 原文地址:https://www.cnblogs.com/allofalan/p/10013894.html
Copyright © 2011-2022 走看看