Answers:
从概念上讲,JavaScript中的数组包含array.length
从array[0]
直到的元素array[array.length - 1]
。如果索引介于之间(包括两端),i
则将具有索引的数组元素定义为数组的一部分。如果我不在此范围内,则不在数组中。i
0
array.length - 1
因此,从概念上讲,数组是线性的,从零开始并达到最大值,而没有任何机制可以使在没有条目的那个范围内具有“间隙”。要找出给定位置索引(索引为0或正整数)是否存在值,您只需使用
if (i >= 0 && i < array.length) {
// it is in array
}
现在,在引擎盖下,JavaScript引擎几乎肯定不会像这样线性且连续地分配数组空间,因为在动态语言中这没有多大意义,并且对于某些代码而言效率不高。它们可能是哈希表或策略的某种混合体,并且数组的未定义范围可能未分配给它们自己的内存。但是,JavaScript语言希望将array.length
n的数组表示为具有n个成员,它们的名称为0到n-1,并且此范围内的任何内容都是该数组的一部分。
但是,您可能想知道的是,数组中的值是否实际上是已定义的内容 -即不是undefined
。也许你甚至想知道,如果它的定义,不是null
。可以在不设置成员值的情况下将其添加到数组中:例如,如果通过增加array.length
属性来添加数组值,则任何新值将为undefined
。
确定给定值是否有意义或已定义。也就是说,不是 undefined
或null
:
if (typeof array[index] !== 'undefined') {
要么
if (typeof array[index] !== 'undefined' && array[index] !== null) {
有趣的是,由于JavaScript的比较规则,我的最后一个示例可以优化为:
if (array[index] != null) {
// The == and != operators consider null equal to only null or undefined
}
length
属性,在这种情况下,后两个示例更为合适。
foo !== 'undefined' && foo !== null
为foo != null
0
to到的所有元素array.length - 1
。但是,并非所有这些值都是定义值。如果在数组成员上使用delete关键字,它将将该成员设置回未定义状态,就像您通过增加其array.length参数扩展数组一样,新值将以未定义状态开始。实际上,JavaScript实现可能会优化数组存储,并且某些或所有未定义的值可能不会占用任何内存。
new Array(1)[0] === undefined
但该值为空。 [undefined][0] === undefined
但该值已设置;数组有一个值。唯一完美的答案被使用in
或hasOwnProperty()
- idx in array
或array.hasOwnProperty(idx)
:--per这个答案stackoverflow.com/a/39171620/3120446
我们不能只是这样做:
if(arrayName.length > 0){
//or **if(arrayName.length)**
//this array is not empty
}else{
//this array is empty
}
if(arrayName.length) {...
有什么区别?
if(arrayName.length) {...
失败null
[undefined, undefined]
这与长度= 2的阵列
仅使用.length
不安全,并且会在某些浏览器中导致错误。这是一个更好的解决方案:
if(array && array.length){
// not empty
} else {
// empty
}
或者,我们可以使用:
Object.keys(__array__).length
if(!arrayName[index]){
// do stuff
}
if(arrayName.length > index && arrayName[index] !== null) {
//arrayName[index] has a value
}
x == null
仅对null或undefined会为true,否则为true。同样,x != null
对于任何不为null或未定义的内容,则为true。除非您特别需要寻找未定义的内容,否则请依靠隐式转换的好处。
简短而通用的方法
如果要检查任何数组是否具有伪造的值(例如false,undefined,null或空字符串),则可以使用every()方法,如下所示:
array.every(function(element) {return !!element;}); // returns true or false
例如:
['23', null, 2, {key: 'value'}].every(function(element) {return !!element;}); // returns false
['23', '', 2, {key: 'value'}].every(function(element) {return !!element;}); // returns false
['23', true, 2, {key: 'value'}].every(function(element) {return !!element;}); // returns true
如果需要获取虚假值的第一个索引,可以这样做:
let falsyIndex;
if(!['23', true, 2, null, {key: 'value'}].every(function(element, index) {falsyIndex = index; return !!element;})) {
console.log(falsyIndex);
} // logs 3
如果只需要检查给定索引的数组的伪造值,则可以这样进行:
if (!!array[index]) {
// array[index] is a correct value
}
else {
// array[index] is a falsy value
}
if(typeof arr ==='object' && arr instanceof Array ){
if(!arr.length){
println 'empty'
}else{
printn 'not Empty'
}
}else{
println 'Null'
}
如果用'Null'表示->其元素为null或等于'',在这种情况下:在过滤所有'null'元素后检查数组是否为空
if(!arr.clean().length){return 'is null'}
当然,请在以下位置添加Clean 方法:
Array.prototype.clean=function(){return this.filter(function(e){return (typeof e !=='undefined')&&(e!= null)&&(e!='')})}
我建议创建这样的函数:
function isEmptyEl(array, i) {
return !(array[i]);
}
您可以这样称呼它:
if (isEmptyEl(arrayName, indexVal)) {
console.log('arrayName[' + indexVal + '] is empty');
}
强制开发人员遵守isEmptyEl接口将捕获输入错误,例如未定义的arrayName或indexVal变量。
(通常,在使用Javascript进行编程时,最好进行防御性编程。)
如果未定义arrayName,则会引发如下错误:
Uncaught ReferenceError: arrayName is not defined
at <anonymous>:2:15
at Object.InjectedScript._evaluateOn (<anonymous>:895:140)
at Object.InjectedScript._evaluateAndWrap (<anonymous>:828:34)
at Object.InjectedScript.evaluate (<anonymous>:694:21)
未定义indexVal的结果相似。
如果数组或索引值不存在,则会出现错误。
对于有效输入,只有在arrayName [indexVal]为以下任意一项时,您才会获得true:
这取决于您对“空”的含义。
当您尝试获取不具有该名称的属性的对象的属性值时,您将获得该值 undefined
。
稀疏数组就是这种情况:并非所有在0
和之间的索引都array.length-1
存在。
因此,您可以检查是否array[index] === undefined
。
但是,该属性index
可以带有undefined
值存在。如果要过滤掉这种情况,可以使用in
运算符或hasOwnProperty
,如如何检查对象在JavaScript中是否具有属性中所述。
index in array;
array.hasOwnProperty(index);
如果要考虑不存在具有undefined
或null
值的现有属性,则可以使用松散比较array[index] == undefined
或array[index] == null
。
如果你知道数组不疏,你可以比较index
使用array.length
。但是为了安全起见,您可能要确保index
确实是数组索引,请参阅检查属性名称是否为数组索引
好的,首先让我们看看如果JavaScript中不存在数组值会发生什么,所以如果我们有一个如下所示的数组:
const arr = [1, 2, 3, 4, 5];
现在我们检查索引5处是否有6:
arr[5];
我们得到
undefined
...
因此,这基本上给了我们答案,这是检查是否未定义的最佳方法,如下所示:
if("undefined" === typeof arrayName[index]) {
//array value is not there...
}
在这种情况下最好不要这样做:
if(!arrayName[index]) {
//Don't check like this..
}
因为想象一下我们有这个数组:
const arr = [0, 1, 2];
我们做:
if(!arr[0]) {
//This get passed, because in JavaScript 0 is falsy
}
因此,正如您所看到的,即使那里是0,也不会被识别,还有其他一些事情可以做到这一点,并使您的应用程序出现故障,因此请小心,我将它们全部列出:
undefined
''
我想指出一些似乎遗漏的东西:即有可能在数组的中间有一个“空”的数组位置。考虑以下:
let arr = [0, 1, 2, 3, 4, 5]
delete arr[3]
console.log(arr) // [0, 1, 2, empty, 4, 5]
console.log(arr[3]) // undefined
然后检查的自然方法是查看数组成员是否未定义,我不确定是否存在其他方法
if (arr[index] === undefined) {
// member does not exist
}
我认为此决定适合于喜欢声明式功能编程而不是命令式OOP或程序的人。如果您的问题是“ 内部是否存在某些值?(真值还是假值)”,则可以使用.some
方法来验证内部值。
[].some(el => el || !el);
function isEmpty(arr) { ... }
。[].length
导致0
危险。[].length > 0
说“长度大于零?”。高级示例:
[ ].some(el => el || !el); // false
[null].some(el => el || !el); // true
[1, 3].some(el => el || !el); // true
您可以使用Loadsh库更有效地执行此操作,例如:
如果您有一个名为“ pets”的数组,例如:
var pets = ['dog', undefined, 'cat', null];
console.log(_.isEmpty(pets[1])); // true
console.log(_.isEmpty(pets[3])); // true
console.log(_.isEmpty(pets[4])); // false
_.map( pets, (pet, index) => { console.log(index + ': ' + _.isEmpty(pet) ) });
要检查所有数组值是否为空或未定义的值:
var pets = ['dog', undefined, 'cat', null];
console.log(_.isEmpty(pets[1])); // true
console.log(_.isEmpty(pets[3])); // true
console.log(_.isEmpty(pets[4])); // false
_.map( pets, (pet, index) => { console.log(index + ': ' + _.isEmpty(pet) ) });
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
在http://underscorejs.org/中查看更多示例
fn(){}
是语法错误,目前尚不清楚这如何帮助检查数组项是否存在于特定索引处。