javascript - 关于 === 的几种表现
PHP中文网
PHP中文网 2017-04-11 11:38:58
[JavaScript讨论组]

如何解释下面的现象?

var a1 = 'a';
var a2 = new String('a');
var a3 = new String('a');
a1 == a2; // true
a1 == a3; // true
a2 == a3; // false
a1 === a2; // false
a1 === a3; // false
a2 === a3; // false
[]==[] // false
[]===[] // false
PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(6)
高洛峰
var a1 = 'a';
var a2 = new String('a');//对象
var a3 = new String('a');//对象
a1 == a2; // true a2转为字符串 也可以理解为 == 是判断等号两边的值是否相等
a1 == a3; // true a3转为字符串
a2 == a3; // false 两个对象判断是否相等 new 了两次, 内存地址不同的两个对象
a1 === a2; // false === 严格等于 同时判断等号两边的值 包括类型
a1 === a3; // false 同上
a2 === a3; // false a2 == a3 返回值为false 则=== 也不可能为true
[]==[] // false 同a2 == a3
[]===[] // false 同a2 === a3

补充:

> new String('a').valueOf()// 并不是 toString.
< "a"
阿神

首先a2a3的类型是对象。
此处a2、a3==a1的时候不同数据类型比较是调用了valueOf方法的,所以true。
===的时候不会转换数据类型,所以是false.
a2===a3,因为对象的内存地址不同,所以是false
然后[]也是引用数据类型,也是比较地址。所以==和===都是false


补充:
基本数据类型和Object类型(Date除外)的==比较。
会首先调用valueOf方法,若返回值非基本数据类型,会再调用toString方法,返回值若类型不同还会调用Number转换为数字。

        var a1 = 'a';
        var a2 = new String('a');
        String.prototype.valueOf = function(){
            console.log('valueOf');
//          可分别打开注释进行测试
//          return 'a';
//          return [];
        };
        String.prototype.toString = function(){
            console.log('toString');
            return 'a';
        }
        console.log(a1==a2);
阿神

1.a1==a2 a2为对象,==比较时转字符串所以为true,===时不转为false;
2.a1==a3 同1
3.a2 == a3 new String()返回对象,对象==,===判断比较地址,地址相同为true,否则为false。a2和a3虽然值相同,但是地址是不同的。
4.a1 === a2 见1
5.a1 === a3 见1
5.a2 === a3 见3
6.[]==[]/[]===[] []是一个数组,同对象比较,都是比较地址。

PHPz

请参考MDN

Equality (==)

The equality operator converts the operands if they are not of the same type, then applies strict comparison. If both operands are objects, then JavaScript compares internal references which are equal when operands refer to the same object in memory.

Identity / strict equality (===)

The identity operator returns true if the operands are strictly equal (see above) with no type conversion.

区别是==在左右2数,数据类型不等的情况下进行类型转换再比较,一般是右边转成左边的数据类型再做比较。而===不做类型转换直接比

PHP中文网

内存地址不同
造成的false

天蓬老师
a1 == a2; // true
a1 == a2; // true

由于a1(string), a2(object)的type不同,所以会把a2转换成string进行对比,也就相当于a1 == a2.toString()

a2 == a3; // false

由于a2(object),a3(object)都是object,所以会直接对比地址

a1 === a2; // false
a1 === a3; // false

两个type不同的对象永远不会恒等

a2 === a3; // false

由于两个都是object,直接对比是否是同一个地址

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号