HuangHongRui / Notebook

:pencil2: Yeah.. This's My NoteBook...:closed_book:
0 stars 0 forks source link

引用类型&对象拷贝 #3

Open HuangHongRui opened 7 years ago

HuangHongRui commented 7 years ago

学习的乐趣..奇妙无穷

.引用类型 & 非引用类型


.如下代码输出

`var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);      //false; 
console.log(obj1 = obj2);       
console.log(obj1 == obj2);`     //true;
  • 第一个false:因为指针指向两个不同对象,所以不相等。
  • 而最后true:因为前面boj2的指针赋值给了boj1,他们指向同个对象,所以相等

.如下代码输出

`var a = 1
var b = 2
var c = { name: '饥人谷', age: 2 }
var d = [a, b, c]
var aa = a      //复制了a的值,aa与a是各为不同的变量
var bb = b      //复制了b的值,aa与a是各为不同的变量
var cc = c      //同个指针
var dd = d      //同个指针
a = 11        
b = 22
c.name = 'hello'
d[2]['age'] = 3      // 更换下位位置2(第三个元素)的age属性
console.log(aa)   // 仍等于1;
console.log(bb)   // 仍等于2;
console.log(cc)   // {name:'hello',age:2}; 同步更改;
console.log(dd)`   // [a , b , {name: "hello" , age :3}]

.如下代码输出

`var a = 1
var c = { name: 'jirengu', age: 2 }
function f1(n){
++n
}
function f2(obj){
++obj.age
}
f1(a)     // a按值传递,非引用类型
f2(c)     //  c为引用类型,更改指针所在的对象
f1(c.age)     // 
console.log(a)     // 1
console.log(c)`    // { name: 'jirengu', age: 3 }
  • 因为js中所有函数的参数都是按值传递的,f1中是a的值传递给函数f1,a值不变。
  • f2(c)传递 的是引用类型,obj指针指向的对象内值发生改变,C同样指向此地址,调用c时,age值就变成3了,f1(c.age),传递的只是c函数的age值,2 是基本数据类型,不会改变c函数的age值。c.age仍然是3

.过滤数组,保留正数,原数组上操作

`var arr = [3,1,0,-1,-3,2,-5]
function filter(arr) {
var i, a=arr.length;
for(i=0; i

过滤数组,保留正数,原数组不变,生成新数组

`var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
  var arr2 = new Array;
  for(var i=0; i 0){
      arr2.push(arr[i]);
      // console.log(arr2)
    }
  }
  // console.log(arr2)
  return arr2
}
var one = filter(arr)
console.log(one)  //[3,1,2]
console.log(arr) // [3,1,0,-1,-3,2,-5]`

.写一个深拷贝函数,用两种方式实现

`//浅拷贝
    var obj1 = {
        name: "rui",
        age: 50,
        friends: {
            name: "xiaohai",
            sex: "man"
        }
    }
    function copy(obj){
      var newObj = {};
      for(var key in obj){
        newObj[key] = obj[key]
      }
      return newObj
    }

    var obj2 = copy(obj1);
    obj1.age = 400;
    obj2.friends.name = "Leo"
    console.log(obj1)
    console.log(obj2)`
`        //深拷贝
    function copy(obj){
      var newObj = {};
      for(var key in obj){
        if (typeof obj[key] === "object") {//如果遍历到属性是对象类型
          newObj[key] = copy(obj[key])  //再执行一次【参数是它的属性——也就是上面遍历到的对象类型】
        } else {
          newObj[key] = obj[key]
        }
      }
      return newObj
    }`
`//深拷贝
function copy(obj){
    var newobj = JSON.parse(JSON.stringify(obj));
    return newobj;
    }
    var obj2 = copy(obj1)
    console.log(obj2)`

.stringify转为字符串 .parse() 解析一个JSON字符串,构造由字符串描述的JavaScript值或对象。可以提供可选的reviver函数以在返回之前对所得到的对象执行变换