Javascript node.js数组检查失败,即使在返回false时也无法处理条件
node.js中有一个缓冲区,我正在用正则表达式检查mime类型。Javascript node.js数组检查失败,即使在返回false时也无法处理条件,javascript,arrays,regex,node.js,null,Javascript,Arrays,Regex,Node.js,Null,node.js中有一个缓冲区,我正在用正则表达式检查mime类型。 regex中有一个捕获组,如果成功,它必须在exec返回的数组中的索引1处返回该捕获组 我正在使用 if(mime.exec(dt)[1]){ tip.push(mime.exec(dt)[1]); } 这个控制,我也试过了 if(1 in mime.exec) 而且 mime.exec.hasOwnProperty(1) 但无论如何,该条件已被处理并提供了回溯 TypeError: Cannot read pr
regex中有一个捕获组,如果成功,它必须在exec返回的数组中的索引1处返回该捕获组 我正在使用
if(mime.exec(dt)[1]){
tip.push(mime.exec(dt)[1]);
}
这个控制,我也试过了
if(1 in mime.exec)
而且
mime.exec.hasOwnProperty(1)
但无论如何,该条件已被处理并提供了回溯
TypeError: Cannot read property '1' of null
我可以使用什么样的机制来解决此问题
更新----
var mime=/^内容类型:(.+\S)/igm
更新----
如果没有更多的上下文(特别是
mime
的值是如何分配的),很难准确地说出发生了什么,但我们可以肯定地说:mime.exec
在代码执行时mime.exec.hasOwnProperty(1)
为null
。因此,启动一个调试器,观察mime
的值,看看发生了什么。没有更多的上下文(特别是mime
的值是如何分配的),很难准确地说出发生了什么,但我们可以肯定地说:mime.exec
在代码执行时是null
mime.exec.hasOwnProperty(1)
。因此,启动一个调试器,观察mime
的值,看看发生了什么。问题是您的正则表达式设置了全局标志-compare。因此,当您第一次调用mime.exec(dt)
时,它会匹配某些内容并推进mime.lastIndex
属性,但当您第二次调用mime.exec(dt)
时,它在dt
字符串中找不到第二个匹配项
所以有两件事要做:
- 当您只想进行一次匹配时,不要将其设置为
正则表达式。全局
或者,如果您计划重用该对象(如示例中的多次回调调用),请确保在(m=regex.exec(input))期间耗尽搜索(通常)或重置
regex.lastIndex=0代码>每次
- 不要调用
两次,只需将结果存储在变量中即可exec()
.exec()
可能根本不会返回数组,但当它与任何内容都不匹配时,null
可能会返回数组,因此您必须使用
var match = mime.exec(dt);
if (match) // possibly `&& match[1]` if you need to ensure that no empty string was captured
tip.push(match[1]);
问题是您的正则表达式设置了全局标志-compare。因此,当您第一次调用
mime.exec(dt)
时,它会匹配某些内容并推进mime.lastIndex
属性,但当您第二次调用mime.exec(dt)
时,它在dt
字符串中找不到第二个匹配项
所以有两件事要做:
- 当您只想进行一次匹配时,不要将其设置为
正则表达式。全局
或者,如果您计划重用该对象(如示例中的多次回调调用),请确保在(m=regex.exec(input))期间耗尽搜索(通常)或重置
regex.lastIndex=0代码>每次
- 不要调用
两次,只需将结果存储在变量中即可exec()
.exec()
可能根本不会返回数组,但当它与任何内容都不匹配时,null
可能会返回数组,因此您必须使用
var match = mime.exec(dt);
if (match) // possibly `&& match[1]` if you need to ensure that no empty string was captured
tip.push(match[1]);
改变这个
if (mime.exec(dt)[1]) {
对此
if (mime.exec(dt) && mime.exec(dt)[1]) {
exec
返回null或数组——首先测试null,因为不能将null视为数组
编辑:如评论中所述,如果使用全局正则表达式,可能需要记住其他注意事项
因此,对于全局正则表达式,超级安全版本:
var rslt = mime.exec(dt)
if (rslt && rslt[1]) {
tip.push(rslt[1]);
改变这个
if (mime.exec(dt)[1]) {
对此
if (mime.exec(dt) && mime.exec(dt)[1]) {
exec
返回null或数组——首先测试null,因为不能将null视为数组
编辑:如评论中所述,如果使用全局正则表达式,可能需要记住其他注意事项
因此,对于全局正则表达式,超级安全版本:
var rslt = mime.exec(dt)
if (rslt && rslt[1]) {
tip.push(rslt[1]);
我在post@trott下添加mime变量,在赋值和检查属性之间的某个地方,
mime
的值被更改。这可能是一种使用=
的情况,您的意思是使用=
。这可能是一个范围问题。可能是其他原因。我正在post@trott下添加mime变量,在该赋值和检查属性之间的某个地方,mime
的值被更改。这可能是一种使用=
的情况,您的意思是使用=
。这可能是一个范围问题。它可能是其他的。你能给我们看一个更完整的代码示例吗?@lispHK01我正在添加整个代码作为update,你能给我们看一个更完整的代码示例吗?@lispHK01我正在添加整个代码作为update,但它仍然不能解释为什么如果else语句不正确,你指的是哪个else语句,以及它如何“工作错误”?我正在检查是否定义了exec表示的数组的第一个索引,然后进行推送,但无论如何,即使这是空的,if块执行中的代码您是说tip
最后包含意外值吗?如果是这样,请发布一个测试用例,其中包含您正在接收的dt
值和预期输出。或者您是否引用了null的无法读取属性“1”类型错误?请看我答案的最后一段,但它仍然没有解释为什么如果else语句不正确,你指的是哪个else语句,以及它如何“工作错误”?我正在检查是否定义了exec表示的数组的第一个索引,然后进行推送,但无论如何,即使这是空的,if块执行中的代码您是说tip
最后包含意外值吗?如果是这样,请发布一个测试用例,其中包含您正在接收的dt
值和预期输出。或者您是否引用了null的无法读取属性“1”类型错误?看见