饥人谷技术博客

应用类型和对象拷贝

2017-07-31  本文已影响0人  南山码农

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

基本类型值(字符串、数值、布尔值、null和undefined):指的是保存在栈内存中的简单数据段;
引用类型值(对象、数组、函数、正则表达式):指的是那些保存在堆内存中的对象,变量中保存的实际上只是一个指针,这个指针执行内存中的另一个位置,由该位置保存对象

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

var obj1 = {a:1, b:2};//声明obj1,并将对象{a:1, b:2}的地址指针赋值给obj1
var obj2 = {a:1, b:2};//声明obj2,并将另一个对象{a:1, b:2}(与上一个对象只是内容相同,实际为两个对象)的地址指针赋值给obj2
console.log(obj1 == obj2);//obj1与obj2为两个不同对象的地址指针,所以不相等,结果为false
console.log(obj1 = obj2);//将obj2赋值给obj1,即是将第二个对象的指针赋值给obj1,两者都指向第二个对象,输出结果为第二个对象object{a:1,b:2}
console.log(obj1 == obj2);//obj1与obj2都为第二个对象的地址指针,两者相等,结果为true

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

var a = 1;
var b = 2;
var c = { name: '饥人谷', age: 2 };
var d = [a, b, c];    //[ 1,2,c(地址指针,与c指向的对象相同)]

var aa = a;       //将a赋值给aa,则aa的值为1
var bb = b;       //将b赋值给bb,则bb的值为1
var cc = c;       //将c赋值给cc,c是对象的地址指针,即将原对象的地址指针赋值给cc,c和cc都指向同一个对象
var dd = d;       //将d赋值给dd,d是对象的地址指针,即将原对象的地址指针赋值给dd,d和dd都指向同一个对象

a = 11;       //a的值改变,aa的值不变,
b = 22;       //b的值改变,bb的值不变,
c.name = 'hello';       //c指向的对象的name属性值变为“hello”
d[2]['age'] = 3;       //d指向的对象中第三个对象的age属性值变为3,即是原来c指向的对象的age属性变为3

console.log(aa)     //结果为1
console.log(bb)     //结果为2
console.log(cc)     //结果为{ name: 'hello', age: 3 }
console.log(dd)    //结果为{1,2,{ name: '饥人谷', age: 3 }}

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

var a = 1                               //a的值为1
var c = { name: 'jirengu', age: 2 }           // c的值为对象的地址指针

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

f1(a)    
//f1(a){
//    var n=a(n=1);
//    ++n(n=2);},a的值无变化
f2(c)  
//f2(c){
//    var obj=c;    (将c的地址指针赋值给obj,c和obj指向同一个对象)
//     ++obj.age;   (将cc和obj指向对象的age属性值自增,即为3)
// }
f1(c.age)  
//f1(c.age){
//    var n=c.age;   (n=3)
//    ++n(n=2);}     c.age的值无变化 
console.log(a)     //1
console.log(c)     //{ name: 'jirengu', age: 3 }

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

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);
                filter(arr);
          }
    }
}
filter(arr)
console.log(arr) // [3,1,2]

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

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

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

//第一种
function clone(obj){
    var newObject={};
for (var key in obj) {
    if(typeof obj[key] === 'number'||typeof obj[key] === 'boolean'||typeof obj[key] === 'string'||obj[key] ===undefined||obj[key] === null){
      newObject[key]=obj[key];
} else{ 
    newObject[key]=clone(obj[key])
  }
}
return newObject;
}
  第二种
var cloneObj = JSON.parse(JSON.stringify(obj));
上一篇下一篇

猜你喜欢

热点阅读