无法在javascript for循环中读取null的属性'length'

tim*_*son 3 javascript null jquery

我正在尝试制作像Stack Overflow这样的降价编辑器.

如果我实际上没有在textarea中键入星号和包含短语的http://,我会在标题中列出此错误.如果我只键入包含短语的星号,则错误引用此行:if(linkify.length!==0)

这是一个向您展示我的意思的jsfiddle.

这是我的HTML:

<textarea></textarea>
<div></div><button type="button">Markdownify</button>
Run Code Online (Sandbox Code Playgroud)

这是我的JS:

var val=$('textarea').val(), boldify = val.match(/\*\*[A-Za-z0-9]+\*\*/gim),
italicify = val.match(/\*[A-Za-z0-9]+\*/gim),linkify = val.match(/http\:\/\/[A-z0-9]+\.[A-z0-9]+/gim);

$(document.body).on('click', 'button', function() {

val=$('textarea').val(), boldify = val.match(/\*\*[A-Za-z0-9]+\*\*/gim),
italicify = val.match(/\*[A-Za-z0-9]+\*/gim),linkify = val.match(/http\:\/\/[A-z0-9]+\.[A-z0-9]+/gim);

if (boldify.length!== 0){
            for (var i=0; i < boldify.length; i++)  {
                var boldMatch= boldify[i],  
                boldReplace = boldMatch.replace(/\*\*[A-z0-9]+\*\*/gim, '<span style="font-weight:bold;color:blue;">'+boldMatch+'</span>'),
                val = val.replace(boldMatch, boldReplace);     
            }
        val = val.replace(/\*\*/gi, "");
}

if(italicify.length!== 0){
    for(var j=0; j < italicify.length; j++){
    var italicMatch= italicify[j],
     italicReplace = italicMatch.replace(/\*[A-z0-9]+\*/gim, '<span style="font-style:italic;color:red;">'+italicMatch+'</span>');
    val = val.replace(italicMatch, italicReplace); 
    }
    val = val.replace(/\*/gi, "");
}

if(linkify.length!== 0){
    for(var k=0; k < linkify.length; k++){
    var linkMatch= linkify[k],
    linkReplace = linkMatch.replace(/http:\/\/[A-z0-9]+\.[A-z0-9]+/gim, '<a href="'+linkMatch+'">'+linkMatch+'</a>');
        val = val.replace(linkMatch, linkReplace);
    }
}

$('div').html(val);
});
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

Baz*_*nga 10

match如果字符串与提供的正则表达式不匹配,则使用test返回true/false 的函数,而不是使用返回null的函数,然后如果需要,可以使用该match函数.

基本上你正在执行null.length哪个显然无效,因为match它返回null

或者您可以null在检查长度之前执行检查,然后只进行一次正则表达式匹配.

if(linkify!==null && linkify.length!== 0)
{
  //do smthing
}
Run Code Online (Sandbox Code Playgroud)

  • 嗨Baz1nga,谢谢你的帮助,有什么理由我不应该只做jimw建议的,即`if(linkify && linkify.length)`?那么编写测试和匹配组合的代码就少了,对吗? (2认同)