You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS对象比较问题:为何传入{name:'amy'}却输出'hey arnold'?

为什么传入{name: 'amy'}却输出hey arnold?

嘿,这是JavaScript里对象比较的经典“坑”,很多刚接触对象的开发者都会踩!

你遇到的问题核心在于:JavaScript中用==(或===)比较对象时,比较的不是对象的内容,而是它们在内存中的引用地址。

具体来说,你在if条件里写的{ name: 'amy' }是一个全新创建的对象,和你调用greet({ name: 'amy' })时传入的那个对象,虽然看起来内容完全一样,但它们是内存中两个独立的对象,引用地址完全不同。所以person == { name: 'amy' }的结果是false,代码自然就走到了else分支,输出hey arnold。

这里给你几个解决办法,按需选择:

  • 方案一:直接比较对象的属性(最推荐,适合简单对象)
    如果你的对象结构简单,直接比较对应的属性值就好:

    function greet (person) {
      if (person.name === 'amy') {
        console.log('hey amy')
      } else {
        console.log('hey arnold')
      }
    }
    greet({ name: 'amy' }) // 现在会输出预期的'hey amy'
    
  • 方案二:序列化后比较(适合结构固定的复杂对象)
    如果对象有多个属性,可以用JSON.stringify()把对象转成字符串再比较,但要注意这个方法有局限性——比如属性顺序不同、对象里包含函数/undefined等特殊值时,结果会不准确:

    function greet (person) {
      if (JSON.stringify(person) === JSON.stringify({ name: 'amy' })) {
        console.log('hey amy')
      } else {
        console.log('hey arnold')
      }
    }
    greet({ name: 'amy' })
    
  • 方案三:复用同一个对象引用
    如果这个目标对象会被多次使用,可以把它存成一个变量,这样比较的就是同一个内存引用:

    const amy = { name: 'amy' }
    function greet (person) {
      if (person === amy) {
        console.log('hey amy')
      } else {
        console.log('hey arnold')
      }
    }
    greet(amy) // 传入同一个变量,引用一致,匹配成功
    

最后再提醒下:JavaScript里的引用类型(对象、数组、函数等)都是比较引用地址,只有原始类型(字符串、数字、布尔、null、undefined)才会比较实际的值,这个基础概念一定要记牢哦!

内容的提问来源于stack exchange,提问作者Mohammad Quanit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:40:08