开发者问题收集

未捕获:TypeError:无法读取 null 的属性“toString”

2021-08-01
6634

我是菜鸟,目前正在学习 JavaScript 中的正则表达式。我有一个函数,该函数应该从字符串中选择 0 到 9 之间的数字。只要搜索的变量包含字母或数字,该函数就可以正常工作,但是当输入空值时,它会给出以下错误:

未捕获:TypeError:无法读取 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!");
};
3个回答

如果未找到匹配项,则 String.prototype.match() 返回 null

因此,您有两个选项可以处理此问题

  1. 检查 setti 是否具有真值,您可以像这样 if(setti)
  2. 使用 可选链 (?.) ,例如 setti?.toString() ,。
Harsh Saini
2021-08-01

关于您的代码的一些说明:

  • 方法 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));
The fourth bird
2021-08-01

如果您执行一些 console.log ging,您将看到 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()
lejlun
2021-08-01