Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么[]=[]和{}=={}返回false,尽管[]和{}是真值?_Javascript_Arrays_Object - Fatal编程技术网

Javascript 为什么[]=[]和{}=={}返回false,尽管[]和{}是真值?

Javascript 为什么[]=[]和{}=={}返回false,尽管[]和{}是真值?,javascript,arrays,object,Javascript,Arrays,Object,在js中,falsy值是0、null、未定义、false、NaN和“”,其他所有值都是真实的。 因此,这意味着[]和{}也是真实值,但当比较[]=={}或[]=[]或{}={}时,返回的值为false,这是为什么?如果两个事物是“真实的”,并不意味着它们是“相等”或“相同”的 例如,5和6都是“真实的”,但是如果你发现(5==6)==false,你不会感到惊讶吧 JavaScript中的表达式[]表示“创建一个新数组”。如果连续两次执行此操作,则表示“创建一个数组,然后创建另一个数组”。如果比较

在js中,falsy值是0、null、未定义、false、NaN和“”,其他所有值都是真实的。 因此,这意味着[]和{}也是真实值,但当比较
[]=={}
[]=[]
{}={}
时,返回的值为false,这是为什么?

如果两个事物是“真实的”,并不意味着它们是“相等”或“相同”的

例如,
5
6
都是“真实的”,但是如果你发现
(5==6)==false
,你不会感到惊讶吧

JavaScript中的表达式
[]
表示“创建一个新数组”。如果连续两次执行此操作,则表示“创建一个数组,然后创建另一个数组”。如果比较这两个数组,为什么期望它们是相同的呢

类似地,表达式
{}
的意思是“创建一个新对象”,因此如果您这样做两次,那就是两个不同的对象


更深层次的答案是:JavaScript比较“肤浅”。这意味着它不会进入值的“内部”来比较它们的内部,它只比较表面上的内容

对于基本类型(如数字或字符串),比较“在表面”表示“按值比较”。但对于更复杂的值,如数组或对象,“在表面”进行比较意味着“通过引用进行比较”。这就是为什么两个不同但显然相同的对象在比较运算符
=
==
的意义上并不“相等”


有些语言,如C#或Haskell,允许定义(有时自动)自定义的“平等”含义。其他语言,如F#或Ocaml,甚至默认为所有类型提供所谓的“结构平等”(即,将所有内部内容与底部进行比较)。JavaScript不是这类语言之一。

当您键入
[]
时,您实际上是在编写
新数组()
(与
{}
作为
新对象的情况相同)

因此,请这样看:

let x = new Array();
let y = new Array();

你不会期望
x==y
为真,因为它们引用了两个不同的数组。

因为它们引用的对象不同。引用相同的对象意味着?@Pranab-它们是两个相同的数组,而不是相同的数组。对象比较询问它们是否是相同的对象,而不是相同的对象。
[]
(或
{}
)是真实值的事实仅在布尔上下文中相关,此时必须将
[]
强制为布尔值。比较
[]=[]
的计算结果为布尔值,但不是每个
[]
的布尔上下文。是,5==6是false,因为它们的值不同,但在数组或对象中没有值,所以它们是如何返回false的?@Pranab-因为与
==
比较的对象引用仅在引用同一对象时返回
true
。我已修改了答案。@Pranab-这可能会有所帮助,比较数组不会检查数组的内容是否相同,而是检查数组是否相同。注意:
[1,2]==[1,2]
也是错误的,因为它检查数组是否是相同的JavaScript对象,而不是它们是否包含相同的内容。谢谢,我得到了它。。。那么[]==true呢,它们也返回false。意思是如果把任何东西与[]或{}比较,那么每次我都会出错,对吗?谢谢,@Adam,我不知道。