当页面第一次加载时,我需要检查image_array中是否有图像,并加载最后一张图像。

否则,我禁用预览按钮,提醒用户按新的图像按钮,并创建一个空数组来放置图像;

问题是else中的image_array一直被触发。如果一个数组存在-它只是覆盖它,但警报不工作。

if(image_array.length > 0)
    $('#images').append('<img src="'+image_array[image_array.length-1]+'" class="images" id="1" />');
else{
    $('#prev_image').attr('disabled', 'true');
    $('#next_image').attr('disabled', 'true');
    alert('Please get new image');
    var image_array = [];
}

更新 在加载html之前,我有这样的东西:

<?php if(count($images) != 0): ?>
<script type="text/javascript">
    <?php echo "image_array = ".json_encode($images);?>
</script>
<?php endif; ?>

当前回答

检查数组是否为空

一个现代的方式,ES5+:

if (Array.isArray(array) && array.length) {
    // array exists and is not empty
}

老派方法:

typeof array != "undefined"
    && array != null
    && array.length != null
    && array.length > 0

一种紧凑的方式:

if (typeof array != "undefined" && array != null && array.length != null && array.length > 0) {
    // array exists and is not empty
}

CoffeeScript方式:

if array?.length > 0

Why?

情况下定义 未定义变量是一个你还没有给它赋值的变量。

let array = new Array();     // "array" !== "array"
typeof array == "undefined"; // => true

情况下空 一般来说,null是缺少值的状态。例如,当您错过或未能检索某些数据时,变量为空。

array = searchData();  // can't find anything
array == null;         // => true

Case不是数组 Javascript有一个动态类型系统。这意味着我们不能保证变量持有什么类型的对象。有可能我们不是在与Array的实例对话。

supposedToBeArray =  new SomeObject();
typeof supposedToBeArray.length;       // => "undefined"

array = new Array();
typeof array.length;                   // => "number"

Case空数组 现在,由于我们测试了所有其他可能性,我们正在与Array的一个实例对话。为了确保它不是空的,我们询问它所持有的元素的数量,并确保它的元素大于0。

firstArray = [];
firstArray.length > 0;  // => false

secondArray = [1,2,3];
secondArray.length > 0; // => true

其他回答

检查数组是否为空

一个现代的方式,ES5+:

if (Array.isArray(array) && array.length) {
    // array exists and is not empty
}

老派方法:

typeof array != "undefined"
    && array != null
    && array.length != null
    && array.length > 0

一种紧凑的方式:

if (typeof array != "undefined" && array != null && array.length != null && array.length > 0) {
    // array exists and is not empty
}

CoffeeScript方式:

if array?.length > 0

Why?

情况下定义 未定义变量是一个你还没有给它赋值的变量。

let array = new Array();     // "array" !== "array"
typeof array == "undefined"; // => true

情况下空 一般来说,null是缺少值的状态。例如,当您错过或未能检索某些数据时,变量为空。

array = searchData();  // can't find anything
array == null;         // => true

Case不是数组 Javascript有一个动态类型系统。这意味着我们不能保证变量持有什么类型的对象。有可能我们不是在与Array的实例对话。

supposedToBeArray =  new SomeObject();
typeof supposedToBeArray.length;       // => "undefined"

array = new Array();
typeof array.length;                   // => "number"

Case空数组 现在,由于我们测试了所有其他可能性,我们正在与Array的一个实例对话。为了确保它不是空的,我们询问它所持有的元素的数量,并确保它的元素大于0。

firstArray = [];
firstArray.length > 0;  // => false

secondArray = [1,2,3];
secondArray.length > 0; // => true

你应该这样做

    if (!image_array) {
      // image_array defined but not assigned automatically coerces to false
    } else if (!(0 in image_array)) {
      // empty array
      // doSomething
    }

下面是我的解决方案包装在一个函数,也抛出 错误来管理对象范围和所有类型的几个问题 传递给函数的可能数据类型。

这是我用来研究这个问题的小提琴(来源)

var jill = [0];
var jack;
//"Uncaught ReferenceError: jack is not defined"

//if (typeof jack === 'undefined' || jack === null) {
//if (jack) {
//if (jack in window) {
//if (window.hasOwnP=roperty('jack')){
//if (jack in window){

function isemptyArray (arraynamed){
    //cam also check argument length
  if (arguments.length === 0) { 
    throw "No argument supplied";
  }

  //console.log(arguments.length, "number of arguments found");
  if (typeof arraynamed !== "undefined" && arraynamed !== null) {
      //console.log("found arraynamed has a value");
      if ((arraynamed instanceof Array) === true){
        //console.log("I'm an array");
        if (arraynamed.length === 0) {
            //console.log ("I'm empty");
            return true;
        } else {
          return false;
        }//end length check
      } else {
        //bad type
        throw "Argument is not an array";
      } //end type check
  } else {
    //bad argument
    throw "Argument is invalid, check initialization";;
  }//end argument check
}

try {
  console.log(isemptyArray(jill));
} catch (e) {
    console.log ("error caught:",e);
}
if (typeof image_array !== 'undefined' && image_array.length > 0) {
    // the array is defined and has at least one element
}

您的问题可能是由于混合使用了隐式全局变量和变量提升。确保在声明变量时使用var:

<?php echo "var image_array = ".json_encode($images);?>
// add var  ^^^ here

然后确保以后不会意外地重新声明该变量:

else {
    ...
    image_array = []; // no var here
}

可选的链接

随着可选链接提议达到了第4阶段,并得到了更广泛的支持,有一种非常优雅的方式可以做到这一点

if(image_array?.length){

  // image_array is defined and has at least one element

}