美文网首页
引用类型与对象拷贝

引用类型与对象拷贝

作者: Jeff12138 | 来源:发表于2017-08-12 16:53 被阅读0次

引用类型有哪些?非引用类型有哪些?

引用类型包括:对象、数组、函数、正则表达式;

非引用类型,即基本类型,包括:数值、布尔值、null和undefined。


如下代码输出什么?为什么?

var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2); //输出false。因为obj1和obj2在内存中的地址不同。
console.log(obj1 = obj2); //输出{a: 1, b: 2}。表示将obj2赋值给了obj1,同时改变了obj1指向的地址。
console.log(obj1 == obj2); //输出true。此时obj1和obj2的内容和地址完全相同。

如下代码输出什么?为什么?

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 = 1时,将a值赋给了aa,即aa = 1,后再改变a值,不会影响已经被赋值的aa。
console.log(bb)  //输出2。与console.log(aa)同理。
console.log(cc)  //输出{ name: 'hello', age: 3 }。由于c.name = 'hello'和d[2]['age'] = 3都是改变了对象的内容,而没有改变对象存储的地址,因此cc中的内容会随之改变。
console.log(dd)  //输出[1, 2, { name: 'hello', age: 3 }]。其中1,2的值是一开始就赋予了d的,所以不会随a,b的改变而改变;而c的内容改变了,存储地址却没有变,因此d会随之而改变。

如下代码输出什么?为什么?

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。整个执行过程中n和obj.age的自增都没有改变最初对a的赋值,因此a值始终为1。
console.log(c)  //输出{name: "jirengu", age: 3}。age的值在执行f2函数时自增,所以age变为3。

过滤如下数组,只保留正数,直接在原数组上操作。

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

过滤如下数组,只保留正数,原数组不变,生成新数组。

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

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

function deepCopy(oldObj) {
  var newObj = {};
  for(var key in oldObj) {
    if(obj.hasOwnProperty(key)){
      if(typeof oldObj[key] === 'number' || typeof oldObj[key] === 'string' || typeof oldObj[key] === 'boolean' || oldObj[key] === undefined || oldObj[key] === null ) {
        newObj[key] = oldObj[key];
      }
      else{
        newObj[key] = deepCopy(oldObj[key]); 
      }
    }
  }
  return newObj;
}
function deepCopy(oldObj){
        return JSON.parse(JSON.stringify(oldObj));
 }

相关文章

  • Java深拷贝和浅拷贝

    定义 浅拷贝 基本数据类型 拷贝数值 引用类型 拷贝对象引用 深拷贝 基本数据类型 拷贝数值 引用类型 拷贝引用所...

  • 深拷贝和浅拷贝

    浅拷贝就比如像引用类型,而深拷贝就比如值类型。浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不...

  • Java之深浅拷贝

    Java之深浅拷贝 基本类型:拷贝数据的值其他类型:拷贝地址的引用,拷贝出的新对象与原对象共享实例变量,不受访问权...

  • 引用类型与对象拷贝

    引用类型有哪些?非引用类型有哪些? 引用类型包括:对象、数组、函数、正则表达式; 非引用类型,即基本类型,包括:数...

  • 引用类型与对象拷贝

    引用类型有哪些?非引用类型有哪些 引用类型:Object、Array、Date、RegExp、Function、M...

  • 引用类型与对象拷贝

    1、引用类型有哪些?非引用类型有哪些 引用类型:Object、Array、Function、正则,将这些对象保存在...

  • 引用类型与对象拷贝

    1.引用类型有哪些?非引用类型有哪些 引用类型: 对象 object 数组 函数 正则非引用类型...

  • 引用类型与对象拷贝

    1.引用类型有哪些?非引用类型有哪些 基本类型值(数值、布尔值、symbol、null和undefined):指的...

  • 引用类型与对象拷贝

    1.引用类型有哪些?非引用类型有哪些? ECMA Script中规定,JavaScript的基本数据类型分为两类,...

  • 引用类型与对象拷贝

    基本类型、引用类型 基本类型(字符串、数值、布尔值、null 和 undefined):指的是保存在栈内存中的简单...

网友评论

      本文标题:引用类型与对象拷贝

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