【转】javascript中值传递,地址传递,引用传递的问题(使用js创建list对象时会用到)

简介: function initEditModal_SI(node) { if (node.siArray == undefined) { node.siArray = new Object(); } var sis = new Array(); // for (var index in node.
function initEditModal_SI(node) {  
   if (node.siArray == undefined) {  
       node.siArray = new Object();  
   }  
   var sis = new Array();  
   // for (var index in node.siArray) {  
     // sis.push(node.siArray[index]);  
   // }  
   if (node.siArray != null) {  
            $.each(node.siArray, function (id, obj) {  
            if(obj != null){  
                var object = new Object();  
                object.id = obj.id;  
                object.ip = obj.ip;  
                object.name = obj.name;  
                object.portEnd = obj.portEnd;  
                object.portStart = obj.portStart;  
                sis.push(object);  
            }  
        });  
   };  
。。。。。。。。。。。。。。。  
     
}  

  

原意是想:

new一个数组sis,可以自由修改数组 sis 里面的值,且不会影响到后台获得的node对象里面的siArray里面的值。

这样就可以在想reset这个页面的时候还可以用node对象去做reset,但是,发现,修改了sis数组的值,node.siArray里面的值也跟着变了。

那么,问题来了。

 

 

注释掉的部分就是出问题的部分。

 

为什么会有问题:

因为新建的数组,直接用的就是函数传递过来的参数的地址。(直接给push进去,push进去的不是值,而是值的地址)

所以在以后的代码中修改了做这个新建的数组,看似没有修改原来数据的值,但是在你再次使用原来的参数去初始化页面的时候发现这个时候,原来的参数的值。莫名其妙的改变啦。

这个时候只能用下面代替的方法,其实和clone的性质是一样的,完完全全的真真正正的clone一遍,

然后就可以随便修改这个值,用于页面操作。

只要不提交数据到后台去保存。那么本地的那个node.siArray(即传进方法的node.siArray)就不会被改变,

当然,当你保存数据的时候,这个全局参数才应该跟着刷新一下,才可以保持数据的一致。

 

至于string类型,不论是java还是js,还是c一旦声明了一个string 那他就固定了。就算修改他,也只是再新建一个而已。(这个东西在新手面试的时候经常被问到)

 关于用js创建list对象的实例:

获取到json数据如下:

错误的写法:

 

var list = [];
var userObj = ret.UserList
var obj = new Object();
for ( i = 0; i < userObj.length; i++) 
{
  obj.text = userObj[i].RealName;
  obj.status = userObj[i].UserId;
  list.push(obj.slice());									
  alert(JSON.stringify(list));
}

 

  

 

这样获取的list的值都是最后一个的值,即都是"王二小"了。

正确的写法:

 

var list = [];
$.each(userObj, function(id, obj)
{
  var object = new Object();
  object.text = obj.RealName;
  object.status =obj.UserId
  list.push(object); 
}); 
alert(JSON.stringify(list));

 

  

 

 

 

总结如下:

1.JS的基本类型,是按值传递的。

2.对于对象而言:分两种情况

(a).如果传递给函数的参数是对象,并且修改了这个对象的属性(某些字段的值),那么奇妙的问题就来了。原参数就被修改了。

(b).如果传递给函数的参数是对象,并且没有修改这个对象的属性的值,而是把对象作为一个整体来操作的话。原参数就没有被修改。

 

学习交流群:364976091
相关文章
|
24天前
|
机器学习/深度学习 人工智能 JavaScript
js和JavaScript
js和JavaScript
21 4
|
1月前
|
前端开发 JavaScript 区块链
连接区块链节点的 JavaScript 库 web3.js
连接区块链节点的 JavaScript 库 web3.js
27 2
|
26天前
|
Java
java8中List对象转另一个List对象
java8中List对象转另一个List对象
37 0
|
2天前
|
JavaScript 前端开发
js开发:请解释this关键字在JavaScript中的用法。
【4月更文挑战第23天】JavaScript的this关键字根据执行环境指向不同对象:全局中指向全局对象(如window),普通函数中默认指向全局对象,作为方法调用时指向调用对象;构造函数中指向新实例,箭头函数继承所在上下文的this。可通过call、apply、bind方法显式改变this指向。
7 1
|
24天前
|
JavaScript 前端开发
JavaScript生成的随机数随机字符串JS生成的随机数随机字符串
JavaScript生成的随机数随机字符串JS生成的随机数随机字符串
14 1
|
1月前
|
JavaScript 前端开发
js开发:请解释什么是模块化(modularization),并说明如何在JavaScript中实现模块化。
模块化将复杂系统拆分为松散耦合的模块,提高代码可读性、可维护性、可复用性和可扩展性。JavaScript模块化历经CommonJS(Node.js中常见,使用`require()`和`module.exports`)、AMD(RequireJS,异步加载,`define()`和`require()`)和ES6 Modules(官方标准,`import`和`export`)三个阶段。打包工具如Webpack、Rollup处理兼容性问题,使模块化代码能在各种环境中运行。
|
1月前
|
JavaScript 前端开发
js开发:请解释this关键字在JavaScript中的用法。
JavaScript中的`this`关键字根据执行上下文指向不同对象:全局作用域中指向全局对象(如`window`),普通函数中默认指向全局对象,但作为对象方法时指向该对象。在构造函数中,`this`指向新实例。箭头函数不绑定`this`,而是继承上下文的`this`值。可通过`call`、`apply`、`bind`方法显式改变`this`指向。
10 2
|
1月前
|
Java API
java 对象list 使用stream进行过滤
在Java中,你可以使用Stream API对对象列表进行过滤。假设你有一个`List<MyObject>`,并且你想根据某些条件过滤出特定的对象。以下是一个示例: ```java import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<MyObject> myObjects = ... // 初始化你的对象列表 List<MyObject> filter
|
1月前
|
JavaScript 前端开发
编程笔记 html5&css&js 079 JavaScript 循环语句
编程笔记 html5&css&js 079 JavaScript 循环语句
|
1月前
|
存储 安全 Java
java集合框架及其特点(List、Set、Queue、Map)
java集合框架及其特点(List、Set、Queue、Map)