Обычно я ожидал бы, что условие цикла while будет иметь значение true, и код внутри будет запущен:
while ([" ", ":", ",", ""].includes("")) {
cursor = getCh();
}
Если вы скопируете приведенный ниже фрагмент в devtools, вы увидите это в строке 18тот же сценарий, который я описал выше, оценивается как ложный, и код внутри не запускается.Я пытаюсь выяснить, почему.Опять же, если вы поместите точку останова в строку 18 и войдете в функцию nextValue, вы увидите, что курсор установлен в пустую строку, а затем проверяется условный цикл while.Вместо оценки true и входа в цикл он оценивается как false, как я обрисовал выше. Остальная часть функции parseJSON не является частью вопроса, на который я пытаюсь ответить, я просто хочу знать, почему цикл while внутри вспомогательной функции nextValue не вводится, когда переменная курсора равна пустойstring. Необходимо было вставить весь код, так как это единственный раз, когда я столкнулся с проблемой.
Я использовал инструменты dev для проверки значений во время выполнения функции, и все выглядит так, как онаследует.
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));