Skip to content

Latest commit

 

History

History
1966 lines (1307 loc) · 40 KB

File metadata and controls

1966 lines (1307 loc) · 40 KB

🎮 تمرین کدنویسی

می‌تونین با حل این سوالات و سپس مشاهده پاسخ صحیح، سطح دانش جاواسکریپت خودتون رو ارزیابی کنین و برای مصاحبه‌های شغلی پیش رو آماده بشین 💪.

اگه خوشتون اومد به گیت‌هابمون ⭐ بدین. اگر هم قصد مشارکت داشتید خیلی خوشحال می‌شیم :)


1. خروجی این کد چی میشه؟

var car = new Vehicle("Honda", "white", "2010", "UK");
console.log(car);

function Vehicle(model, color, year, country) {
    this.model = model;
    this.color = color;
    this.year = year;
    this.country = country;
}
  • 1: Undefined
  • 2: ReferenceError
  • 3: null
  • 4: {model: "Honda", color: "white", year: "2010", country: "UK"}
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 4

The function declarations are hoisted similar to any variables. So the placement for Vehicle function declaration doesn't make any difference.


2. خروجی این کد چی میشه؟

function foo() {
    let x = y = 0;
    x++;
    y++;
    return x;
}

console.log(foo(), typeof x, typeof y);
  • 1: 1, undefined and undefined
  • 2: ReferenceError: X is not defined
  • 3: 1, undefined and number
  • 4: 1, number and number
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 3

Of course the return value of foo() is 1 due to the increment operator. But the statement let x = y = 0 declares a local variable x. Whereas y declared as a global variable accidentally. This statement is equivalent to,

 let x;
 window.y = 0;
 x = window.y;

Since the block scoped variable x is undefined outside of the function, the type will be undefined too. Whereas the global variable y is available outside the function, the value is 0 and type is number.


3. خروجی این کد چی میشه؟

function main(){
   console.log('A');
   setTimeout(
      function print(){ console.log('B'); }
   ,0);
   console.log('C');
}
main();
  • 1: A, B and C
  • 2: B, A and C
  • 3: A and C
  • 4: A, C and B
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 4

