JavaScript array.length 在元素被推入后保持为 0

JavaScript array.length remains 0 after elements been pushed in

我正在编写一个括号验证函数,似乎在某些情况下 tmpStack.length 即使在某些元素被推入之后仍然 0。 对于像 "[(1+2)]""[(1+2]" 这样的正常输入,函数有效,但对于像 "[12" 这样的输入,它不起作用,因为 tmpStack.length 仍然是 0。另一个困扰我的问题是,如果输入是像 [ 这样的单个括号,函数 returns true 尽管它应该在初始验证中失败。

function validator(str){
  var flag=true;
  var tmpStack=[];
  var sliced = str.split("");
  if (str.length<1 && 
        ((str!="(") || (str!=")") || (str!="[") || 
         (str!="]") || (str!="{") || (str!="}")))
    return flag;

  else {
        for(var i =0;i<=str.length;i++){
            if((sliced[i]=="[") || (sliced[i]=="{") || (sliced[i]=="("))
                tmpStack.push(sliced[i]);
            else {
                if((sliced[i]=="]" && tmpStack.pop()!="[") || (sliced[i]=="}" && tmpStack.pop()!="{" ) || (sliced[i]==")" && tmpStack.pop()!="("))
                {
                    console.log("dis-match found for: "+(sliced[i]));
                    flag=false;
                    break;
                }
            }
        }
    }
    if(tmpStack.length % 2)
    return flag;
    else
    return !flag;
}
var tstStr="[+1";
console.log(validator(tstStr));

当您发现错误时,您需要从函数中 return,我认为:

return false;

而不是

flag=false; break;

我也没看懂:

if(tmpStack.length % 2) return flag; else return !flag;

似乎数组中是否还剩下任何东西 - 如果应该 return false:

return tmpStack.length ? false : true;

或者只是

return !tmpStack.length

http://jsfiddle.net/m68j0926/

已更新

重构解决方案:

function validator(str){
    var tmpStack = [];
    for (var i = 0; i < str.length; i++) {
        if (str[i].match(/\[|\{|\(/)) {
            tmpStack.push(str[i]);
        } else if (
                (str[i]=="]" && tmpStack.pop()!="[") || 
                (str[i]=="}" && tmpStack.pop()!="{" ) || 
                (str[i]==")" && tmpStack.pop()!="(")
        ) {
            console.log("dis-match found for: " + (str[i]));
            return false;
        }
    }
    
    return !tmpStack.length;
}
var tstStr="[+]()1";
console.log(validator(tstStr));