美文网首页
js引用类型

js引用类型

作者: 肥鱼666 | 来源:发表于2017-11-28 00:20 被阅读0次

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

引用类型: 对象,数组,函数,正则
非引用类型: 数值,布尔值,字符串,null,undefined

var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);    //输出false  虽然obj1与obj2里边的值相同,但是它们其实是指向堆内存中不同的2个对象
console.log(obj1 = obj2);  //输出{a : 1 , b : 2}  因为这是把obj2赋值给obj1,obj2这个指针现在指向了obj1所指向的地址
console.log(obj1 == obj2);  //输出true  因为上一步已经把obj2指针指向了obj1指针的地址,现在obj2与obj1指向地址相同,所以输出true

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

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  因为基本类型的值是简单的数据类型,可以直接赋值给其他的变量,赋值之后即使自身数值改变也不会影响到之前被赋值的变量,因为被赋值的变量已经在内存中自身空间里存储了值
console.log(bb)  //输出2  同上
console.log(cc)  //输出{name: 'hello' , age: 3}  因为对象是引用类型的值,对象名可以理解成一个指针(或者一个地址),而把它赋值给其他变量实际就是把自身指向的地址赋值给别的变量,这样的话就是虽然2个变量名称不同,但实际都是指向同一个地址
console.log(dd)  //输出[1,2,{name: 'hello', age:3}]  因为经过d[2]['age']这一步骤改变了d数组中的第三个元素(第三个元素是对象)的age属性,所以输出这个

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

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  因为a的值没有改变,f1(a)只是把a的值给f1的参数n,n改变不会影响a 
console.log(c)  //输出3  因为f2里执行的是++obj.age,是直接改变内存中的age属性的值,所以f2(c)是把c对象的age加1变成3,而f1(c.age)是把c对象的age属性的值赋值给一个新的变量n,这个n不是引用类型并没有指向c对象的地址,而是在内存中新建了一个空间来存放数值。所以不会改变c的age值

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

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]

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

var arr = [3, 1, 0, -1, -3, 2, -5]
function filter(arr) {
    return arr > 0;
}
var arr2 = arr.filter(function(element){
    return element > 0;
});
console.log(arr2) // [3,1,2]
console.log(arr)  // [3,1,0,-1,-2,2,-5]

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

var obj = {
    name:'wahaha',
    age: 20,
    f:{
        name:'baishi',
        age: 22
    }
}
function copy(oldObj){
    var newObj = {}
    for(var i in oldObj){
        if(oldObj.hasOwnProperty(i)) {
            if (oldObj[i] === undefined || oldObj[i] === null || 
                typeof oldObj[i] === 'number' || typeof oldObj[i] === 'string' 
                || typeof oldObj[i] === 'boolean') {
                newObj[i] = oldObj[i]   
            }else{
                newObj[i] = copy(oldObj[i])
            }
        }
    }
    return newObj
}
var obj3 = copy(obj)
obj.age = 30
console.log(obj3)
var obj = {
name: 'haha',
age: 23,
  f:{
        name: 'erha'
    }
}
function deepCopy(oldObj){
    return JSON.parse(JSON.stringify(oldObj))
}
var obj2 = deepCopy(obj)
obj.f.name = 'dsad'
console.log(obj2)

相关文章

  • Js基础知识-手动实现深拷贝

    本文将手动实现引用类型的深拷贝关于值类型与引用类型可阅读下方文章:JS基础类型直通车:Js基础知识-变量类型Js基...

  • 慕课网-前端JavaScript面试技巧笔记

    js中使用 typeof 能得到哪些类型? 考察点:JS变量类型值类型VS引用类型,引用类型可以无限制扩展属性 何...

  • 深拷贝与浅拷贝

    一.引用类型与值类型 我们都知道,js有两种基本类型,引用类型与值类型。引用类型的“=”只是拷贝了引用,而基本类型...

  • JS 基础知识巩固(JS面试宝典-全面透彻)

    第一章:JS 基础上篇(js 类型) 值类型 引用类型 问题:为什么对值类型和引用类型进行修改会出现不同的结果呢?...

  • js基本类型与引用类型

    1.js基本类型和引用类型 首先js的变量有两种类型,基本类型值和引用类型值 基本数据类型:null,undefi...

  • Web前端必知篇:原型链的讲解

    js中的数据类型 js中的数据类型有两种,1是基本数据类型,2是引用数据类型。引用数据类型又可分为原生引用类型和自...

  • js引用类型

    引用类型有哪些?非引用类型有哪些 基本类型值(数值、布尔值、null和undefined、string和symbo...

  • js引用类型

    引用类型有哪些?非引用类型有哪些2.如下代码输出什么?为什么 引用类型: 对象,数组,函数,正则非引用类型: 数值...

  • js引用类型

    引用js的三种方式 1、添加在行内的js代码,需要事件的支持(优点:方便 缺点:增加了代码的冗余性) 2、添加在b...

  • js引用类型

    1.引用类型是把数据和功能组织再一起得结构。引用类型和类主要区别就是:引用类型缺少类和接口2.引用类型通过new操...

网友评论

      本文标题:js引用类型

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