startsWith不是一个我无法理解的函数

时间:2016-08-07 10:06:13

标签: javascript

我有这段代码:

for (var i = 0; i < value.length; i++) {
   if (typeof value[i].keyword == 'undefined' || value[i].keyword == null || value[i].keyword.startsWith(keyword)) {
      out.push(value[i]);
   }
}

我收到一条错误消息:

  

TypeError:r [e] .startsWith不是函数       在js-cf2cc68 ... .min.js.gz:85       at fn(eval at compile(js-cf2cc68 ... .min.js.gz:8),:4:1003)       在js-cf2cc68 ... .min.js.gz:7       at p。$ digest(js-cf2cc68 ... .min.js.gz:7)       at p。$ apply(js-cf2cc68 ... .min.js.gz:7)       在HTMLBodyElement。 (JS-cf2cc68 ... .min.js.gz:9)

这怎么可能?我想我已经占了一切。

7 个答案:

答案 0 :(得分:5)

value [i] .keyword.startsWith(“keyword”)因为start with的参数必须是字符串。 所以这样会更好地运作

for (var i = 0; i < value.length; i++) {
     if (typeof value[i].keyword == String(undefined) || value[i].keyword.startsWith("keyword"))
         out.push(value[i]);
}

答案 1 :(得分:3)

  

有没有办法可以检查它是否是字符串而不是错误?

检查类型?

var out = values.filter(v => v.keyword == null || typeof v.keyword === "string" && v.keyword.startsWith( keyword ));

或只是强制执行

类型
var out = values.filter(v => v.keyword == null || String(v.keyword).startsWith( keyword ));

或者如果您使用desctructuring,您甚至可以使用:

var out = values.filter({keyword: v}) => v == null || String(v).startsWith( keyword ));

我建议您使用Array-methods而不是手动编写循环。

  • 伊莫。它更好地描述了您的意图(适合扫描代码)。

  • 如果这是一条热门路径(它经常被调用),JS优化器可以利用知道,你只是过滤和优化代码。也许通过跳过它在循环期间执行的Array的大量完整性检查。

  • 如果这不是一个热门途径,那么在JS中调用函数几次的性能影响甚至难以衡量。

答案 2 :(得分:1)

我假设value [i] .keyword是一个字符串。旧版浏览器不支持String.prototype.startWith。请参阅browser support

要在旧版浏览器中使用它,您可以使用现有的polyfills之一。另见How to check if a string “StartsWith” another string?

的答案

答案 3 :(得分:1)

在此主题上找到a useful article

转换为字符串的三种方法是:

  1. value.toString()
  2. &#34;&#34; +值
  3. 字符串(值)
  4. 这里需要注意的是,如果值为null或未定义,则方法#1不起作用。

    在我的情况下,由于某种原因,方法#2也不起作用,所以最好的选择是字符串(值)

    var col = "rt_" + rows[i]["results"][r].ResultTypeID.substring(1); //did not work
    
    var col = "rt_" + String(rows[i]["results"][r].ResultTypeID).substring(1);
    

答案 4 :(得分:0)

肯定有一个明显的问题。

(这完全是针对有这样问题的人,但他们并不太了解)

当然,就像许多其他人说的那样,它在类型中。如果您不知道是什么类型(如果您知道这种高级类型的东西,您可能会这样做,但是案例!),它很简单。基本类型为True / FalseUndefined / NullNumbersStrings,任何string类型都是非空或不等于0的数字,如果单独使用true会导致if statement。现在我们已经解决了这个问题,现在该讨论startsWith()了。如果运行console.log("Hey VSauce, Michael here.".startsWith("Hey")),由于字符串以字符串开头的方式,它将向控制台输出true。如果您运行console.log(1234.startsWith(1)),则由于TypeError需要字符串,因此startsWith()会发生。从错误输出中可以看出这是TypeError。因此,上面的问题(已经得到回答)是变量keyword并未定义为字符串,而是任何其他变量,都需要定义为字符串

答案 5 :(得分:0)

我通过调用 value.toString().startsWith(...)

解决了这个问题

答案 6 :(得分:-1)

就我而言,我写过

var a = ["javascript is great"]; 
var b = a.starstswith("java");

我收到此错误

startsWtih is not a function

观看了一段时间后,我了解到我试图使用数组而不是字符串来执行此操作,因此我从该数组中删除了[],现在它没有显示任何错误。