Coercion from basics

·

24 min read

consider this code below where we use the template literal strings What is happening there?

var numStudents = 16
console.log(
`there are ${numStudents} students.`
);
// "there are 16 students."

the number is simply getting coerced implicitly to a string.

string coercion:

also called (Concatenation) when the + operator is used with at least one string JavaScript will perform string coercion, resulting in string concatenation. For example, 1 + "2" will coerce 1 into a string and concatenate it with "2" to yield "12".

Number Coercion (Arithmetic Operations):

Arithmetic operators like -, *, /, and % primarily perform number coercion when one or both operands are numeric or can be converted to numbers. For example, 2 - "1" will coerce "1" into the number 1 and result in 1.

Boolean Coercion (Comparison):

Comparison operators like ==, ===, <, >, etc., can result in boolean coercion. The operands are coerced into booleans, and the comparison is made. For example, "5" == 5 will coerce "5" into the number 5 and return true.

Specific Behavior:

Some operators have specific behaviour. For instance, the === (strict equality) operator never performs implicit coercion; it requires "both value and type to be equal". The !== (strict inequality) operator is similar but checks for inequality without implicit coercion.

Use of Parentheses:

Parentheses can influence the order of operations. Expressions within parentheses are evaluated first. For example, (1 + "2") * 3 will first evaluate "12" as a string and then coerce it to a number, resulting in 36.

Consider the Operator Precedence:

Operator precedence can impact the order in which operations are performed. Higher precedence operators are evaluated first. For example, in 1 + "2" 3, the multiplication () has higher precedence, so "2" is first coerced to a number, yielding 6, and then added to 1 to produce 7.

It's important to note that {} is "initially" treated as an empty code block, not an object.

examples:

1)What will be the result of 2 + 2 + '2'?
ans) as the + operand courses into a string the result would be '42'

2)How about 2 * 3 + '3'?
ans) '63'

3)What is the output of true + false?
ans) the boolean true coerces to the number 1 and false to 0 so the sum would be 1. result is the number 1

4)What does null == undefined evaluate to? (Hint: consider using both == and ===)
ans)1.null == undefined is true because the loose equality operator performs type coercion and considers them equal due to their similar value
2.null === undefined is false because the strict equality operator does not perform type coercion and checks both the value and the type, finding that they have different types.

5)What is the result of [] + {}?
ans) the + operator is overloaded for both addition and string concatenation.
{} is an empty object and [] is an empty array.
"[object Object]"
default string representation of an object is "[object Object]".

6)Explain the output of 2 == '2' and 2 === '2'.
ans)== is the loose equality so it checks the value only not the type hence it returns the boolean true
\=== the strict equality so it checks the value and the type hence it returns the boolean false.

7)What will typeof NaN return?
ans) typeof NaN is a number. NaN is still considered a special numeric value in JavaScript.

8)Can you explain the difference between null and undefined in JavaScript?
ans)

9)What is the value of NaN == NaN?
ans) it will return false becsure no two NaNs are same :/

10)What will be the output of typeof typeof 42?
ans) typeof 42 is a number
typeof number is a string.


1)How about 4 * '3'?
ans) 4 + 3 results in the number 7. Then, 7 + '7' involves a string concatenation operation because one of the operands is a string. So, it results in the string '77'.

2)What does '5' - 3 evaluate to?
ans) 4 '3' equals 12 as the * operand coerces the values to a number.

3)What does '5' - 3 evaluate to?
ans) 2 as - operand coerces the values to a number.

4)Explain the output of [] == ![].
ans) ![] is false because an empty array [] is truthy, and ! negates its truthness. [] == false JavaScript performs type coercion. An empty array [] is considered falsy, and false is also falsy. So, [] == false is true.

5)What is the result of 'true' == true?
ans) type coercion here as well. The string 'true' is not the same as the boolean true, so the loose equality == comparison results in false.

6)Can you explain what happens when you try to add an object and a number, like {} + 2?
ans) When you try to add an object {} and a number (2), JavaScript treats {} as an empty code block, not an object. So, it interprets {} + 2 as a code block followed by the number 2. The result is 2.

7)What will 1 - '1' equal?
ans) 0

8)What is the output of [] == 0?
ans) An empty array [] is considered falsy, and 0 is also falsy. So, [] == 0 is true.

9)Explain the result of '10' == 10 and '10' === 10.
ans)'10' == 10 is true.
'10' === 10 is false.

