2-4.引用类型和对象拷贝

2017-05-16  本文已影响0人  guidetheorient

1.引用类型有哪些?非引用类型有哪些2.如下代码输出什么?为什么

引用类型包括对象、数组、函数、正则表达式等
非引用类型包括数值、布尔值、字符串、null和undefined

var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);  //false  内存地址的比较,两个对象不在同一个内存地址
console.log(obj1 = obj2);   //{a:1,b:2}
console.log(obj1 == obj2);  //true  上面将obj2赋值给obj1,相当于内存地址赋给了obj,所以返回true

2.

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改变
console.log(bb) //2 非引用类型,赋值后不随a改变
console.log(cc) //{name:'hello',age:3} 引用类型与c存储的内存地址相同,所以或相互影响
console.log(dd) //[1,2,Object] 引用类型,相互影响,给d[2]添加了属性,所以变为Object

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  只是将值赋给了f1里的var n,相互不再影响
console.log(c)  //{name:'jirengu',age:'3'}  //调用f2触发++obj.age,因为f2将obj的地址赋值给了函数内部的var obj,所以相互影响

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

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

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

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

var arr2 = filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr)  // [3,1,0,-1,-2,2,-5]

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

var obj = {
    name:'chris',
    gender:'male',
    hobby:{
        hobby1:'html',
        other:{
           hobby2:'jQuery',
        }
    }
}

function copy(obj){
    var newobj = {}
    var i
    var a = Object.keys(obj)
    for (i = 0; i < a.length; i++){
        if (!(obj[a[i]] instanceof Object)){
            newobj[a[i]] = obj[a[i]]
        } else {
            newobj[a[i]] = copy(obj[a[i]])
        }
    }
    return newobj
}
function copy2(obj){
    var result = JSON.parse(JSON.stringify(obj))
    return result
}
var obj2 = copy(obj)
console.log(obj2)
var obj3 = copy2(obj)
console.log(obj3)
上一篇 下一篇

猜你喜欢

热点阅读