这里完全是菜鸟,我目前正在 javascript 中学习正则表达式。我有一个函数应该从字符串中选择 0 到 9 之间的数字。只要它搜索的变量有字母或数字,该函数就可以正常工作,但是当输入空值时,它会给出以下错误:
未捕获:类型错误:无法读取 null 的属性 'toString'
我该如何解决这个问题?提前致谢。
代码如下:
var lause = "s0m3 p30pl3";
function tulostanumerot();
var numerot = /[0-9]/g;
var testi = numerot.test(0-9);
var setti = lause.match(numerot);
if (testi === true) {
console.log(setti.toString());
}
else {
console.log("Ei numeroita!");
};
答案 0 :(得分:2)
如果未找到匹配项,则 String.prototype.match() 返回 null
。
所以,你有两个选择来处理这个
setti
是否有真值,你可以像这样 if(setti)
。(?.)
就像 setti?.toString()
, .答案 1 :(得分:1)
如果您执行一些 console.log
计算,您会看到 lause.match()
返回找到匹配项的数字数组。
就您而言:
["0", "3", "3", "0", "3"]
您收到错误消息,因为如果未找到匹配项,setti
将为空。我们可以像这样检查它。
if (setti) {
// Setti is not undefined
}
那么如果你想将元素组合成一个字符串,你可以使用 .join
代替。
if (setti) {
console.log(setti.join());
} else {
console.log("Ei numeroita!");
};
完整代码:
var lause = "s0m3 p30pl3";
function tulostanumerot() {
var numerot = /[0-9]/g;
var setti = lause.match(numerot);
if (setti) {
console.log(setti.join(""));
} else {
console.log("Ei numeroita!");
};
}
var lause = "s0m3 p30pl3";
tulostanumerot()
var lause = "no numbers here";
tulostanumerot()
答案 2 :(得分:1)
关于您的代码的一些说明:
方法test()接受一个字符串参数,这使得这不正确var testi = numerot.test(0-9);
代码不在函数function tulostanumerot();
内
你可以完全省略testi
,只使用setti
请注意,match() 返回数组或 null,因此您可以使用 if (setti) {
而不是检查是否为 true
代码可能看起来像
function tulostanumerot() {
var numerot = /[0-9]/g;
var setti = lause.match(numerot);
if (setti) {
console.log(setti.toString());
} else {
console.log("Ei numeroita!");
}
}
tulostanumerot();
function tulostanumerot(lause) {
var numerot = /[0-9]/g;
var setti = lause.match(numerot);
if (setti) {
console.log(setti.toString());
} else {
console.log("Ei numeroita!");
}
}
[
"s0m3 p30pl3",
"",
"test"
].forEach(v => tulostanumerot(v));
答案 3 :(得分:0)
有几种方法可以检查这一点。而且应该不难在网上找到任何东西:)
if(lause) //Will check if there is any value to the string, which is a non false value. Example: 0, null, undefined false will all fail this statement
OR
if(typeof lause !== "undefined") //Simple but will also pass Arrays and objects
if(typeof lause === "string" && typeof lause === "number") //Will only be passed if matching. So if the variable is a array or object it will not be passed