10)What is the value of true + true?
ans) (true to 1 and false to 0) hence result is 2.


1)What is the result of null + 5?
ans) in arithmetic operations with null, it is treated as 0. So, null + 5 equals 5.

2)How does JavaScript handle '5' * 2?
ans) 10

3)Explain what happens when you try to compare true < 2 and false > 1.
ans) JavaScript treats true as 1 and false as 0.
true < 2 is true
false > 1 is false

4)What does ['10'] == '10' evaluate to?
ans)JavaScript performs type coercion here. It converts the array ['10'] to a string, which becomes '10'. Then it compares '10' with '10'. So, ['10'] == '10' evaluates to true.

5)What is the result of '5' == true?
ans) the boolean true is coerced to a number (1) and then compares '5' with 1. So, '5' == true evaluates to "false" because '5' is not equal to 1.

6)Explain the output of 'false' == false.
ans) hence type coercion takes place the string is not equal to boolean hence the result is flase.

7)How does JavaScript treat NaN === NaN?
ans)In JavaScript, NaN is not considered equal to itself. So, NaN === NaN evaluates to false.

8)What will undefined == null evaluate to?
ans)JavaScript treats undefined and null as loosely equal to each other. So, undefined == null evaluates to true.

9)What happens when you try to subtract an array from a number, like 7 - [2]?
ans)the - operand convert the array [2] to a number, which becomes 2. Then it subtracts 2 from 7.
7 - [2] equals 5.

10)Can you explain the result of ![]==[]
ans) ![] is false because an empty array [] is truthy, and ! negates its truthiness. [] == false JavaScript performs type coercion. An empty array [] is considered falsy, and false is also falsy. So, [] == false is true.


  1. Explain the output of 1 + '1' - 1.
    ans)10

  2. What happens when you compare [] ==![] and why?
    ans)![] is false because an empty array is a truthy value, and ! negates its truthiness. [] is considered falsy, so [] == false is true.

  3. Describe the result of '5' + 3 - 2.
    ans)51

  4. How does JavaScript handle undefined == false and why?
    ans)JavaScript treats undefined as loosely equal to null and also to false.

  5. Explain the output of {} + [] and what concept does it illustrate?
    ans)empty block of code+empty array. +[] tries to convert the empty array into an object which results in 0.

  6. What does NaN === NaN return, and how can you reliably check if a value is NaN?

    ans)In JavaScript, NaN is not considered equal to itself. Therefore, NaN === NaN returns false.

  7. Compare and contrast the behaviour of == and === in JavaScript. Provide examples to illustrate the differences.
    ans)== performs type coercion, attempting to convert values to a common type before comparison. For example, "1" == 1 is true.
    \=== does not perform type coercion and checks both value and type. For example, "1" === 1 is false.

    -->>The key difference between == (loose equality) and === (strict equality) is that == performs type coercion, attempting to convert values to a common type before comparison, whereas === does not perform type coercion and checks both value and type. This makes === generally more predictable and recommended in most cases.

  8. What will be the output of true + 1 and why?
    ans)if the above question had atleat one string then it would coerse the rest into a string. we have a boolean + number, so + operator with a boolean (true), JavaScript converts it to a number 1 and then performs the addition.

    So, true + 1 equals 2.

  9. Explain the result of '5' * '3' and how JavaScript converts strings to numbers in such operations.
    ans)* operand converts strings into numbers so result 15

  10. Can you clarify the output of null >= 0 and why it evaluates to true?
    ans)when the >= operator, type coercion occurs. null is coerced to 0 because it's treated as falsy. So, null >= 0 evaluates to true.


  1. Explain the result of true == 'true' and true === 'true'. What's the key difference between these two comparisons?
    ans)true == 'true': JavaScript performs type coercion in this comparison. It converts the boolean true to the number 1 and then compares it with the string 'true'. Since 'true' cannot be converted to a valid number, 1 == NaN, and the result is false.

    true === 'true': This is a strict equality comparison, so JavaScript checks both the value and the type. A boolean is not strictly equal to a string, so true === 'true' evaluates to false.

  2. Describe the output of [] + {} - [] and the steps JavaScript takes to arrive at this result.
    ans)First, [] + {} is interpreted as string concatenation. [] is converted to an empty string "", and {} is converted to "[object Object]". So, you have "" + "[object Object]", which results in "[object Object]".
    Then, "[object Object]" - [] is treated as a subtraction operation, but JavaScript cannot subtract an empty array from a string. This results in NaN

  3. .What is the result of typeof (typeof 1)? Explain why it returns the value it does.
    ans)string
    typeof 1 is a number and typeof number is a string.

  4. How does JavaScript handle the comparison 0 == '0' and 0 === '0'? Provide a detailed explanation.
    ans) for loose equality by type coercion we get '0'='0' which is true.
    strict equality checks both type and value number ≠ string. hence result is false

  5. Explain why [] == false returns true but [] === false returns false. What concept is at play here?
    ans)[] == false: JavaScript performs type coercion. An empty array [] is considered falsy, and false is falsy as well. So, [] == false evaluates to true.
    [] === false: This comparison checks strict equality. An empty array is not strictly equal to a boolean value, even if they both evaluate to falsy. So, [] === false evaluates to false.

  6. What will be the outcome of '1' - - '1' and what implicit type conversions are happening here?
    ans)

  7. Describe the behavior of undefined + undefined. Why does this operation produce a specific result?
    ans)When you perform arithmetic operations with undefined, it is implicitly converted to NaN (Not-a-Number). So, undefined + undefined results in NaN. This is because adding two NaN values or NaN with any numeric value results in NaN.

  8. What is the result of 5 > 4 > 3 and why does it evaluate to that value?
    ans)This expression is evaluated from left to right.

    5 > 4 is true.
    then, true > 3 is also true.

    The result is true because the comparison operators (> in this case) return boolean values and the comparison is performed sequentially.

  9. Explain the difference between the logical operators && and || when it comes to type coercion and their use with non-boolean values.//
    ans)&& (logical AND) returns the first falsy operand, or the last operand if all are truthy.

    || (logical OR) returns the first truthy operand, or the last operand if all are falsy.

    Both operators perform type coercion to determine the final result.

  10. Provide an example where the usage of !! (double negation) is important for type coercion and converting a value to a boolean.
    ans)!! is often used to explicitly convert a value to its corresponding boolean representation.
    For example, you can use it to ensure a variable is either true or false:

var value = "Arabic";
var isTrue = !!value;
console.log(isTrue); // Outputs: true (because "Arabic" is truthy)

Here, !!value explicitly converts the truthy string "Arabic" to true.


  1. Explain the behavior of Number('0x11') and parseInt('0x11'). What are the key differences between these two methods.
    ans)

  2. What is the result of [] + 1 and why does it produce that output?
    ans)[] an empty array coerces to an empty string "" so ""+1 is "1".

  3. Describe the output of {} + [] + {} + []. What's happening step by step in this expression?
    ans) {} : '[object Object]'
    [] : ""
    {}+[] gives us 0
    0+{} gives '0[[object Object]'
    '0[[object Object]'+[] gives '0[[object Object]'

  4. Explain the behaviour of 1 + -1 === 0 and why this equality holds true.
    ans) 1+-1 gives us 0 as both value and type are the same strict equality holds and returns true.

  5. What is the result of null + undefined and why does it produce that result?
    ans) null coerces to 0 and undefined coerces o NaN so 0+ NaN gives NaN.

  6. Provide an example of how you can use type coercion to safely check if a variable is defined and has a non-empty value.
    ans) type coercion converts the given data into same type then compares its values

var value = "hello";
if (value) {
    console.log("The variable is defined and non-empty.");
} else {
    console.log("The variable is either undefined or empty.");
}
  1. How does JavaScript handle the comparison between NaN and itself using == and ===? Explain the differences.
    ans)we know that no two NaNs have the same value, hence both loose and strict inequality give false.

  2. What is the result of '2' * '3' and how does JavaScript handle multiplication with string values?
    ans) Arithmetic operators like -, *, /, and % primarily perform number coercion.
    result is the number 6

  3. Explain why ![]== [] is true and why ![]===[] is false and what concept is at play here?
    ans) case(i) so on lhs we have of logical NOT operation to an empty array which gives us false which on neumeric coercion gives 0. and on rhs we have an empty array so it coerces to 0.
    we have type coersion in loose equality. 0==0 gives true.
    case(ii) as the types are different the strict equality gives false.

  4. Describe the outcome of true - false and why JavaScript allows subtraction between boolean values.
    ans)the - operand performs numeric coercion we know true is 1 and false is 0 hence 1-0 gives 0.


  1. Explain the output of ([] == false) == [] and why it evaluates to that result.
    ans) First of all []==false gives true as loose equality of [] equals true. now true==[] gives true.

  2. Describe the behaviour of null >= 0 and null <= 0. Why do these comparisons return the values they do?
    ans) In JavaScript, when you use comparison operators (>=, <=, >, <) with null and numbers, null is coerced into the number 0.
    hence the above question can be seen as 0>=0 and 0<=0 where both are true.

  3. What is the result of '2' * '2' and how does it differ from '2' + '2'?
    ans) the * operand does numeric coercion hence 2*2 gives number 4
    the binary operand + does string concatenation hence gives the string '22'

  4. Explain why (true + 2) == (false + 3) evaluates to true.
    ans)true coerces into 1 hence 1+2=3 and false into 0 hence 0+3=3
    as both type and value are same on both sides loose and strict inequality gives true.

  5. Provide an example of a scenario where using == (loose equality) is more appropriate than === (strict equality).
    ans)Loose equality (==) can be more appropriate than strict equality (===) in scenarios where you want to perform a comparison that involves type coercion and you are interested in comparing values that could be of different types. Here's an example:

