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

JavaScript中===运算符对原始值与非原始值是否有不同定义?是否存在统一定义?

JavaScript中===运算符的统一定义解析

当然有,而且这个统一定义可以一句话概括:===返回true当且仅当两个操作数的「标识(identity)」完全相同。

这里的「标识」可以理解为操作数在JavaScript引擎中的唯一“身份”:

  • 对于原始值(字符串、数字、布尔值、null、undefined、Symbol),它们的标识就是自身的类型和值——因为原始值是不可变的,且直接存储在栈中,不存在引用共享的情况。所以只要类型和值都相同,它们的标识就完全一致,===返回true;反之则返回false。
  • 对于非原始值(对象、数组、函数等引用类型),它们的标识是其在内存中的引用地址——不管两个对象的内容多么相似,只要它们不是同一个内存地址的实例,标识就不同,===返回false;只有当两个变量指向同一个对象实例时,标识才一致,返回true。

用代码验证一下:

// 原始值场景
console.log(3 === 3); // true,类型和值都相同,标识一致
console.log(true === 1); // false,类型不同,标识不同
console.log(Symbol('foo') === Symbol('foo')); // false,Symbol的唯一性决定了标识不同

// 引用类型场景
const arr1 = [1,2,3];
const arr2 = arr1;
const arr3 = [1,2,3];
console.log(arr1 === arr2); // true,指向同一个数组,引用地址相同
console.log(arr1 === arr3); // false,两个独立数组,引用地址不同

本质上,ECMAScript规范对===的定义本身就是统一的,只是因为原始值和引用类型的存储机制差异,导致表现出来的规则看起来分两类,但底层逻辑都是判断两个操作数是否具有完全相同的标识。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:55:11