Странная проблема с console.log - PullRequest
1 голос
/ 01 мая 2020
const myFather = {
  name: 'John',
  age: 78,
  getDetails: function () {
    return 'The name of my father is ' + this.name + ' and he is ' + this.age + ' old.'
  }
}

Если я запускаю следующую строку кода, я получаю значение true, как и ожидалось:

console.log(myFather.__proto__ === Object.prototype)

Если я запускаю это, я получаю текст, как и ожидалось:

console.log('myFather.__proto__ === Object.prototype:')

Но если я запускаю это, я получаю только ложь. Даже текст не показывает:

console.log('myFather.__proto__ === Object.prototype:' + myFather.__proto__ === Object.prototype)

Я не понимаю, почему?

Ответы [ 2 ]

4 голосов
/ 01 мая 2020

Вы на самом деле делаете это:

console.log( ('myFather.__proto__ === Object.prototype:' + myFather.__proto__) === Object.prototype);

Таким образом, результат этого равенства равен false

3 голосов
/ 01 мая 2020

Похоже на случай приоритета оператора? Работает ли это, если вы заключите вторую часть в скобки, например

console.log('myFather.__proto__ === Object.prototype:' + (myFather.__proto__ === Object.prototype))

Приоритет оператора, как указано в MDN или другой базовой документации JS, определяет порядок, в котором операторы оценены. Этот список не так интересен в большинстве случаев, так как простые присваивания внутри одного оператора могут не использовать несколько разных операторов. Но в вашем случае есть оператор + и оператор ===. Оператор сложения имеет более высокий приоритет, чем оператор равенства, что означает: он вычисляется первым. Итак, это внутренние шаги для вашего журнала вызовов, строка за строкой:

console.log('myFather.__proto__ === Object.prototype:' + myFather.__proto__ === Object.prototype)

console.log('myFather.__proto__ === Object.prototype:[object Object]' === Object.prototype)

console.log(false)
...