The statements order is based on the event loop mechanism. The order of statements follows the below order,

  1. At first, the main function is pushed to the stack.
  2. Then the browser pushes the fist statement of the main function( i.e, A's console.log) to the stack, executing and popping out immediately.
  3. But setTimeout statement moved to Browser API to apply the delay for callback.
  4. In the meantime, C's console.log added to stack, executed and popped out.
  5. The callback of setTimeout moved from Browser API to message queue.
  6. The main function popped out from stack because there are no statements to execute
  7. The callback moved from message queue to the stack since the stack is empty.
  8. The console.log for B is added to the stack and display on the console.


4. خروجی شرط برابری زیر چی میشه؟

console.log(0.1 + 0.2 === 0.3);
  • 1: false
  • 2: true
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 1

This is due to the float point math problem. Since the floating point numbers are encoded in binary format, the addition operations on them lead to rounding errors. Hence, the comparison of floating points doesn't give expected results. You can find more details about the explanation here 0.30000000000000004.com/


5. خروجی این کد چی میشه؟

var y = 1;
  if (function f(){}) {
    y += typeof f;
  }
  console.log(y);
  • 1: 1function
  • 2: 1object
  • 3: ReferenceError
  • 4: 1undefined
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 4

The main points in the above code snippets are,

  1. You can see function expression instead function declaration inside if statement. So it always returns true.
  2. Since it is not declared(or assigned) anywhere, f is undefined and typeof f is undefined too.

In other words, it is same as

var y = 1;
  if ('foo') {
    y += typeof f;
  }
  console.log(y);

Note: It returns 1object for MS Edge browser


6. خروجی این کد چی میشه؟

function foo() {
  return
  {
    message: "Hello World"
  };
}
console.log(foo());
  • 1: Hello World
  • 2: Object {message: "Hello World"}
  • 3: Undefined
  • 4: SyntaxError
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 3

This is a semicolon issue. Normally semicolons are optional in JavaScript. So if there are any statements(in this case, return) missing semicolon, it is automatically inserted immediately. Hence, the function returned as undefined.

Whereas if the opening curly brace is along with the return keyword then the function is going to be returned as expected.

function foo() {
  return {
    message: "Hello World"
  };
}
console.log(foo()); // {message: "Hello World"}


7. خروجی این کد چی میشه؟

var myChars = ['a', 'b', 'c', 'd']
delete myChars[0];
console.log(myChars);
console.log(myChars[0]);
console.log(myChars.length);
  • 1: [empty, 'b', 'c', 'd'], empty, 3
  • 2: [null, 'b', 'c', 'd'], empty, 3
  • 3: [empty, 'b', 'c', 'd'], undefined, 4
  • 4: [null, 'b', 'c', 'd'], undefined, 4
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 3

The delete operator will delete the object property but it will not reindex the array or change its length. So the number or elements or length of the array won't be changed. If you try to print myChars then you can observe that it doesn't set an undefined value, rather the property is removed from the array. The newer versions of Chrome use empty instead of undefined to make the difference a bit clearer.


8. What is the output of below code in latest Chrome

var array1 = new Array(3);
console.log(array1);

var array2 = [];
array2[2] = 100;
console.log(array2);

var array3 = [,,,];
console.log(array3);
  • 1: [undefined × 3], [undefined × 2, 100], [undefined × 3]
  • 2: [empty × 3], [empty × 2, 100], [empty × 3]
  • 3: [null × 3], [null × 2, 100], [null × 3]
  • 4: [], [100], []
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 2

The latest chrome versions display sparse array(they are filled with holes) using this empty x n notation. Whereas the older versions have undefined x n notation. Note: The latest version of FF displays n empty slots notation.


9. خروجی این کد چی میشه؟

const obj = {
  prop1: function() { return 0 },
  prop2() { return 1 },
  ['prop' + 3]() { return 2 }
}

console.log(obj.prop1());
console.log(obj.prop2());
console.log(obj.prop3());
  • 1: 0, 1, 2
  • 2: 0, { return 1 }, 2
  • 3: 0, { return 1 }, { return 2 }
  • 4: 0, 1, undefined
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 1

ES6 provides method definitions and property shorthands for objects. So both prop2 and prop3 are treated as regular function values.


10. خروجی این کد چی میشه؟

console.log(1 < 2 < 3);
console.log(3 > 2 > 1);
  • 1: true, true
  • 2: true, false
  • 3: SyntaxError, SyntaxError,
  • 4: false, false
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 2

The important point is that if the statement contains the same operators(e.g, < or >) then it can be evaluated from left to right. The first statement follows the below order,

  1. console.log(1 < 2 < 3);
  2. console.log(true < 3);
  3. console.log(1 < 3); // True converted as 1 during comparison
  4. True

Whereas the second statement follows the below order,

  1. console.log(3 > 2 > 1);
  2. console.log(true > 1);
  3. console.log(1 > 1); // False converted as 0 during comparison
  4. False


11. What is the output of below code in non-strict mode

function printNumbers(first, second, first) {
  console.log(first, second, first);
}
printNumbers(1, 2, 3);
  • 1: 1, 2, 3
  • 2: 3, 2, 3
  • 3: SyntaxError: Duplicate parameter name not allowed in this context
  • 4: 1, 2, 1
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 2

In non-strict mode, the regular JavaScript functions allow duplicate named parameters. The above code snippet has duplicate parameters on 1st and 3rd parameters. The value of the first parameter is mapped to the third argument which is passed to the function. Hence, the 3rd argument overrides the first parameter.

Note: In strict mode, duplicate parameters will throw a Syntax Error.


12. خروجی این کد چی میشه؟

const printNumbersArrow = (first, second, first) => {
  console.log(first, second, first);
}
printNumbersArrow(1, 2, 3);
  • 1: 1, 2, 3
  • 2: 3, 2, 3
  • 3: SyntaxError: Duplicate parameter name not allowed in this context
  • 4: 1, 2, 1
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 3

Unlike regular functions, the arrow functions doesn't not allow duplicate parameters in either strict or non-strict mode. So you can see SyntaxError in the console.


13. خروجی این کد چی میشه؟

const arrowFunc = () => arguments.length;
console.log(arrowFunc(1, 2, 3));
  • 1: ReferenceError: arguments is not defined
  • 2: 3
  • 3: undefined
  • 4: null
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 1

Arrow functions do not have an arguments, super, this, or new.target bindings. So any reference to arguments variable tries to resolve to a binding in a lexically enclosing environment. In this case, the arguments variable is not defined outside of the arrow function. Hence, you will receive a reference error.

Where as the normal function provides the number of arguments passed to the function

const func = function () {
                    return arguments.length;
                    }
console.log(func(1, 2, 3));

But If you still want to use an arrow function then rest operator on arguments provides the expected arguments

const arrowFunc = (...args) => args.length;
console.log(arrowFunc(1, 2, 3));


14. خروجی این کد چی میشه؟

console.log( String.prototype.trimLeft.name === 'trimLeft' );
console.log( String.prototype.trimLeft.name === 'trimStart' );
  • 1: True, False
  • 2: False, True
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 2

In order to be consistent with functions like String.prototype.padStart, the standard method name for trimming the whitespaces is considered as trimStart. Due to web web compatibility reasons, the old method name 'trimLeft' still acts as an alias for 'trimStart'. Hence, the prototype for 'trimLeft' is always 'trimStart'


15. خروجی این کد چی میشه؟

console.log(Math.max());
  • 1: undefined
  • 2: Infinity
  • 3: 0
  • 4: -Infinity
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 4

-Infinity is the initial comparant because almost every other value is bigger. So when no arguments are provided, -Infinity is going to be returned. Note: Zero number of arguments is a valid case.


16. خروجی این کد چی میشه؟

console.log(10 == [10]);
console.log(10 == [[[[[[[10]]]]]]]);
  • 1: True, True
  • 2: True, False
  • 3: False, False
  • 4: False, True
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 1

As per the comparison algorithm in the ECMAScript specification(ECMA-262), the above expression converted into JS as below

10 === Number([10].valueOf().toString()) // 10
So it doesn't matter about number brackets([]) around the number, it is always converted to a number in the expression.


17. خروجی این کد چی میشه؟

console.log(10 + '10');
console.log(10 - '10');
  • 1: 20, 0
  • 2: 1010, 0
  • 3: 1010, 10-10
  • 4: NaN, NaN
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 2

The concatenation operator(+) is applicable for both number and string types. So if any operand is string type then both operands concatenated as strings. Whereas subtract(-) operator tries to convert the operands as number type.


18. خروجی این کد چی میشه؟

console.log([0] == false);
if([0]) {
console.log("I'm True");
} else {
console.log("I'm False");
}
  • 1: True, I'm True
  • 2: True, I'm False
  • 3: False, I'm True
  • 4: False, I'm False
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 1

In comparison operators, the expression [0] converted to Number([0].valueOf().toString()) which is resolved to false. Whereas [0] just becomes a truthy value without any conversion because there is no comparison operator.

19. خروجی این کد چی میشه؟

console.log([1, 2] + [3, 4]);
  • 1: [1,2,3,4]
  • 2: [1,2][3,4]
  • 3: SyntaxError
  • 4: 1,23,4
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 4

The + operator is not meant or defined for arrays. So it converts arrays into strings and concatenates them.


20. خروجی این کد چی میشه؟

const numbers = new Set([1, 1, 2, 3, 4]);
console.log(numbers);

const browser = new Set('Firefox);
console.log(browser);
  • 1: {1, 2, 3, 4}, {"F", "i", "r", "e", "f", "o", "x"}
  • 2: {1, 2, 3, 4}, {"F", "i", "r", "e", "o", "x"}
  • 3: [1, 2, 3, 4], ["F", "i", "r", "e", "o", "x"]
  • 4: {1, 1, 2, 3, 4}, {"F", "i", "r", "e", "f", "o", "x"}
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 1

Since Set object is a collection of unique values, it won't allow duplicate values in the collection. At the same time, it is case sensitive data structure.


21. خروجی این کد چی میشه؟

console.log(NaN === NaN);
  • 1: True
  • 2: False
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 2

JavaScript follows IEEE 754 spec standards. As per this spec, NaNs are never equal for floating-point numbers.


22. خروجی این کد چی میشه؟

let numbers = [1, 2, 3, 4, NaN];
console.log(numbers.indexOf(NaN));
  • 1: 4
  • 2: NaN
  • 3: SyntaxError
  • 4: -1
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 4

The indexOf uses strict equality operator(===) internally and NaN === NaN evaluates to false. Since indexOf won't be able to find NaN inside an array, it returns -1 always. But you can use Array.prototype.findIndex method to find out the index of NaN in an array or You can use Array.prototype.includes to check if NaN is present in an array or not.

let numbers = [1, 2, 3, 4, NaN];
console.log(numbers.findIndex(Number.isNaN)); // 4

console.log(numbers.includes(Number.isNaN)); // true


23. خروجی این کد چی میشه؟

let [a, ...b,] = [1, 2, 3, 4, 5];
console.log(a, b);
  • 1: 1, [2, 3, 4, 5]
  • 2: 1, {2, 3, 4, 5}
  • 3: SyntaxError
  • 4: 1, [2, 3, 4]
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 3

When using rest parameters, trailing commas are not allowed and will throw a SyntaxError. If you remove the trailing comma then it displays 1st answer

let [a, ...b,] = [1, 2, 3, 4, 5];
console.log(a, b); // 1, [2, 3, 4, 5]


25. خروجی این کد چی میشه؟

async function func() {
   return 10;
}
console.log(func());
  • 1: Promise {: 10}
  • 2: 10
  • 3: SyntaxError
  • 4: Promise {: 10}
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 1

Async functions always return a promise. But even if the return value of an async function is not explicitly a promise, it will be implicitly wrapped in a promise. The above async function is equivalent to below expression,

function func() {
   return Promise.resolve(10)
}


26. خروجی این کد چی میشه؟

async function func() {
   await 10;
}
console.log(func());
  • 1: Promise {: 10}
  • 2: 10
  • 3: SyntaxError
  • 4: Promise {: undefined}
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 4

The await expression returns value 10 with promise resolution and the code after each await expression can be treated as existing in a .then callback. In this case, there is no return expression at the end of the function. Hence, the default return value of undefined is returned as the resolution of the promise. The above async function is equivalent to below expression,

function func() {
   return Promise.resolve(10).then(() => undefined)
}


27. خروجی این کد چی میشه؟

function delay() {
  return new Promise(resolve => setTimeout(resolve, 2000));
}

async function delayedLog(item) {
  await delay();
  console.log(item);
}

async function processArray(array) {
  array.forEach(item => {
    await delayedLog(item);
  })
}

processArray([1, 2, 3, 4]);
  • 1: SyntaxError
  • 2: 1, 2, 3, 4
  • 3: 4, 4, 4, 4
  • 4: 4, 3, 2, 1
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 1

Even though “processArray” is an async function, the anonymous function that we use for forEach is synchronous. If you use await inside a synchronous function then it throws a syntax error.


28. خروجی این کد چی میشه؟

function delay() {
  return new Promise(resolve => setTimeout(resolve, 2000));
}

async function delayedLog(item) {
  await delay();
  console.log(item);
}

async function process(array) {
  array.forEach(async (item) => {
    await delayedLog(i);
  });
  console.log('Process completed!');
}
process([1, 2, 3, 5]);
  • 1: 1 2 3 5 and Process completed!
  • 2: 5 5 5 5 and Process completed!
  • 3: Process completed! and 5 5 5 5
  • 4: Process completed! and 1 2 3 5
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 4

The forEach method will not wait until all items are finished but it just runs the tasks and goes next. Hence, the last statement is displayed first followed by a sequence of promise resolutions.

But you control the array sequence using for..of loop,

async function processArray(array) {
  for (const item of array) {
    await delayedLog(item);
  }
  console.log('Process completed!');
}


29. خروجی این کد چی میشه؟

var set = new Set();
set.add("+0").add("-0").add(NaN).add(undefined).add(NaN);;
console.log(set);
  • 1: Set(4) {"+0", "-0", NaN, undefined}
  • 2: Set(3) {"+0", NaN, undefined}
  • 3: Set(5) {"+0", "-0", NaN, undefined, NaN}
  • 4: Set(4) {"+0", NaN, undefined, NaN}
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 1

Set has few exceptions from equality check,

  1. All NaN values are equal
  2. Both +0 and -0 considered as different values


30. خروجی این کد چی میشه؟

const sym1 = Symbol('one');
const sym2 = Symbol('one');

const sym3 = Symbol.for('two');
const sym4 = Symbol.for('two');

console.log(sym1 === sym2, sym3 === sym4);
  • 1: true, true
  • 2: true, false
  • 3: false, true
  • 4: false, false
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 3

Symbol follows below conventions,

  1. Every symbol value returned from Symbol() is unique irrespective of the optional string.
  2. Symbol.for() function creates a symbol in a global symbol registry list. But it doesn't necessarily create a new symbol on every call, it checks first if a symbol with the given key is already present in the registry and returns the symbol if it is found. Otherwise a new symbol created in the registry.

Note: The symbol description is just useful for debugging purposes.


31. خروجی این کد چی میشه؟

const sym1 = new Symbol('one');
console.log(sym1);
  • 1: SyntaxError
  • 2: one
  • 3: Symbol('one')
  • 4: Symbol
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 1

Symbol is a just a standard function and not an object constructor(unlike other primitives new Boolean, new String and new Number). So if you try to call it with the new operator will result in a TypeError


32. خروجی این کد چی میشه؟

let myNumber = 100;
let myString = '100';

if (!typeof myNumber === "string") {
   console.log("It is not a string!");
} else {
    console.log("It is a string!");
}

if (!typeof myString === "number"){
   console.log("It is not a number!")
} else {
   console.log("It is a number!");
}
  • 1: SyntaxError
  • 2: It is not a string!, It is not a number!
  • 3: It is not a string!, It is a number!
  • 4: It is a string!, It is a number!
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 4

The return value of typeof myNumber (OR) typeof myString is always the truthy value (either "number" or "string"). Since ! operator converts the value to a boolean value, the value of both !typeof myNumber or !typeof myString is always false. Hence the if condition fails and control goes to else block.


33. خروجی این کد چی میشه؟

console.log(JSON.stringify({ myArray: ['one', undefined, function(){}, Symbol('')] }));
console.log(JSON.stringify({ [Symbol.for('one')]: 'one' }, [Symbol.for('one')]));
  • 1: {"myArray":['one', undefined, {}, Symbol]}, {}
  • 2: {"myArray":['one', null,null,null]}, {}
  • 3: {"myArray":['one', null,null,null]}, "{ [Symbol.for('one')]: 'one' }, [Symbol.for('one')]"
  • 4: {"myArray":['one', undefined, function(){}, Symbol('')]}, {}
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 2

The symbols has below constraints,

  1. The undefined, Functions, and Symbols are not valid JSON values. So those values are either omitted (in an object) or changed to null (in an array). Hence, it returns null values for the value array.
  2. All Symbol-keyed properties will be completely ignored. Hence it returns an empty object({}).


34. خروجی این کد چی میشه؟

class A {
  constructor() {
    console.log(new.target.name)
  }
}

class B extends A { constructor() { super() } }

new A();
new B();
  • 1: A, A
  • 2: A, B
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 2

Using constructors, new.target refers to the constructor (points to the class definition of class which is initialized) that was directly invoked by new. This also applies to the case if the constructor is in a parent class and was delegated from a child constructor.


35. خروجی این کد چی میشه؟

const [x, ...y,] = [1, 2, 3, 4];
console.log(x, y);
  • 1: 1, [2, 3, 4]
  • 2: 1, [2, 3]
  • 3: 1, [2]
  • 4: SyntaxError
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 4

It throws a syntax error because the rest element should not have a trailing comma. You should always consider using a rest operator as the last element.


36. خروجی این کد چی میشه؟

const {a: x = 10, b: y = 20} = {a: 30};

console.log(x);
console.log(y);
  • 1: 30, 20
  • 2: 10, 20
  • 3: 10, undefined
  • 4: 30, undefined
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 1

The object property follows below rules,

  1. The object properties can be retrieved and assigned to a variable with a different name
  2. The property assigned a default value when the retrieved value is undefined


37. خروجی این کد چی میشه؟

function area({length = 10, width = 20}) {
  console.log(length*width);
}

area();
  • 1: 200
  • 2: Error
  • 3: undefined
  • 4: 0
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 2

If you leave out the right-hand side assignment for the destructuring object, the function will look for at least one argument to be supplied when invoked. Otherwise you will receive an error Error: Cannot read property 'length' of undefined as mentioned above.

You can avoid the error with either of the below changes,

  1. Pass at least an empty object:
function area({length = 10, width = 20}) {
  console.log(length*width);
}

area({});
  1. Assign default empty object:
function area({length = 10, width = 20} = {}) {
  console.log(length*width);
}

area();


38. خروجی این کد چی میشه؟

const props = [
  { id: 1, name: 'John'},
  { id: 2, name: 'Jack'},
  { id: 3, name: 'Tom'}
];

const [,, { name }] = props;
console.log(name);
  • 1: Tom
  • 2: Error
  • 3: undefined
  • 4: John
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 1

It is possible to combine Array and Object destructuring. In this case, the third element in the array props accessed first followed by name property in the object.


39. خروجی این کد چی میشه؟

function checkType(num = 1) {
  console.log(typeof num);
}

checkType();
checkType(undefined);
checkType('');
checkType(null);
  • 1: number, undefined, string, object
  • 2: undefined, undefined, string, object
  • 3: number, number, string, object
  • 4: number, number, number, number
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 3

If the function argument is set implicitly(not passing argument) or explicitly to undefined, the value of the argument is the default parameter. Whereas for other falsy values('' or null), the value of the argument is passed as a parameter.

Hence, the result of function calls categorized as below,

  1. The first two function calls logs number type since the type of default value is number
  2. The type of '' and null values are string and object type respectively.


40. خروجی این کد چی میشه؟

function add(item, items = []) {
  items.push(item);
  return items;
}

console.log(add('Orange'));
console.log(add('Apple'));
  • 1: ['Orange'], ['Orange', 'Apple']
  • 2: ['Orange'], ['Apple']
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 2

Since the default argument is evaluated at call time, a new object is created each time the function is called. So in this case, the new array is created and an element pushed to the default empty array.


41. خروجی این کد چی میشه؟

function greet(greeting, name, message = greeting + ' ' + name) {
  console.log([name, greeting, message]);
}

greet('Hello', 'John');
greet('Hello', 'John', 'Good morning!');
  • 1: SyntaxError
  • 2: ['Hello', 'John', 'Hello John'], ['Hello', 'John', 'Good morning!']
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 2

Since parameters defined earlier are available to later default parameters, this code snippet doesn't throw any error.


42. خروجی این کد چی میشه؟

function outer(f = inner()) {
  function inner() { return 'Inner' }
}
outer();
  • 1: ReferenceError
  • 2: Inner
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 1

The functions and variables declared in the function body cannot be referred from default value parameter initializers. If you still try to access, it throws a run-time ReferenceError(i.e, inner is not defined).


43. خروجی این کد چی میشه؟

function myFun(x, y, ...manyMoreArgs) {
  console.log(manyMoreArgs)
}

myFun(1, 2, 3, 4, 5);
myFun(1, 2);
  • 1: [3, 4, 5], undefined
  • 2: SyntaxError
  • 3: [3, 4, 5], []
  • 4: [3, 4, 5], [undefined]
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 3

The rest parameter is used to hold the remaining parameters of a function and it becomes an empty array if the argument is not provided.


44. خروجی این کد چی میشه؟

const obj = {'key': 'value'};
const array = [...obj];
console.log(array);
  • 1: ['key', 'value']
  • 2: TypeError
  • 3: []
  • 4: ['key']
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 2

Spread syntax can be applied only to iterable objects. By default, Objects are not iterable, but they become iterable when used in an Array, or with iterating functions such as map(), reduce(), and assign(). If you still try to do it, it still throws TypeError: obj is not iterable.


45. خروجی این کد چی میشه؟

function* myGenFunc() {
    yield 1;
    yield 2;
    yield 3;
}
var myGenObj = new myGenFunc;
console.log(myGenObj.next().value);
  • 1: 1
  • 2: undefined
  • 3: SyntaxError
  • 4: TypeError
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 4

Generators are not constructible type. But if you still proceed to do, there will be an error saying "TypeError: myGenFunc is not a constructor"


46. خروجی این کد چی میشه؟

function* yieldAndReturn() {
  yield 1;
  return 2;
  yield 3;
}

var myGenObj = yieldAndReturn()
console.log(myGenObj.next());
console.log(myGenObj.next());
console.log(myGenObj.next());
  • 1: { value: 1, done: false }, { value: 2, done: true }, { value: undefined, done: true }
  • 2: { value: 1, done: false }, { value: 2, done: false }, { value: undefined, done: true }
  • 3: { value: 1, done: false }, { value: 2, done: true }, { value: 3, done: true }
  • 4: { value: 1, done: false }, { value: 2, done: false }, { value: 3, done: true }
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 1

A return statement in a generator function will make the generator finish. If a value is returned, it will be set as the value property of the object and done property to true. When a generator is finished, subsequent next() calls return an object of this form: {value: undefined, done: true}.


47. خروجی این کد چی میشه؟

const myGenerator = (function *(){
  yield 1;
  yield 2;
  yield 3;
})();
for (const value of myGenerator) {
  console.log(value);
  break;
}

for (const value of myGenerator) {
  console.log(value);
}
  • 1: 1,2,3 and 1,2,3
  • 2: 1,2,3 and 4,5,6
  • 3: 1 and 1
  • 4: 1
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 4

The generator should not be re-used once the iterator is closed. i.e, Upon exiting a loop(on completion or using break & return), the generator is closed and trying to iterate over it again does not yield any more results. Hence, the second loop doesn't print any value.


48. خروجی این کد چی میشه؟

const num = 0o38;
console.log(num);
  • 1: SyntaxError
  • 2: 38
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 1

If you use an invalid number(outside of 0-7 range) in the octal literal, JavaScript will throw a SyntaxError. In ES5, it treats the octal literal as a decimal number.


49. خروجی این کد چی میشه؟

const squareObj = new Square(10);
console.log(squareObj.area);

class Square {
  constructor(length) {
    this.length = length;
  }

  get area() {
    return this.length * this.length;
  }

  set area(value) {
    this.area = value;
  }
}
  • 1: 100
  • 2: ReferenceError
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 2

Unlike function declarations, class declarations are not hoisted. i.e, First You need to declare your class and then access it, otherwise it will throw a ReferenceError "Uncaught ReferenceError: Square is not defined".

Note: Class expressions also applies to the same hoisting restrictions of class declarations.


50. خروجی این کد چی میشه؟

function Person() { }

Person.prototype.walk = function() {
  return this;
}

Person.run = function() {
  return this;
}

let user = new Person();
let walk = user.walk;
console.log(walk());

let run = Person.run;
console.log(run());
  • 1: undefined, undefined
  • 2: Person, Person
  • 3: SyntaxError
  • 4: Window, Window
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 4

When a regular or prototype method is called without a value for this, the methods return an initial this value if the value is not undefined. Otherwise global window object will be returned. In our case, the initial this value is undefined so both methods return window objects.


51. خروجی این کد چی میشه؟

class Vehicle {
  constructor(name) {
    this.name = name;
  }

  start() {
    console.log(`${this.name} vehicle started`);
  }
}

class Car extends Vehicle {
  start() {
    console.log(`${this.name} car started`);
    super.start();
  }
}

const car = new Car('BMW');
console.log(car.start());
  • 1: SyntaxError
  • 2: BMW vehicle started, BMW car started
  • 3: BMW car started, BMW vehicle started
  • 4: BMW car started, BMW car started
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 3

The super keyword is used to call methods of a superclass. Unlike other languages the super invocation doesn't need to be a first statement. i.e, The statements will be executed in the same order of code.


52. خروجی این کد چی میشه؟

const USER = {'age': 30};
USER.age = 25;
console.log(USER.age);
  • 1: 30
  • 2: 25
  • 3: Uncaught TypeError
  • 4: SyntaxError
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 2

Even though we used constant variables, the content of it is an object and the object's contents (e.g properties) can be altered. Hence, the change is going to be valid in this case.


53. خروجی این کد چی میشه؟

console.log('🙂' === '🙂');
  • 1: false
  • 2: true
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 2

Emojis are unicodes and the unicode for smile symbol is "U+1F642". The unicode comparision of same emojies is equivalent to string comparison. Hence, the output is always true.


54. خروجی این کد چی میشه؟

console.log(typeof typeof typeof true);
  • 1: string
  • 2: boolean
  • 3: NaN
  • 4: number
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 1

The typeof operator on any primitive returns a string value. So even if you apply the chain of typeof operators on the return value, it is always string.


55. خروجی این کد چی میشه؟

let zero = new Number(0);

if (zero) {
  console.log("If");
} else {
  console.log("Else");
}
  • 1: If
  • 2: Else
  • 3: NaN
  • 4: SyntaxError
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 1
  1. The type of operator on new Number always returns object. i.e, typeof new Number(0) --> object.
  2. Objects are always truthy in if block

Hence the above code block always goes to if section.


55. خروجی این کد توی حالت غیر strict چی میشه؟

let msg = "Good morning!!";

msg.name = "John";

console.log(msg.name);
  • 1: ""
  • 2: Error
  • 3: John
  • 4: Undefined
🤔 مشاهده پاسخ

✅ پاسخ صحیح: 4

It returns undefined for non-strict mode and returns Error for strict mode. In non-strict mode, the wrapper object is going to be created and get the mentioned property. But the object get disappeared after accessing the property in next line.


  1. ?