Search code examples
javascriptnode.jsarraysobject

Why it is output undefined?


I making toy-programming language on JS, and I met some trouble.

Namely in labels. According to my idea, everything that comes after the label is entered into the object and later runs when necessary code:

var OBJcode = {}
labels = {}
code = `zhopa: i am string
i am string
i am string
i am string`
CodeLine = code.split("\n")
for (var i = 0; i < CodeLine.length; i++) {
  runCode = CodeLine[i].split(" ")
  OBJcode[i] = runCode

  label = runCode[0]
  instruction = CodeLine[1]
  src = runCode[2]
  dst = runCode[3]
  if (`${dst}` == "undefined") {
    dst = src
    src = instruction
    instruction = label
  }
  if (label.endsWith(":")) labels[label.slice(0, -1)] += CodeLine[i + 1].split(" ").join(" ")
}
console.log(code)
console.log(OBJcode)
console.log(labels)

Output:

zhopa: i am string
i am string
i am string
i am string {
  '0': ['zhopa:', 'i', 'am', 'string'],
  '1': ['i', 'am', 'string'],
  '2': ['i', 'am', 'string'],
  '3': ['i', 'am', 'string']
} {
  zhopa: 'undefinedi am string'
}

And how to add next lines to labels[label]?

Most likely the problem is at 21:56


Solution

  • The first time you do

    labels[label.slice(0, -1)] += CodeLine[i + 1].split(" ").join(" ")
    

    the labels object is empty, so labels[label.slice(0, -1)] is undefined. When you concatenate to this, it converts the undefined value to the string "undefined", and then CodeLine[i + 1].split(" ").join(" ") is appended to this. So you get undefined at the beginning of the result.

    You need to check if the object property exists or not before concatenating.

    var OBJcode = {}
    labels = {}
    code = `zhopa: i am string
    i am string
    i am string
    i am string`
    CodeLine = code.split("\n")
    for (var i = 0; i < CodeLine.length; i++) {
      runCode = CodeLine[i].split(" ")
      OBJcode[i] = runCode
    
      label = runCode[0]
      instruction = CodeLine[1]
      src = runCode[2]
      dst = runCode[3]
      if (`${dst}` == "undefined") {
        dst = src
        src = instruction
        instruction = label
      }
      if (label.endsWith(":")) {
        let key = label.slice(0, -1);
        let value = CodeLine[i + 1].split(" ").join(" ");
        if (labels[key]) {
          labels[key] += value;
        } else {
          labels[key] = value;
        }
      }
    }
    console.log(code)
    console.log(OBJcode)
    console.log(labels)