【问题标题】:Why if JavaScript array.split(' ').push('something') returns number, but not array? [duplicate]为什么如果 JavaScript array.split(' ').push('something') 返回数字而不是数组? [复制]
【发布时间】:2014-09-02 06:18:17
【问题描述】:

为什么obj.className = obj.className.split(' ').push(cls) - 在 obj.className 中写入数字,而不是数组?

我有代码:

var obj = {
                className: "math lol"
          }

function addClass(obj, cls){
    if(!(cls in obj.className.split(' ')))
        obj.className = obj.className.split(' ').push(cls);
}

addClass(obj, 'PH');
alert(obj.className);

为什么alert(obj.className)显示3,而不显示数组['math', 'lol', 'PH']

【问题讨论】:

  • 投票结束:RTFM
  • push 返回对象添加后数组的新长度

标签: javascript arrays


【解决方案1】:

Push 返回集合中的项目数,而不是集合本身。

试试:

var currentItems = obj.className.split(' '); currentItems.push(cls); obj.className = currentItems

而不是: obj.className = obj.className.split(' ').push(cls);

【讨论】:

  • 明确地将代码格式化为和.join 可能会有所帮助。
【解决方案2】:

JavaScript 'push()' 方法返回新数组的长度。这就是为什么当您分配 obj.className 时,它​​的值变为 3。为了修复它,请执行以下操作:

var obj = {
                className: "math lol"
          }

function addClass(obj, cls){
    alert(obj.className.split(' '));
    if(!(cls in obj.className.split(' '))) {
        obj.className = obj.className.split(' '); //first splitting (NOT ASSIGNING THE LENGTH)
        obj.className.push(cls);  //then pushing
    }
}

addClass(obj, 'PH');
alert(obj.className);

DEMO

【讨论】:

    【解决方案3】:

    试试:

    obj.className = obj.className.split(' ');
    obj.className.push(cls);
    

    代替:

    obj.className = obj.className.split(' ').push(cls);
    

    .push() 返回元素个数并影响对象。

    将来,在进行故障排除时尝试将您的代码分成更小的部分,例如:

    console.log(obj);
    console.log(obj.className)
    console.log(obj.className.split(' '));
    console.log(obj.className.split(' ').push(cls));
    

    这清楚地表明了该级联中的问题所在。

    【讨论】:

      【解决方案4】:

      除了不分配数组推送的结果来取回数组(正如其他人指出的那样,推送后返回数组中值的数量),您也不想使用@987654321 @ 判断要检查的值是否已经在数组中。您通常使用in 来检查对象上是否存在属性,但如果您要将它与数组一起使用,那么您将使用它来检查值是否位于给定索引处:

      var list = ['AB', 'BC', 'CD'];
      if (2 in list) {
        // if there is a value at index 2 of list, then this evaluates
      }
      

      相反,您可以在已有的字符串上使用 indexOf:

      if (obj.className.indexOf(cls) === -1) {
        obj.className += ' ' + cls;
      }
      

      您也可以使用 indexOf 检查数组中的值,但您的支持矩阵是现代浏览器(没有 IE8,除非您对其进行填充。)通过使用 in 进行检查,您的条件将始终评估为 true(因为你在否定一些总是错误的东西)并且你总是会添加这个类,不管它是否已经存在。

      【讨论】:

        【解决方案5】:

        在你必须使用的 javascript 数组中

        console.log(obj.className);
        

        打印一个数组

        【讨论】:

        • 这没有帮助。由于 push() 的返回类型,您仍然会看到 obj.className 是一个 int。请参阅下面的答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-28
        • 1970-01-01
        • 1970-01-01
        • 2011-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多