Оператор тернарного условия Javascript работает не так, как ожидалось

#javascript #conditional-operator

Вопрос:

Я создаю Row класс для игры в блок, которую я создаю. В настоящее время у меня есть этот код для класса:

 function Row(size, rowNum, state) {
  this.size = size;
  this.rowNum = rowNum;
  this.cells = state ? this.fromState(state) : this.empty();
}

Row.prototype.empty = function () {
  var cells = [];

  for (var x = 0; x < this.size; x  ) {
    cells.push(null);
  }

  return cells;
};
Row.prototype.fromState = function (state) {
  var cells = [];


  for (var x = 0; x < this.size; x  ) {
    var tile = state[this.rowNum][x];
    cells.push(tile ? new Tile(tile.position, tile.value) : null);
  }

  return cells;
};
 

Я получил ошибку «позиция не определена» в tile.js. Я обнаружил, что это произошло потому, что переменная tile была нулевой (и поэтому tile.position не была определена). Но потом я понял, что у меня уже был троичный оператор, который, предположительно, уже знает, что tile это ноль, а затем нажимает null вместо нажатия new Tile(tile.position, tile.value) . Похоже, что тернарный оператор работает не так, как ожидалось.

Почему это происходит и как это исправить?

Редактировать: Для ясности: это мой конструктор для Tile :

 function Tile(position, value) {
  this.x                = position.x; // This is the line where I am getting the error
  this.y                = position.y; 
  this.value            = value;

  this.previousPosition = null;
  this.mergedFrom       = null; 
}
 

И фактическая ошибка:

Ошибка типа: позиция не определена

Комментарии:

1. Вы получаете сообщение об ошибке «позиция не определена» или вы получаете сообщение «Не удается прочитать свойство «позиция » неопределенного».

2. Я получаю первое.

3. @SebastianSimon Пожалуйста, проверьте новые правки. Кроме того, да, я пытался войти tile в систему .

4. Если tile.position undefined да , то Tile конструктор не может прочитать x y его свойства и. Это не связано с вашей tile регистрацией в условном. Вместо этого вам нужно будет проверить tile.position . Попробуйте tile?.position amp;amp; tile?.value , как ваше условие.