Why in my screenshot below isNaN(1) and isNaN("1") returns false? As one of them is number and one of them is a string so isNaN("1") should return true.

Why in my screenshot below isNaN(1) and isNaN("1") returns false? As one of them is number and one of them is a string so isNaN("1") should return true.

From MDN:
When the argument to the
isNaNfunction is not of type Number, the value is first coerced to a Number. The resulting value is then tested to determine whether it is NaN. Thus for non-numbers that when coerced to numeric type result in a valid non-NaN numeric value (notably the empty string and boolean primitives, which when coerced give numeric values zero or one), the "false" returned value may be unexpected; the empty string, for example, is surely "not a number."
The article also suggests using the (experiemental) Number.isNaN function if you don't want this behavior:
console.log(Number.isNaN("1")) // false
console.log(Number.isNaN(NaN)) // true
Or more simply:
console.log("1" != "1") // false
console.log(NaN != NaN) // true
But if what you really want to simply determine if a value of type Number (and not for example, of type String), simply use typeof:
console.log(typeof "1" == "number") // false
console.log(typeof 1 == "number") // true
But this will return true for NaN because despite being known as 'not a number', it's actually a value of type Number. If you want to ensure that the value is of type Number, and a valid, finite number use the (experimental) Number.isFinite:
console.log(Number.isFinite("1")) // false
console.log(Number.isFinite(1)) // true
console.log(Number.isFinite(NaN)) // false
Or simply create your own:
function myIsFinite(x) { return typeof x == "number" && isFinite(x); }
console.log(myIsFinite("1")) // false
console.log(myIsFinite(1)) // true
console.log(myIsFinite(NaN)) // false
The isNaN function will convert the input to a number first and then determine if the resulting number is NaN.