引用类型与对象拷贝

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

  • 引用类型:
    Object、Array、Date、RegExp、Function、Math、Global、Error,指的是保存在堆内存中的对象。当复制保存对象的某个变量时操作的是对象的引用,也就是指向该对象在内存中所在位置的指针,为对象添加属性时操作的是实际的对象,引用类型的值按引用访问。

  • 三个特殊的引用类型:
    Boolean、Number、String:也叫基本包装类型,每当读取一个基本类型值时,后台会创建一个对应的基本包装类型的对象,从而让我们能调用一些方法来操作这些数据。
    不建议显式地创造基本包装类型对象。

  • 基本类型(非引用类型):
    string、boolean、null、undefined、number、symbol,这六种基本类型指的是保存在栈内存中的简单数据段,基本类型的值按值访问。

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

var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);  //false 原因:变量obj1和obj2中保存的是指向对象在内存中位置的指针,也就是说obj1和obj2引用的是堆内不同的两个对象,所以不相等,返回false
console.log(obj1 = obj2);  //{a:1,b:2} 原因:赋值操作,也就是obj2将储存在变量对象中的值(即指向对象位置的指针)复制了一份放到obj1的内存空间中,这时obj1和obj2都指向堆内的同一个对象
console.log(obj1 == obj2);  //true 指向同一个对象了所以再判断相当与否就返回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' //改变堆内存中c.name值为hello
d[2]['age'] = 3 //改变堆内存中c.age值为3
console.log(aa)     //1 原因:a是基本类型值,按值传递给aa,所以aa为1,之后除非显式地指明aa=11,打印的aa就是11,不然aa得到的就是a的值1,不会再改变。如果把a=11放到var aa=a前面去,打印aa也是11,以下打印bb原理相同所以不作解释。
console.log(bb)     //2 原因:b是基本类型值,按值传递给bb,所以bb为2
console.log(cc)    //{name:"hello",age:3} 原因:c是引用类型的值,值按引用访问,首先将变量c指向堆内对象位置的指针复制给了cc,所以cc与c引用的是同一个对象,接着变量c的name属性值被修改为"hello",d[2]['age']=3意为将数组d中索引为2的项,也就是变量c的age属性的值修改为3,由于指针相同,cc也可以访问到c的属性和修改后的值,所以打印cc得到{name:"hello",age:3} 
console.log(dd)    //[1,2,{name:"hello",age:3}] 原因:d也是引用类型的值,赋值操作后dd和d引用的是内存中的同一对象,a和b是基本类型按值传递,dd指针指向的内存中保存的c的值已经改变,使用修改之后的值。

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

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(a),实际上是向f1(n)函数内传递了一个参数a,而a是基本类型,值为1,所以实际上f1内发生的是n = a = 1,所以++n和a没关系,打印出来的a的值没变化
console.log(c) //{name:"jirengu",age:3} 原因:c是引用类型的值,调用f2(c),即将变量c指向堆内对象位置的指针当作参数传递给函数f2(obj),实际上在f2内发生的是obj=c={name:"jirengu",age:2},这两个变量就指向同一内存,接着执行++c.age,即++2,执行完毕后age值变为3,所以obj{name:"jirengu",age:3},obj和c引用的是同一对象所以c可以访问到修改后的值,所以打印c得到和obj相同的结果{name:"jirengu",age:3}

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

function filter(array) {
    for (var i = 0; i < array.length; i++) {
        if (array[i] <= 0) {
            array.splice(i, 1)//删除数组第I项位置的值
            i-- //每删除一项,数组长度就减1,所以为了得到正确的结果必须加上i--
        }
    }
    return array
}
var array = [3, 1, 0, -1, -3, 2, -5]
console.log(filter(array))//[3,1,2]

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

function filter(array) {
    var res = []
    array.forEach(function (element) {
        if (element > 0) res.push(element)
    }, this);
    return res
}
var array = [3, 1, 0, -1, -3, 2, -5]
console.log(filter(array))//[3,1,2]
console.log(array)//[3, 1, 0, -1, -3, 2, -5]

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

浅拷贝与深拷贝

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • 基本类型和引用类型# ECMAScript包含两种不同的数据类型:基本类型值和引用类型值; 基本类型值指的是保存在...
    草鞋弟阅读 495评论 0 0
  • 1.引用类型有哪些?非引用类型有哪些引用类型:Object / Array / Function / Date /...
    任少鹏阅读 201评论 0 0
  • 引用类型有哪些?非引用类型有哪些? JS中的数据类型分为基本类型和引用类型。基本类型:数值(number)、字符串...
    LeeoZz阅读 266评论 0 0
  • 1.引用类型有哪些?非引用类型有哪些? 引用类型:对象、数组、函数、正则表达式非引用类型:数值、字符串、布尔值、n...
    BAWScipes阅读 171评论 0 0
  • 当下的你是否也感觉自己每天忙忙碌碌呢?你找到最重要的东西了吗?你最重要的东西是什么呢? 今天看到这个问题愣住了,竟...
    Miranda明霞阅读 446评论 3 1