1. Основы объектов. Угадайте выход?

var a = {};
b = {key: 20};
c = {key: 50};
a[b] = 100;
a[c] = 200;
console.log(a[b]);

Результат — 200. Это связано с тем, что ключи в объектах всегда строковые. Итак, object.toString() дает нам ‘[object Object]’. Таким образом, первый объект 'a' будет иметь ключ '[object Object]' со значением 100. Затем тот же ключ перезаписывается значением 200.
Таким образом, доступ к a[b] просто означает a[ '[object Object]'], где значение равно 200.

console.log(a[b]); //o/p - 200
console.log(a); //o/p - {[object Object]: 200}

2. Хотите попробовать еще раз? Угадайте результат ниже

var a = {};
b = [20];
c = [40];
a[b] = 100;
a[c] = 200;
console.log(a[b]);

Поскольку Array.toString() дает строку, разделенную запятыми. Таким образом, на этот раз выход равен 100.

console.log(a[b]); // o/p - 200
console.log(a);    // o/p - {20: 100, 40: 200}

3. var, пусть области действия и замыкания

for(var i=0; i<=5; i++){
 setTimeout(()=> {
   console.log(i);
 })
}
o/p- 
6
6
6
6
6
6

переменная «i», объявленная с помощью var, находится в области действия функции. Таким образом, ссылка на память остается прежней, и увеличение происходит в той же переменной «i». Поскольку setTimeout является асинхронным, поэтому его обратный вызов помещается в очередь и ожидает завершения основного стека вызовов (кода синхронизации). После того, как код синхронизации (для цикла) превышает значение i = 6. Поэтому, когда выполняются обратные вызовы, все они ссылаются на ссылку памяти «i».

Чтобы исправить это, мы можем просто заменить «var» на «let». Поскольку let имеет область видимости блока, все шесть обратных вызовов будут иметь отдельные переменные «i» с разными значениями.

for(let i=0; i<=5; i++){
 setTimeout(()=> {
  console.log(i);
 })
}
o/p-
0
1
2
3
4
5

Что, если нам скажут не использовать ключевое слово «let» и исправить его только с помощью «var». Здесь мы воспользуемся замыканием для создания новой переменной, в которой будет храниться текущее значение «i» вместе с методом обратного вызова.

for (var i = 0; i <= 5; i++) {
    closure(i);
    
    function closure(x) {
        setTimeout(()=>{
            console.log(x);
        }
        )
    }
}

o/p-
0
1
2
3
4
5

Поскольку метод будет вызываться только один раз во время выполнения. Таким образом, мы можем написать IIFE (немедленно вызываемое функциональное выражение), как показано ниже.

for (var i = 0; i <= 5; i++) {
((x)=>{
        setTimeout(()=>{
            console.log(x);
        }
        )
    }
    )(i);
}
o/p-
0
1
2
3
4
5

4. Найдите пропущенное число из заданного массива чисел

const arr = [7, 5, 1, 2, 3, 6];
  • все числа различны
  • будет только одно пропущенное число
  • 1 ≤ n ≤ размер+1

Решение арифметическое. :) Нам просто нужно сначала вычислить ожидаемую сумму, используя приведенную ниже формулу для суммирования n натуральных чисел.

                             n*(n+1)/2

и фактическую сумму, затем вычтите фактическую сумму из ожидаемой суммы, чтобы получить недостающее число.

const arr = [7, 5, 1, 2, 3, 6];
function findMissingNumber(arr) {
    const n = arr.length + 1; // adding 1 for missing number
    let expecteSum = (n * (n + 1)) / 2;
    let actualSum = arr.reduce((acc, curr) => {
        acc += curr;
        return acc;
    });
    
    let missingNumber = expecteSum - actualSum;
    return missingNumber;
}
console.log(findMissingNumber(arr));

5. Каррирование функций

Напишите код для приведенного ниже оператора вызова функции.

sum(1)(2)(3)(4)(5)(); //o/p - 15

Вы должны знать о концепции каррирования. Если нет, пожалуйста, обратитесь к замечательной статье ниже.



function sum(a){    
    return function (b){
        if(b){
            return sum(a+b);
        }
        return a;
    }
}

Спасибо за прочтение. Поскольку вы уже дочитали до конца поста, не забудьте похлопать в ладоши.