Suppose you have a function that checks whether a given input is equal to the number 99. You want this function to return true for both the number 99 and the string "99" because, for your specific use case, these values should be considered equivalent.

Using loose equality (==) can be helpful in this situation:

function isEqualTo42(value) {
    return value == 99;
}

console.log(isEqualTo42(99));     // true
console.log(isEqualTo42("99"));   // true
console.log(isEqualTo42(98));     // false

In this example, loose equality (==) allows type coercion, so it treats the numeric 99 and the string "99" as equal, returning true for both. This can be more appropriate when you want to compare values for equivalence based on their underlying numeric representation.

  1. Describe how you would implement a custom equals function in JavaScript that checks for deep equality of objects and arrays, taking into account type coercion.
    ans)

  2. Explain the result of [] == null and [] == undefined. How does JavaScript handle these comparisons?
    ans)In JavaScript, both [] == null and [] == undefined comparisons return true.

  3. Provide an example of how you can use type coercion to convert a string containing a number (e.g., "42") to an actual number (e.g., 42) without using explicit conversion functions.
    ans) an example where type coercion is used to convert a string containing a number (e.g., "42") to an actual number (e.g., 42)

var numericString = "42";
var result = numericString - 0;

console.log(result); // Outputs: 42 (as a number)

We have a variable numeric string containing the string "42". By using the subtraction operator -, JavaScript automatically tries to perform a mathematical operation, and during this operation, it coerces the string "42" to a number.
The result is stored in the variable result, which now holds the numeric value 42.

  1. What happens when you use the ~ operator on a number, like ~5? How can this operator be used for type coercion?

  2. Describe the behaviour of typeof {} and typeof []. Why do these objects have different type values?
    ans)When you use typeof on an empty object literal {}, it returns "object".
    When you use typeof on an empty array [], it also returns "object".

    This might seem counterintuitive because arrays are a type of object in JavaScript. Arrays are a specific kind of object that includes numeric indices and array-specific methods, but from a type perspective, they are still considered objects.


  1. Explain the result of '5' === 5 versus '5' == 5. What is the fundamental difference between these two comparisons?
    ans)the loose equality does type coersion hence '5'==5 gives true.
    the strict equality checks both type and value hence the types are diidfernrt '5' is string and 5 is a number it returns false.

  2. What does 1.1 + 1.1 + 1.1 === 3.3 evaluate to, and why might this be surprising?

  3. Describe the behaviour of 'true' > 0 and false < '1'. How does JavaScript handle these comparisons?
    ans) you're comparing a string ('true') and a number (0). JavaScript attempts to convert the string to a number. Since 'true' cannot be directly converted to a number, it becomes NaN (Not-a-Number).

    When comparing NaN to a number, NaN is treated as greater than any numeric value.

    So, 'true' > 0 evaluates to false because NaN is not greater than 0.
    you're comparing a boolean value (false) and a string ('1').

    JavaScript attempts to convert the string to a number. '1' can be successfully converted to the number 1.

    Now you have false < 1, which is a valid numeric comparison.

    false is treated as 0 when used in numeric operations, and 0 is less than 1. So, false < '1' evaluates to true.

  4. Explain the outcome of [] == ![] in terms of type coercion and the concepts involved.
    ans) true.

  5. What is the result of '1' - - '1' and why is this expression constructed this way?
    ans)- '1' involves the "unary" negation operator -. When you apply this operator to a string that can be parsed as a number, JavaScript will attempt to convert the string to a number. So now we have '1'-1 the - operand will do numeric coercion and convert the string '1' to number 1 . we now have 1-1 which results to the number 0.

  6. Provide an example of a scenario where using || (logical OR) for type coercion is advantageous.

  7. Describe how you can use type coercion to implement a simple custom "add" function that can add two values, whether they are numbers or strings.

  8. Explain why (undefined == null) === true but (undefined === null) === false. What does this reveal about JavaScript's type system?
    ans) undefined==null gives true as Both undefined and null are considered loosely equal because they represent values that indicate the absence of a meaningful value.
    the strict equality checks both type and value .Since undefined and null have different types (undefined is of type "undefined," and null is of type "object"), undefined === null evaluates to false.

  9. What is the result of +new Date() and how does it demonstrate type coercion?

  10. Explain why (NaN == NaN) === false but there is a way to check if a value is NaN using type coercion.
    ans) We know that no two NaN values are equal so NaN==NaN returns the boolean false.


  1. Explain the result of "5" * 1 - 1 and why it evaluates to a specific value.
    ans) the operand does numeric coercion so string "5" coerces to number 5. so 5\1 is 5 and 5-1 is number 4.*

  2. Describe the outcome of 0 == '\n' and explain why it behaves the way it does.
    ans) In this comparison, you're comparing a number 0 with a string '\n' (newline character). JavaScript coerces the string '\n' to a number, and it evaluates to 0. So, 0 == '\n' becomes 0 == 0, which is true.

    JavaScript's loose equality (==) performs type coercion, and in this case, both operands are of numeric type after coercion.

  3. Explain the result of false == '0' versus false == 'false'. What are the key differences between these two comparisons?
    ans) In both comparisons, you're comparing a boolean false with a string. JavaScript coerces the strings to booleans first. '0' can be coerced to true because it's a non-empty string (truthy).

    'false' can also be coerced to true because it's a non-empty string (truthy).

    So, both comparisons become false == true, which is false.

  4. Provide an example of how you can use type coercion to implement a function that concatenates two values as strings, regardless of their data types.
    ans) Example of using type coercion to concatenate two values as strings, regardless of their data types:

     function concatenateAsString(a, b) {
         return String(a) + String(b);
     }
    
     var result1 = concatenateAsString(5, 3);        // "53"
     var result2 = concatenateAsString("hello", 3);  // "hello3"
    

    The concatenateAsString function explicitly converts both a and b to strings using String(), ensuring that the result is always a string.

  5. Describe the behaviour of [] == {} and why it returns a particular result.
    ans)This is a loose equality comparison between an empty array [] and an empty object {}.

    JavaScript doesn't perform automatic type coercion to make them equal because they are of different types (array and object).

    So, [] == {} evaluates to false.

  6. What is the outcome of ['10'] == 10 and how does JavaScript handle the comparison between an array and a number?
    ans)In this comparison, you're comparing an array containing the string '10' with the number 10. JavaScript attempts to make the array comparable to a number, so it converts the array to a primitive value.

    The array ['10'] is coerced to the string "10". Then, "10" is coerced to the number 10. So, ['10'] == 10 becomes 10 == 10, which is true.

  7. Explain the result of '0' || '1' && '2' and the order of operations involved in this expression.
    ans) This expression involves logical OR (||) and logical AND (&&) operators.

    JavaScript evaluates && before ||. '1' && '2' evaluates to '2' because both values are truthy, and && returns the right-hand operand. Then, '0' || '2' evaluates to '0' because the left operand '0' is falsy, and || returns the left-hand operand. So, the result is '0'.

  8. Describe how you can use type coercion to ensure that a variable is always an integer, even if it's initially stored as a string.

    ans)we can explicitly convey that the result should be numerical data. Here’s an example

