.length是对JavaScript数组的合适调用吗?

Is .length an appropriate call to a JavaScript array?

本文关键字:调用 是对 JavaScript 数组 length      更新时间:2023-09-26

由于某些原因,我无法获得数组的长度(如果未填充则未定义,对吧?)

define(function() {
  'use strict';
  var self = {},
    events = {};
  self.publish = function publish(eventName, data) {
    var subscribers, x, length;
    if (events[eventName]) {
      return false;
    }
    subscribers = events[eventName];
    for (x = 0, length = subscribers.length || 0; x < length; x += 1) {
      subscribers[x](data);
    }
    return true;
  };
  self.subscribe = function subscribe(eventName, func) {
    if (!events[eventName]) {
      events[eventName] = [];
    }
    events[eventName].push(func);
  };
  return self;
});

JSLint说:"期望';'而看到','。"TypeError: Cannot read property 'length' of undefined"

为什么长度不设为0?我是否误解了这里的语法和操作?

您在publish函数中缺少一个否定:

self.publish = function publish(eventName, data) {
    var subscribers, x, length;
    if (events[eventName]) { // <= Here you exit if there are subscribers, and continue if there arent
      return false;
    }
    subscribers = events[eventName];  // So subscribers is guaranteed to be undefined
    // can't get length (or any property) of undefined
    for (x = 0, length = subscribers.length || 0; x < length; x += 1) {
...

这会导致测试失败。应该这样做:

self.publish = function publish(eventName, data) {
    // you can use const and let
    // you are storing subscribers in a variable anyway, so why not doing it
    // before the check?
    const subscribers = events[eventName];
    if (!subscribers) {
      return false;
    }
    // you don't need to cache length in a variable, iirc it only improves performance slightly on IE browsers
    // neither need you `|| 0`
    // there other ways iterating through an array, see for..of and Array.prototype.forEach
    for (let x = 0; x < subscribers.length; x++) {
      subscribers[x](data);
    }
    return true;
};

如果没有填充,它是未定义的,对吧?

不,如果数组为空,则数组长度为零。当读取对象的缺失属性时,会得到一个未定义,但是数组的长度始终是一个数字。

我认为问题出在这一行:

for (x = 0, subscribers.length || 0; x < length; x += 1) {

你定义了变量"length",但是没有对它初始化/赋值。

在细节:

subscribers.length || 0

这个应该做什么?

x < length
x < length or x < subscribers.length?

事实证明,当我修复了错字后,代码工作得很好。

if (events[eventName]) {

应该是

if (!events[eventName]) {

修正后一切都按预期进行。我的调试问题总是一些愚蠢的小问题

就像Don Bhrayan Singh说的

你的代码应该是
for (var x = 0, length = subscribers.length || 0; x < length; x += 1) {
  subscribers[x](data);
}

您之前的代码将像这样运行

// x = 0,           0           ; x < undefined; x += 1
for (x = 0, subscribers.length || 0; x < length; x += 1)     {
  subscribers[x](data);
}