前端基础类学习

引用类型、对象拷贝

2017-03-31  本文已影响23人  饥人谷_米弥轮

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

JS为了便于操作基本类型,提供了3个特殊的引用类型:Boolean/Number和String(基本类型转引用类型): javascript基本包装类型介绍

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

  var obj1 = {a:1, b:2};
  var obj2 = {a:1, b:2};
  console.log(obj1 == obj2);  //1
  console.log(obj1 = obj2);
  console.log(obj1 == obj2);  //2

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

    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,因为非引用类型会拷贝并重新创建了一个栈内存空间在原来的b之上
    console.log(cc) // 输出为{ name: 'hello', age: 3 },因为引用类型是通过指针指向对象所存放的位置,直接进行拷贝,则将该指针赋值给cc,所以cc的值和c一样
    console.log(dd) // 输出为{1,2,{ name: 'hello', age: 3 }},因为引用类型是通过指针指向对象所存放的位置,直接进行拷贝,则将该指针赋值给dd,所以dd的值和d一样

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

    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,函数内的局部变量不影响全局变量的值
    console.log(c) //输出为{ name: 'jirengu', age: 3 },f2进行函数运算后age为3,因为引用类型的特点,所以值改变,而进行f1的函数运算时,由于是单独提取出age的值进行运算,相当于转变为非引用类型,所以值不受影响

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

js中splice()的强大(插入、删除或替换数组的元素)

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

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

JavaScript中数组slice和splice的对比小结

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

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

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

JS中的hasOwnProperty()和isPrototypeOf()属性实例详解

    方法一:
    obj = {
            age:100,
            one: null,
            finder: {
                name: 'jirengu',
                sex: 'nv'
            }
        }

        function copy(obj) {
            var newObj = {};
            for(var key in obj) {
                if(obj.hasOwnProperty(key)) {   // hasOwnProperty 是检测对象在排除原型链的情况下是否具有某个属性。
                    if(typeof obj[key] === 'number' 
                        || typeof obj[key] === 'boolean' 
                        || typeof obj[key] === 'string' 
                        || typeof obj[key] === 'undefined'
                        || obj[key] === null) {
                        newObj[key] = obj[key];
                    }else{
                        newObj[key] = copy(obj[key]);
                    }
                }
            }
            return newObj;
        }

        var obj3 = copy(obj);
        obj.finder.name = '饥人谷'
        console.log(obj3);

方法二:
function copy(obj){
    var newobj = JSON.parse(JSON.stringify(obj));
    return newobj;
}
var obj2 = copy(obj1)
console.log(obj2)
上一篇 下一篇

猜你喜欢

热点阅读