while循环条件评估未按预期工作

时间:2019-02-09 21:11:31

标签: javascript arrays json string object

通常,我希望这个while循环条件的计算结果为true,并且其中的代码将运行:

while ([" ", ":", ",", ""].includes("")) {
        cursor = getCh();
      }

如果将下面的代码段复制到devtools中,您将在第18行看到与我上面概述的场景相同的结果为false,并且其中的代码无法运行。我正试图找出原因。同样,如果在第18行放置一个断点并进入nextValue函数,您将看到光标被设置为空字符串,然后检查while循环的条件。正如我上面概述的那样,它没有评估为true并进入循环,而是评估为false。 parseJSON函数的其余部分不是我要回答的问题的一部分,我只想知道为什么当游标变量等于空值时,为什么不会进入nextValue helper函数中的while循环。由于这是我唯一遇到此问题的时间,因此有必要粘贴所有代码。

我已经使用开发工具在函数运行时检查值,一切看起来都应该如此。

var parseJSON = function(json) {


  json = json.split("")
  var cursor = json[0];

  function parser() {


    var grammar = {


      'object': {
        'build': function() {
          var obj = {};

          while (cursor != "}") {
            nextValue([" ", ":", ",", '']);
            if (cursor === undefined || cursor === "}") {
              cursor = getCh();
              return obj;
            }
            var property = parser(json);
            nextValue([":", " "]);
            obj[property] = parser(json);
          }

          cursor = getCh();
          return obj;
        },
        'identifier': ["{", ":", "}"]
      }

    };

    // Resets json variable and returns the first character
    function getCh() {
      json = json.slice(1);
      return json[0];
    }

    // Resets cursor until cursor does not equal argument
    function nextValue(char) {
      // run getCh() while not a value
      cursor = getCh();
      while (char.includes(cursor)) {
        cursor = getCh();
      }
    }

    // Searches through type identifiers in our grammar to determine 
    // whichfunction to run
    for (var key in grammar) {
      if (grammar[key].identifier.includes(cursor)) {
        return grammar[key].build();
      }
    }
  };

  return parser(json);
};
var input = '{\r\n' +
  '          "glossary": {\n' +
  '              "title": "example glossary",\n\r' +
  '      \t\t"GlossDiv": {\r\n' +
  '                  "title": "S",\r\n' +
  '      \t\t\t"GlossList": {\r\n' +
  '                      "GlossEntry": {\r\n' +
  '                          "ID": "SGML",\r\n' +
  '      \t\t\t\t\t"SortAs": "SGML",\r\n' +
  '      \t\t\t\t\t"GlossTerm": "Standard Generalized ' +
  'Markup Language",\r\n' +
  '      \t\t\t\t\t"Acronym": "SGML",\r\n' +
  '      \t\t\t\t\t"Abbrev": "ISO 8879:1986",\r\n' +
  '      \t\t\t\t\t"GlossDef": {\r\n' +
  '                              "para": "A meta-markup language,' +
  ' used to create markup languages such as DocBook.",\r\n' +
  '      \t\t\t\t\t\t"GlossSeeAlso": ["GML", "XML"]\r\n' +
  '                          },\r\n' +
  '      \t\t\t\t\t"GlossSee": "markup"\r\n' +
  '                      }\r\n' +
  '                  }\r\n' +
  '              }\r\n' +
  '          }\r\n' +
  '      }\r\n'
console.log(parseJSON(input));

0 个答案:

没有答案