我有这段代码:
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)
这怎么可能?我想我已经占了一切。
答案 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
转换为字符串的三种方法是:
这里需要注意的是,如果值为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
/ False
,Undefined
/ Null
,Numbers
和Strings
,任何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
观看了一段时间后,我了解到我试图使用数组而不是字符串来执行此操作,因此我从该数组中删除了[],现在它没有显示任何错误。