指针和引用

为什么对象不相等?

var obj1 = { name: 'haolucky' }
var obj2 = { name: 'haolucky' }
obj1 === obj2  // false
obj1 == obj2  // false

在声明 obj1 = { name: 'haolucky' } 时,实际上是在堆内存中创建一个对象 { name: 'haolucky' } ,而 obj1 存储的是这个对象在堆内存中的地址,即 obj1 是一个指针,指向了内存中这个对象 { name: 'haolucky' }

同样的道理,obj2 也是在内存中开辟一个空间,创建了一个对象 { name: 'haolucky' },并指向这个地址。

综上所述,因为 obj1obj2 是两个不同的地址,所以两者不相等;在 JavaScript 中,引用类型(对象、数组、正则、Date、函数)的比较,实际上是比较指针是否指向存储器中的同一段地址,只有指向同样的地址才能相等。

对于引用类型,指的是保存在内存中的对象。如果是同一对象,则值相同,不同对象则值不同。

基本类型参数按值传递
// 参数都是按值传递的
var str1 = 1
var str2 = 2
function handle(str1, str2){
  str1++
  str2++
  console.log(str1, str2)  // 2, 3
  return str1 + str2
}
handle(str1,  str2)
console.log(str1)  // 1
console.log(str2)  // 2

上面的函数中的参数是实参的拷贝,并不会影响全局的变量

引用类型参数按值传递
function change(obj) {
     obj.age = 16
     obj = new Object()
     obj.age = 18
 }
 var obj = new Object()
 change(obj)
 console.log(obj.age)  // 16
调用 change 函数时,传过去的 obj 参数是实例 new Object() 在内存中的地址,是按值传递,它们指向同一个地址对应的对象。如果改变里面的值,外面的实例也能相应的发生改变。obj = new Object() 重新给 obj 在内存中开辟了一个空间,指向了另外一个对象,所以不能修改外面实例的值。

1、实参将指向的内存地址传递给形参 ,按值传递的值指的是内存地址;
2、形参修改了它和实参共同指向的对象后,外部的实参会反映出来;
3、但形参始终无法修改实参指向的内存地址,即如果将形参指向新的对象,实参并不会指向新的对象。

使用案例:无返回值的带参void函数是没有返回值的,那么对于传入的参数在计算处理之后,怎么把结果返回呢?软件开发中实际上最常用的两种方式:指针和引用!在主程序中直接声明一个变量,然后把这个变量的引用或者指针作为参数直接传递给void函数,当void函数在做处理时,直接将结果写到引用参数或者指针指向的主函数变量,这样就间接实现了“返回值”。一可以让代码更简洁,二是能减少内存空间的占用。

在JavaScript中,函数的参数传递方式都是按值传递,没有按引用传递的参数。

但是JavaScript中有保存引用的对象,比如数组,它们是按引用传递的。
function curve(arr, amount) {
  for(var i =0; i < arr.length; ++i) {
    arr[i] += amount;
  }
}
var grades = [1,2,3,4,5,6]
curve(grades, 5)
print(grades);   //  [6, 7, 8, 9, 10]

连续赋值

var obj1 = {n: 1}
var obj2 = obj1
/* obj1.x = obj1
console.log(obj2, obj1)  // obj2 = {n:1,x:{n:1,x{...}}},obj1 = {n:1,x:{n:1,x{...}}} */

obj1.x = obj1 = {n: 3}
console.log(obj1, obj2, obj1.x, obj2.x) // {n:3}, {n:1,x:{n:3}}, undefined, {n:3}

obj1obj2 都指向了对象A

  1. .运算符的优先级高于 =
    先计算 obj1.x,并且此处的 obj1 指向是初始对象A
    obj1.x = undefined 对象A此时变成了 {n:1,x:undefined}
    obj1 = {n:1,x:undefined} obj2 = {n:1,x:undefined}

  2. 然后从右至左依次运算
    obj1 = {n:3} 指针发生了改变
    obj1 重新指向一个新的对象B {n:3}
    obj1 = {n:3} 此时 obj2 = {n:1,x:undefined}

  3. obj1.x = obj1 直接赋值,并不会改变指针
    这个 obj1.x 中的 obj1 就是第一步的初始对象A,而后面的obj1在第二步的时候已经重新指向了新对象B
    obj1.x = {n:3}
    相当于 ===> obj2.x = {n:3}
    obj2 = {n:1,x:{n:3}}
    当打印 obj1.x

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