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