var numericString = "99”;
var result = numericString - 0;

console.log(result); // Outputs: 99 (as a number)
  1. Explain why ([] + {}) === '[object Object]', and how this result is related to type coercion.
    ans)[]+{} gives '[object Object]'

  1. Explain the result of [] + [1]. How does JavaScript handle the concatenation of arrays and why does it produce this result?
    ans)The first empty array [] is converted to an empty string "". The second array [1] is converted to the string "1" because it contains a single element.

    So, [] + [1] effectively becomes "" + "1", resulting in the string "1".

  2. What is the output of ({} + {}) and what does it represent in terms of type coercion?
    ans)The empty objects {} are both converted to strings "[object Object]". Type coercion

    So, ({} + {}) is effectively "[object Object]" + "[object Object]", resulting in the string "[object Object][object Object]".

  3. Describe the behaviour of 5 == [5] and why this comparison returns a specific value.
    ans)This comparison involves type coercion.

    JavaScript converts the array [5] to a primitive value, which is the number 5.

    So, 5 == [5] evaluates to true because both sides are now numbers with the same value.

  4. Explain the result of ('hello' || 0) && (false || 'world'). What is the order of evaluation and why?
    ans)JavaScript evaluates expressions with || and && operators from left to right.

    'hello' || 0 returns 'hello' because it's truthy.

    false || 'world' returns 'world' because it's the first truthy value.

    Finally, 'hello' && 'world' returns 'world' because both operands are truthy.

  5. Provide an example where you can use type coercion to determine if a given variable is a number or a numeric string.
    ans) You can use type coercion to determine if a given variable is a number or a numeric string by using the typeof operator and comparing the result with the string "number". Here's an example:

