Javascript IF条件“;数组==[]“0”;及;array.length==0";

Javascript IF条件“;数组==[]“0”;及;array.length==0";,javascript,arrays,Javascript,Arrays,我是JS的初学者。我正在编写一个接收输入数组的方法,需要检查它是否为空。我的第一种方法是在方法内部的if语句中使用array==[]作为条件,但它不起作用。当我编写条件array.length==0时,它会工作。我认为它们的意思是一样的。有人能解释为什么前者不起作用吗? 提前感谢。比较 if (array === []) if ([] === []) 比较两个对象的标识。一个对象永远不会与另一个不同的对象相等(相同),至少在JavaScript中定义“相等”的意义上是如此。JavaScrip

我是JS的初学者。我正在编写一个接收输入数组的方法,需要检查它是否为空。我的第一种方法是在方法内部的if语句中使用
array==[]
作为条件,但它不起作用。当我编写条件
array.length==0
时,它会工作。我认为它们的意思是一样的。有人能解释为什么前者不起作用吗? 提前感谢。

比较

if (array === [])
if ([] === [])
比较两个对象的标识。一个对象永远不会与另一个不同的对象相等(相同),至少在JavaScript中定义“相等”的意义上是如此。JavaScript中的对象比较通常只是一个测试,以查看某个表达式是否引用某个特定的已知对象。比较不会“查看”被比较对象的内部

一个可能不明显的细节是表达式
[]
不是对某个全局的、概念性的“空数组”的引用;这是一个创建全新空数组的请求。因此,比较也是如此

if (array === [])
if ([] === [])

将为false,因为在
===
操作符的两侧创建了一个新的、不同的数组。

因为
数组===[]
正在比较两个对象是否相同。在JS中,当两个对象完全相同时,两个对象是相同的。检查两个对象是否完全相同的唯一方法是它们是否在内存中占用相同的空间

我们该怎么做?我们检查两个对象是否指向相同的内存地址。在其他编程语言中,他们称这个内存地址为指针

因为
[]
正在动态创建一个对象,所以它是一个新对象,因此比较返回false


另一方面,
array.length===0
将与基元值(数字)进行比较,在JS中,如果两个基元值的内容相同,则返回true。

第一个检查:
array===[]
检查两个数组是否属于同一类型(检查),以及它们是否属于同一数组。 结果为假的原因是:

  • 虽然它们都是数组
  • 虽然它们都是空的
  • 它们不是相同的数组(
    数组
    存储在位置A中,
    []
    存储在其他位置
这是由javascript如何处理数组和对象引起的:javascript不检查内容,它只检查它们是否指向内存中的相同数组或对象。这就是为什么必须使用第二个选项

更详细的例子:

// for strings and numbers, javascript checks CONTENT
let a = 'Bill';
let b = 'Bill';
console.log(a === b);   // TRUE

// for arrays and objects, javascript checks POINTERS
let a = ['Bill'];
let b = ['Bill'];
console.log(a === b);   // FALSE

// also:
var a = ['Bill'];
var b = a;
console.log(a === b);   // TRUE

a = ['Joe'];
console.log(a === b);   // TRUE
console.log(b);         // 'Joe'

检查
.length
属性是否为零。不,它不是“表示”同一件事。:“一个对象永远不等于另一个对象”对于初学者来说不是很清楚<代码>一个对象=窗口;另一个对象=窗口;一个对象===另一个对象。可能值得详细说明(类似于“相同的内存地址”等)。@georg这就是为什么我添加了“查看内部”这一部分,但我还是添加了一些单词。@georg在这一点上,如果初学者能够看完这整页,但仍然没有理解它,我会非常惊讶:)@Pointy非常感谢,现在使用正确的数组方法是有意义的@特奥维很乐意帮忙!另外,
([]=[])
看起来像一张机器人脸。回答得很好。严格地说,这是值得指出的。数组在JS中被视为对象。