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

