【问题标题】:JavaScript apply reading strings as arraysJavaScript 将读取字符串作为数组应用
【发布时间】:2017-01-01 17:17:57
【问题描述】:

我在入门课程之后尝试使用 apply 方法,发现了一些奇怪的行为 - 它将字符串作为字符数组读取,而不是读取字符串数组。

var john = {
  name: 'John',
  age: 26,
  job: 'teacher',
  listActivities: function(actList){
    for (var i=0; i < actList.length; i++){
      console.log("I enjoy "+actList[i]);
    }
  },
  presentation: function(style, timeOfDay){
    if(style=="formal"){
      console.log('Good ' + timeOfDay + ' Ladies and Gentlemen! I\'m ' +this.name+', I\'m '+this.age+' and I\'m a '+this.job);
    }
    if(style=="friendly"){
      console.log('Hi! How\'s it going? I\'m ' + this.name +', I\'m '+this.age+' and I\'m a '+this.job +'. Have a great '+timeOfDay);
    }
  }
};

var emily = {
  name: 'Emily',
  age: '35',
  'job': 'designer'
};

john.presentation('formal','morning');

john.presentation.call(emily, 'friendly', 'afternoon');
john.listActivities(["golf", "Stroking animals", "Monty Python"]);
john.listActivities.apply(emily,["knitting", "cooking", "Monty Python"]);

John 列出活动的调​​用按预期工作。应用调用产生了

I like k
I like n

... 等到第一个单词的结尾。我知道字符串通常被实现为字符数组,但我不明白为什么它们在这里的访问方式如此不同。发生了什么事,我该如何解决?

【问题讨论】:

  • 字符串被视为类似数组的对象,因为它具有.length 和数字索引。因此,您可以循环迭代它。 apply 方法将值数组传播到各个参数中,因此您在 actList 参数处引用 "knitting"
  • @squint:甚至不是这样。这只是 OP 误解了 apply 的作用。 :-)
  • @T.J.Crowder:这将是我评论中的最后一句话。 ;-)
  • 是的,我所遵循的教程的措辞有点模棱两可,关于 apply 期望一个数组作为参数 - 这现在更清楚了!谢谢大家。

标签: javascript arrays string apply


【解决方案1】:

您正在使用.apply() 调用listActivities() 函数:

john.listActivities.apply(emily,["knitting", "cooking", "Monty Python"]);

这意味着第一个参数actList 将是"knitting"。您的代码将参数视为数组,当您对字符串执行此操作时,您将获得字符串中的字符列表。

您的函数似乎需要一个数组,因此没有理由使用 .apply() 来调用它:

john.listActivities(["knitting", "cooking", "Monty Python"]);

这个函数无论如何都不依赖this,所以真的没有理由使用.call().apply()

【讨论】:

    【解决方案2】:

    原因是apply 期望您将参数传递给它并打包在一个数组中。因此,如果您将数组传递给它,则需要像这样将调用更改为apply

    john.listActivities.apply(emily,[["knitting", "cooking", "Monty Python"]]);
    

    Learn more about apply

    【讨论】:

      【解决方案3】:

      listActivities 中仅列出了一个参数。您可以使用 rest 参数返回预期结果

        listActivities: function(...actList) {   
          for (var i = 0; i < actList.length; i++) {
            console.log("I enjoy " + actList[i]);
          }
        }
      

      jsfiddle https://jsfiddle.net/ktzrnsph/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-14
        • 2011-05-02
        • 1970-01-01
        • 2017-03-19
        • 2013-02-13
        • 2019-05-31
        • 2013-03-07
        相关资源
        最近更新 更多