top of page

JavaScript Interview Questions: Can x !== x Return True? or Can (!isNaN(x) && x !== x) return true?

In JavaScript interviews, it is not uncommon to come across intriguing and thought-provoking questions that test your understanding of the language's peculiarities. One such question revolves around the behavior of the expression "x !== x" and whether it can actually evaluate to true in JavaScript. Or another question can be Can (!isNaN(x) && x !== x) return true? As a language known for its unique features and nuances, JavaScript presents fascinating scenarios that challenge developers to dive deeper into its inner workings. In this article, we will explore the concept behind "x !== x" and unravel the scenarios where it can return true. By examining these JavaScript interview questions, we aim to enhance your understanding of JavaScript's behavior and provide insights into its intricacies.

To verify whether a function returns true, you can simply call the function and check if its return value is equal to true. For example, you can use the following conditional statement: 'if (func() === true)'. If the function's return value is indeed equal to true, the condition will be satisfied, and the code block within the 'if' statement will be executed.

JavaScript Interview Questions

Below are the 5 Technical JavaScript Interview Questions which can be asked:

Question 1. Can “x !== x” return true?

In JavaScript, the expression 'x !== x' can indeed return true. It might seem surprising, but there is a special value called NaN (Not a Number) in JavaScript. When NaN is compared to itself using the '!==', operator, it evaluates to true. This behavior is due to the unique nature of NaN in JavaScript.

To output the message 'hello fatfish,' the value of 'x' should be NaN.

const x= ? // Please fill in the value of "x?
if(x !== x)
    console.log('hello fatfish')

It's fascinating to discover that there exists a value that is not equal to itself. NaN serves as an example in JavaScript, as it is not equal to any value, including itself. When we check if NaN is equal to NaN using the '===' operator, it evaluates to false. Similarly, the expression 'x !== x' with 'x' assigned as NaN returns true. To determine if a value is NaN, you can use the 'Number.isNaN()' method, which, in the case of 'x', will return true:

const x = NaN // Please fill in the value of "x?
if(x !== x)
console.log('hello fatfish')}
console.log(NaN === NaN) // false
console.log(x !== x) // true
console.log(Number.isNaN(x)) // true

Question 2. Can (!isNaN(x) && x !== x) return true?

Yes, the expression '(!isNaN(x) && x !== x)' can return true in certain cases. By filtering out NaN using the 'isNaN()' function and checking if 'x' is not equal to itself, we can identify other values that exhibit this behavior.

To output the message 'hello fatfish,' there are various values that can be assigned to 'x.' One such value is the special JavaScript value called NaN. However, there are other values as well.

Let's consider an example where 'x' is assigned a value using 'Object.defineProperty()' and the 'get' method:

window.x = 0 // Any value is OK
        return Math.random()

console.log(x) // 0.12259077808826002
console.log(x === x)// false
console.log(x !== x)// true

In this example, 'x' is initially set to 0, but when we access its value using 'console.log(x)', it returns a randomly generated number, such as 0.12259077808826002. Due to the 'get' method defined using 'Object.defineProperty()', every time 'x' is accessed, it returns a new random value.

Now, if we compare 'x' to itself using the '===' operator, it evaluates to false, as shown in 'console.log(x === x)'. Similarly, the expression 'x !== x' evaluates to true, as demonstrated by 'console.log(x !== x)'.

By utilizing the 'Object.defineProperty()' method, we can create scenarios where the value of 'x' changes each time it is accessed, making it not equal to itself.

Question 3. How to make “x === x + 1”?

To make the expression 'x === x + 1' evaluate to true in JavaScript, we can assign 'x' a value greater than the maximum safe integer, which is represented by the constant 'Number.MAX_SAFE_INTEGER'.

The 'Number.MAX_SAFE_INTEGER' constant represents the maximum safe integer value in JavaScript, which is 2^53 - 1 (9,007,199,254,740,991). By assigning 'x' a value greater than 'Number.MAX_SAFE_INTEGER', we can create a scenario where 'x' is equal to 'x + 1'.

Here's an example:

const x = Number.MAX_SAFE_INTEGER + 1 // Please fill in the value of "x?
if(x === x + 1)
    console.log('hello fatfish')

In this example, 'x' is assigned the value 'Number.MAX_SAFE_INTEGER + 1'. When we compare 'x' to 'x + 1' using the '===' operator, it evaluates to true, and the message 'hello fatfish' will be logged to the console.

By exceeding the maximum safe integer value, we create an overflow situation where the addition of 1 to 'x' wraps around and becomes equal to 'x'. However, it's important to note that exceeding the 'Number.MAX_SAFE_INTEGER' may lead to inaccuracies due to JavaScript's handling of large numbers. Therefore, caution should be exercised when working with such values."

Question 4. Can “x > x” be true?

In normal circumstances, it is not possible for a value to be greater than itself. However, using the 'Symbol.toPrimitive' feature in JavaScript, we can create a scenario where 'x > x' evaluates to true.

Here's an example that utilizes the 'Symbol.toPrimitive' feature:

const x={// Please fill in the value of "x?
    value: 1,
        return --this.value

    console.log('hello fatfish')

In this example, 'x' is an object with a 'value' property and a 'Symbol.toPrimitive' method defined. The 'Symbol.toPrimitive' method is a special symbol in JavaScript that allows objects to define their conversion behavior when used in various contexts.

When the comparison 'x > x' is made, the 'Symbol.toPrimitive' method is invoked. In this case, the 'Symbol.toPrimitive' method is defined to decrement the 'value' property and return the updated value. The console.log statement inside the method is included for illustration purposes.

Now, if we run the code and perform the comparison 'x > x', it will evaluate to true, and the message 'hello fatfish' will be logged to the console.

By utilizing the 'Symbol.toPrimitive' feature, we can override the default comparison behavior and create a scenario where 'x' is indeed greater than itself."

Question 5. typeof x === ‘undefined’ && x.length > 0 ?

To evaluate the expression 'typeof x === 'undefined' && x.length > 0' as true, 'x' needs to have a type of 'undefined' and also have a 'length' property greater than 0.

One value that can make the condition 'typeof x === 'undefined'' true is 'undefined' itself. However, there is another value in JavaScript that can also result in 'typeof x === 'undefined'' being true, and that is 'document'.

In JavaScript, when you reference an undeclared variable, it will have the value 'undefined'. However, the 'document' object is a predefined global object available in web browsers. When you try to access an undefined property on the 'document' object, it also returns 'undefined'. Therefore, 'typeof document' will be 'undefined', as it is not an actual variable.

Now, if we consider the condition 'typeof x === 'undefined' && x.length > 0', we can assign the 'document' object to 'x' to make the expression evaluate to true:

const x= ? // Please fill in the value of "x?
if(typeof x=== 'undefined' && x.length > 0)
    console.log('hello fatfish')

In this example, the condition 'typeof x === 'undefined'' will be true because 'x' is assigned the 'document' object. However, the second part of the condition, 'x.length > 0', will not be satisfied because 'document' does not have a 'length' property. Therefore, the message 'hello fatfish' will not be logged to the console.

Besides the 'undefined' value itself, another value that can make 'typeof x === 'undefined'' true is the 'document' object in the context of web browsers. However, it's important to note that the 'document' object does not have a 'length' property, so the second part of the condition will not be met in this case.


bottom of page