Javascript почему console.log (typeof "Not a Number" - "Number") выводит 'NaN'? - PullRequest
4 голосов
/ 23 января 2020

Я знаю и подтверждаю, что

console.log(typeof NaN) // 'number'

однако мне нужна помощь для понимания логики c из

console.log(typeof "Not a Number" - "Number") // 'NaN'

Глядя на это

console.log("NaN is normal" - "normal" + "special") // NaNspecial

Я вижу, что "NaN is normal" - "normal" дает NaN (тип number), который затем преобразуется в string перед объединением.

1 Ответ

6 голосов
/ 23 января 2020

См. приоритет оператора . typeof имеет приоритет 17, а вычитание имеет приоритет 14. Таким образом,

console.log(typeof "Not a Number" - "Number") // 'NaN'

эквивалентно:

console.log(typeof "Not a Number" - "Number") // original line
console.log((typeof "Not a Number") - "Number") // grouping; operator precedence
console.log(("string") - "Number")
console.log("string" - "Number")
// A string can't be meaningfully subtracted from another string, so the result is NaN
console.log(NaN)

Аналогично, - и + имеют тот же приоритет и работает слева направо, поэтому окончательный код эквивалентен:

console.log("NaN is normal" - "normal" + "special") // original line
console.log(("NaN is normal" - "normal") + "special")
console.log((NaN) + "special")
// NaN gets coerced to a string and concatenated:
console.log("NaNspecial")
...