How does hoisting behavior differ between variables declared with let/const and those declared with var?

  • Variables declared with var are hoisted to the top of their scope, while let/const variables are hoisted but not initialized.
  • Variables declared with let/const are hoisted to the top of their scope, while var variables are hoisted but not initialized.
  • Variables declared with let/const are not hoisted, while var variables are hoisted and initialized with undefined.
  • Variables declared with var are not hoisted, while let/const variables are hoisted and initialized with undefined.
In JavaScript, variables declared with var are hoisted and initialized with undefined at the top of their scope, while let and const are hoisted but not initialized. Accessing a let/const variable before its declaration results in a ReferenceError.

What does the await keyword do inside an async function?

  • Pauses the execution of the function until the Promise is resolved
  • Executes the asynchronous code in parallel with the synchronous code
  • Skips the asynchronous code and proceeds with the synchronous execution
  • Forces the function to return immediately
The await keyword is used to pause the execution of an async function until the Promise being awaited is resolved, allowing asynchronous code to be written in a synchronous-like manner.

What are the implications of using await in top-level code (outside of any function)?

  • Causes a syntax error
  • Works as expected
  • Results in unhandled promise rejection
  • Has no effect
Using await outside of any function (at the top level) is not allowed and results in an unhandled promise rejection. The top-level code doesn't have the necessary structure to handle asynchronous operations using await. To use await, it should be inside an async function. Otherwise, it leads to unexpected behavior and unhandled promise rejections.

In ES6, what happens when two different modules import the same dependency?

  • Both modules share the same instance of the dependency
  • Each module gets its own instance of the dependency
  • The first module to import the dependency "owns" it, and the second module uses that instance
  • The second module to import the dependency "owns" it, and the first module uses that instance
In ES6, each module gets its own instance of a dependency when imported. This ensures encapsulation and prevents unintended sharing of state between modules. Even if multiple modules import the same dependency, they work with independent instances, providing isolation and avoiding potential conflicts. This behavior aligns with the modular and encapsulated nature of ES6 modules, contributing to better code organization and maintainability.

Consider a library that needs to add unique identifiers to objects without risk of property clashes. How would Symbols be utilized in this case?

  • Using string identifiers
  • Using Symbols as unique identifiers
  • Using numbers as identifiers
  • Using object literals with unique keys
The correct option is using Symbols as unique identifiers. Symbols provide a way to create unique keys for object properties, ensuring that the identifiers added by the library are distinct and not prone to clashes. Using string identifiers or numbers may lead to conflicts, especially in a shared library context. Object literals with unique keys can be used, but Symbols offer a more direct and elegant solution.

In a custom iterable, the next() method should return an object with two properties: value and ________.

  • done
  • index
  • result
  • previous
In a custom iterable, the next() method should return an object with two properties: value, representing the current value in the iteration, and done, a boolean indicating whether the iteration is complete.

How does the Fetch API handle HTTP error statuses (like 404 or 500) in Promises?

  • It doesn't reject the Promise for any HTTP error status
  • It rejects the Promise only for network errors
  • It rejects the Promise for any non-2xx HTTP status
  • It triggers a catch block for network errors and HTTP errors
The Fetch API rejects the Promise for any non-2xx HTTP status, allowing developers to handle errors more effectively. Network errors, however, are still caught separately, providing detailed error handling in both scenarios.

What is the primary advantage of using template literals over string concatenation?

  • Enhanced Readability
  • Better Performance
  • Simplified Syntax
  • Improved Browser Compatibility
Template literals provide enhanced readability due to their concise and expressive syntax. They allow embedding variables directly within the string using ${} syntax, making the code more readable and maintainable.

In a project that aims to run both on the browser and Node.js with minimal changes, how would the choice between ES6 Modules and CommonJS affect the architecture?

  • ES6 Modules
  • CommonJS
  • No significant impact on architecture
  • Depends on the specific project requirements
Choosing ES6 Modules facilitates a more seamless transition between browser and Node.js environments due to its standardized syntax and support for asynchronous module loading. CommonJS, with its synchronous nature, might require additional efforts to adapt to the asynchronous nature of browser environments.

What is a key difference in how forEach and map handle array elements?

  • forEach returns a new array, while map mutates the original array
  • forEach is synchronous, while map is asynchronous
  • forEach is purely for iteration, while map is for transformation and returns a new array
  • map modifies the original array in place, while forEach creates a new array
The key difference is that forEach is primarily for iteration and doesn't return a new array, whereas map is used for transformation and creates a new array with the results of applying a function to each element of the original array.