扫码关注官方订阅号
请问为什么test1和3输出是false?
js中{}、[]指向的是内存中的一个地址,
{}
[]
{} === {} //false [] === [] //false
{}、[]进行比较的时候=判断的是地址是否相等,而不是内容
=
对象存储在堆,指向该对象的指针(地址)存储在栈里,创建这两个对象时,都会存储在堆里,但是存储的位置不同,其对应的地址也是不同的,所以你用"=="和"===",肯定都是false。
引用类型的数据比较的是地址,基本类型的数据比较的才是内容
对象存储在堆里,每个指针对应一个存储位置,他们虽然长得很像,但是指针对应的地址不同,所以不能用"=="更不能"===";顺便提一下,js没有指针的概念,可以借助C中的指针理解
因为他们地址不同。
test1 = {}; test2 = {}; test3 = test2;
其中test1是一个对象,test2和test3是另一个对象。他们只是内容相同,不能说明他们是同一个对象。
var myData1 = {name:"Adam",weather:"sunny"}相当于
var myData1 = {name:"Adam",weather:"sunny"}
var myData1 = new Object();myData1.name = "Adam";myData1.weather = "sunny";
其实就是一个对象的实例,每个实例都指向一块新的内存地址
原始值 (primitives):undefined null boolean number string。对象值 (objects):除了原始值外,其他的所有值都是对象类型的值,包括数组 (array) 和函数 (function) 等。==: 用于一般比较,比较的时候可以进行转换数据类型。 ===` :用于严格比较,只要类型不匹配就返回false。
primitives
undefined
null
boolean
number
string
objects
array
function
因为 == 左边和右边都为对象值,比较的是两个引用值在内存中是否是同一个对象,虽然myData1 与 myData2值相同,但确是两个互不相关的对象,自然 == 为false。
==
false
其实 == 都返回了false,对于 === 自然也是false,判断依据同是两个值引用的不是同一个对象
===
判断两个对象值是否相同就是看引用地址是否相同。
== 与 === 的区别在处理原始值的时候是有区别的,而对于两边都是对象值时就相同了。参考地址:[1]
参考资料:[2]
相等操作符(==)会强行转换类型。1.如果一边是对象,另一边不是,那么会按照调用valueOf、toString方法返回基本类型数值,如果没有,则为NaN。2.如果两边都是对象,那么就看引用的对象是否相同。显然这两个对象只是数值一样,但是指针是不同的,所以用(==)判断是false
valueOf、toString
NaN
而(===)全等操作符不会转换类型,是一种严格比较,既然引用的指针都不同,那么(===)肯定就是false。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
js中
{}、[]指向的是内存中的一个地址,{}、[]进行比较的时候=判断的是地址是否相等,而不是内容对象存储在堆,指向该对象的指针(地址)存储在栈里,创建这两个对象时,都会存储在堆里,但是存储的位置不同,其对应的地址也是不同的,所以你用"=="和"===",肯定都是false。
引用类型的数据比较的是地址,基本类型的数据比较的才是内容
对象存储在堆里,每个指针对应一个存储位置,他们虽然长得很像,但是指针对应的地址不同,所以不能用"=="更不能"===";顺便提一下,js没有指针的概念,可以借助C中的指针理解
因为他们地址不同。
其中test1是一个对象,test2和test3是另一个对象。
他们只是内容相同,不能说明他们是同一个对象。
var myData1 = {name:"Adam",weather:"sunny"}相当于
其实就是一个对象的实例,每个实例都指向一块新的内存地址
关键字说明:
原始值 (
primitives):undefinednullbooleannumberstring。对象值 (
objects):除了原始值外,其他的所有值都是对象类型的值,包括数组 (array) 和函数 (function) 等。==: 用于一般比较,比较的时候可以进行转换数据类型。
===` :用于严格比较,只要类型不匹配就返回false。
myData1 == myData2
因为
==左边和右边都为对象值,比较的是两个引用值在内存中是否是同一个对象,虽然myData1 与 myData2值相同,但确是两个互不相关的对象,自然==为false。myData1 === myData2
其实
==都返回了false,对于===自然也是false,判断依据同是两个值引用的不是同一个对象小结:
判断两个对象值是否相同就是看引用地址是否相同。
==与===的区别在处理原始值的时候是有区别的,而对于两边都是对象值时就相同了。参考地址:[1]
参考资料:[2]
相等操作符(==)会强行转换类型。
1.如果一边是对象,另一边不是,那么会按照调用
valueOf、toString方法返回基本类型数值,如果没有,则为NaN。2.如果两边都是对象,那么就看引用的对象是否相同。
显然这两个对象只是数值一样,但是指针是不同的,所以用(==)判断是
false而(===)全等操作符不会转换类型,是一种严格比较,既然引用的指针都不同,那么(===)肯定就是
false。