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
相关产品推荐
相关产品推荐

