美文网首页
函数的参数传递和对象深浅拷贝

函数的参数传递和对象深浅拷贝

作者: 倾国倾城的小饼干 | 来源:发表于2017-08-30 17:03 被阅读0次

代码输出

引用类型:对象,数组,函数,正则表达式
非引用类型:数值,字符串,布尔值,undefined,null。
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);//false,因为obj1和obj2指向不同的地址
console.log(obj1 = obj2);//{1,2}赋值的返回值是变量的值而不是true,之所以返回{1,2}是因为obj2把引用复制给了obj1,指向同一个对象。
console.log(obj1 == obj2);//true,因为二者的地址相同

代码输出(变量赋值)

var a = 1
var b = 2
var c = { name: '饥人谷', age: 2 }
var d = [a, b, c]

var aa = a
var bb = b
var cc = c
var dd = d

a = 11
b = 22
c.name = 'hello'
d[2]['age'] = 3

console.log(aa) //输出1,因为基本类型赋值后两个变量相互独立,a随然改成了11,但aa不受影响。
console.log(bb) //输出2,理由同上。
console.log(cc)//输出{name:'hello',age:2},引用类型赋值,只是地址的复制,一个变量改变,另一个也变化,所以c.name改成了‘hello’,cc也跟着变
console.log(dd)//输出[11,22,{name:'hello',age:3}]数组也是引用类型,所以理由同上,最后一个通过数组索引把age改成了3。

代码输出(函数传参)

var a = 1
var c = { name: 'jirengu', age: 2 }

function f1(n){
++n
}
function f2(obj){
++obj.age
}

f1(a)
f2(c)
f1(c.age)
console.log(a) //输出1,基本类型传值,a和n并不互相影响,只是a的值复制给了n而已。
console.log(c)//输出{name:'jirengu',age:3}引用类型,是地址的复制,一个变量变化,另一个也会变化。

代码输出(过滤一个数组,在原数组上操作)

var arr=[3,1,0,-1,-3,2,-5]
function filter(arr){
  for(i=0;i<arr.length;i++){
    if(arr[i]<=0){
      arr.splice(i,1);
      i--;//因为删除了一个元素,索引值也要删除1。
}
}
}
filter(arr);
console.log(arr);

过滤数组,生成新的数组,只保留正数

var arr=[3,1,0,-1,-3,2,-5]
function filter(arr){
    var newArr=[];
    for(i=0;i<arr.length;i++){
      if(arr[i]>0){
          newArr.push(arr[i]);
}
}return newArr;
}
var arr2=filter(arr)
console.log(arr2)
console.log(arr)

用了两种方法实现深拷贝

var obj={
  age:100;
  friend:{
      name:'sarah';
      sex:"male";
}
}
function copy(obj){
    var newobj = JSON.parse(JSON.stringify(obj));
    return newobj;
    }
    var obj2 = copy(obj1)
    console.log(obj2)

function copy (obj){
    var newobj={}
    for (var key in obj){
      if (obj.hasOwnProperty(key)){
      if(typeof obj[key]==='number'||typeof obj[key]==='boolean'||typeof obj[key]==='string'||obj[key]===undefined||obj[key]===null){
          newobj[key]=obj[key]
}else{
    newobj[key]=copy(obj[key])
}
}
}return newobj
}
var obj2 = copy(obj)
 console.log(obj2)

相关文章

  • 函数的参数传递和对象深浅拷贝

    代码输出 引用类型:对象,数组,函数,正则表达式非引用类型:数值,字符串,布尔值,undefined,null。v...

  • C++11线程函数的参数传递

    线程函数的参数传递过程 参数从调用线程创建一份拷贝 执行线程的拷贝变量拷贝到函数实参 验证: 可以看出A对象的拷贝...

  • 函数参数传递中的浅拷贝和深拷贝

    函数中传递的参数,可以在函数内部通过 arguments 这个类数组对象进行访问。 1.基本类型拷贝时:以传递字符...

  • Java参数传递

    基本类型 基本类型作为参数传递时,传递的是值得拷贝。 在函数内做任何改变都不会影响原来的值。 对象 对象作为参数传...

  • C++的深拷贝与浅拷贝

    拷贝构造函数 拷贝构造函数是使用类对象的引用作为参数的构造函数,它能够将参数的属性值拷贝给新的对象,完成新对象的初...

  • 读书笔记17.06.02【stack】【vector】

    C++中参数传递:按值传递,指针传递和引用传递按值传递:形参是实参的拷贝。指针传递:拷贝指针,被调用函数对指针指向...

  • js中当对象作为参数传递?

    前沿 今天在写深拷贝时候,发现传递参数为对象时候,函数内修改参数,对应的对象也会跟着被修改,于是特意研究了一下参数...

  • C++ 浅拷贝和深拷贝

    浅拷贝 深拷贝 场景如下 A、栈区中,子函数return 对象,进行赋值操作;B、栈区中,传递对象给子函数进行传递...

  • java参数传递(到底是值传递还是引用传递?)

    结论 1、基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的 2、对象作为参数传递时...

  • java的值传递(没有引用传递)

    结论 1、基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的 2、对象作为参数传递时...

网友评论

      本文标题:函数的参数传递和对象深浅拷贝

      本文链接:https://www.haomeiwen.com/subject/lkuzdxtx.html