Javascript 这段代码是否向foo数组添加了类属性?

Javascript 这段代码是否向foo数组添加了类属性?,javascript,jquery,Javascript,Jquery,下面是一段工作代码。“=true”部分让我感到困惑。这就是我认为正在发生的事情 1-创建空数组。 2-获取所选列表项(目标)并循环。 3-如果目标列表项的类属性不在数组中,则输入if block。 4-为目标列表项添加类属性并添加它们 到阵列 我的理解是javascript使用“push”,jquery使用“add”到 将项插入数组中。下面的代码不使用推送或添加 var foo = []; $($targets).each(function(i) { if (!foo[$(this).a

下面是一段工作代码。“=true”部分让我感到困惑。这就是我认为正在发生的事情

1-创建空数组。
2-获取所选列表项(目标)并循环。
3-如果目标列表项的类属性不在数组中,则输入if block。
4-为目标列表项添加类属性并添加它们 到阵列

我的理解是javascript使用“push”,jquery使用“add”到 将项插入数组中。下面的代码不使用推送或添加

var foo = [];
$($targets).each(function(i) {
    if (!foo[$(this).attr('class')]) {
        foo[$(this).attr('class')] = true;
    }
});

代码有缺陷,如果要使用字符串作为键,则应使用对象而不是数组:

var foo = {};
然后,它会检查对象中的键是否为falsy,尽管您可能希望使用
in
操作符检查键是否严格存在:

$targets.each(function() {
  var klass = this.className; // cache, no need for jQuery
  // if `foo` doesn't have the key `klass` then add it
  if (! (klass in foo)) foo[klass] = true;
});

代码有缺陷,如果要使用字符串作为键,则应使用对象而不是数组:

var foo = {};
然后,它会检查对象中的键是否为falsy,尽管您可能希望使用
in
操作符检查键是否严格存在:

$targets.each(function() {
  var klass = this.className; // cache, no need for jQuery
  // if `foo` doesn't have the key `klass` then add it
  if (! (klass in foo)) foo[klass] = true;
});

除非类名是“1”或“2”之类的数字,否则不能以这种方式访问数组中的项。也就是说,数组是从对象构建的。例如,你可以这样做:

var foo = ['a', 'b', 'c'];
foo.bar = 'hello';

foo;
//=> ['a', 'b', 'c']

foo[0];
//=> 'a';

foo['bar'];
//=> 'hello';

因此,您的脚本没有将这些项添加到实际数组中。相反,它将它们分配给数组,就像它是一个普通的JavaScript对象一样。

除非类名是像“1”或“2”这样的数字,否则不能以这种方式访问数组中的项。也就是说,数组是从对象构建的。例如,你可以这样做:

var foo = ['a', 'b', 'c'];
foo.bar = 'hello';

foo;
//=> ['a', 'b', 'c']

foo[0];
//=> 'a';

foo['bar'];
//=> 'hello';

因此,您的脚本没有将这些项添加到实际数组中。相反,它将它们分配给数组,就像它是一个常规JavaScript对象一样。

当您使用console.log(foo)。。。?我现在明白了。foo['something']=true;语法把我弄糊涂了。我现在看到它是一个键值对,正如这里所解释的,当您使用console.log(foo)。。。?我现在明白了。foo['something']=true;语法把我弄糊涂了。我现在看到它是一个键值对,就像这里解释的一样,哈哈,类似的问题,你也在它上面创建属性……哈哈,你是对的。应该注意的是,这通常不是使用数组的正确方法。如果你不打算用有序的项目填充它,最好使用一个对象。哈哈,类似的问题,你也正在创建它的属性…哈哈,你是对的。应该注意的是,这通常不是使用数组的正确方法。如果您不打算用有序项填充它,那么最好使用对象。