function isNumeric(value) {
    return typeof value === "number" || !isNaN(parseFloat(value));
}

// Test cases
console.log(isNumeric(42));         // true (numeric value)
console.log(isNumeric("42"));       // true (numeric string)
console.log(isNumeric("-3.14"));     // true (numeric string)
console.log(isNumeric("hello"));    // false (non-numeric string)
console.log(isNumeric(true));       // false (boolean value)
console.log(isNumeric(null));       // false (null)
console.log(isNumeric(undefined));  // false (undefined)

the parseFloat() method parses the value as a string and returns the first number. returns NaN if no number is found.

  1. Describe the outcome of '4' > '1' and explain why JavaScript treats these string comparisons the way it does.
    ans)JavaScript treats these string comparisons based on the character-by-character comparison of the strings.

    In this case, '4' is greater than '1' because when comparing character by character, '4''s first character '4' is greater than '1''s first character '1'.
    for example '23'>'1' will return false because the first characteristic of 23 is 't' and 9 is 'n' as n comes first it shows false.

  2. Explain the result of !![]=== true. What is the purpose of the double negation (!!) in this context?
    ans)The double negation (!!) is used to convert a value to its corresponding boolean representation.

    [] (an empty array) is a truthy value in JavaScript, so ![] is false. Then !![] inverts false back to true.

    So, !![] === true evaluates to true.

  3. What is the output of 2 + true + true and why does it produce that result?
    ans)JavaScript performs type coercion in this expression.

    true is converted to 1 when used in numeric operations.

    So, 2 + true + true is effectively 2 + 1 + 1, which results in 4.

  4. Describe how you can use type coercion to implement a function that adds two variables, ensuring the result is always a number.
    ans)

function addNumbers(a,b) {
    const result = a+b;
    return Number(result);
}

in the above code, we are Ensuring the result is always a number by explicitly converting it.

//test cases of the above code
const num1 = 5;
const num2 = "3";
const num3 = "hello";

const sum1 = addNumbers(num1, num2); 
const sum2 = addNumbers(num1, num3); 

console.log(sum1);        // 53 (numeric string is coerced)
console.log(sum2);        // NaN (string "hello" can't be coerced to a number)
  1. Explain the behaviour of undefined + 1. What is happening under the hood with this operation and type coercion?
    ans)When you add undefined to a number (1 in this case), JavaScript treats undefined as NaN. So, undefined + 1 evaluates to NaN.

{}+[];        //0
[]+{};        //'[objects Objects]'
''+{};        
{}+'';

->{}+[]
{} initially is considered as an empty code block rather than an empty object literal because it's not enclosed in parentheses or used as an object assignment. This means it doesn't have any effect on the code, and it's essentially ignored and
When you use the unary + operator in front of an array, JavaScript attempts to convert the contents of the array to a number.
which results in 0.

->[]+{}
[] is treated as an empty string
When you use the binary + operator in front of an array, JavaScript attempts to convert the contents to an array.
''+{} = ''+'[object Object]' which gives '[object Object]'

->

////know the reason of booleans, loose ans strict equality of [] ,{} and ''

Boolean([]);        //true
Boolean('');        //false
Boolean({});        //true