通常,我希望这个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));