Skip to content

Objects

notes

  • looping throgh an object: - for (let el in Obj) will loop over the keys. - for (let el of bj) will loop over the valuse ??

Immutabilty

  • once we create an object we can not change it. and if we want to change it we have to copy it and mutate the copy.
  • ex: strings is immutable, whan u change a string u actually create a new string.
  • ex: objects in js are mutable.
  • pros of immutability: 1. makes our programs more predictable. 2. faster in change detection. 3. concurrency.

  • cons of immutability: 1. copying every elemnt in order to change it can slow ur performance. 2. memory proplems: also associated with copying. the solution for this is structural sharing, when copying the elemnt only the changed elemnts will be copied, others will be shared, like shared by reference.

updating objects

  • updating an object with immutability priciples in mind:
  const obj = { name: "john" };

  obj.name = "Ahmad"; // wrong, we shouldn't do that, we need to creaete a copy first.

  // Object.assign()
  const newObj = Object.assign({}, obj, { name: "Ahmad", age: 27 }); // copy obj into newObj, and then update newObj with the new values.

  // spread operator
  const newObj = { ...obj } // make a copy
  newObj.name = "Ahmad"; update the copy.
  • spraed operator will make a shallow copy of any nested object, we need to create a new deep copy to apply our changes to the copy only
  const obj1 = { name: "ahmad", address: { country: "UK", city: "London" } };

  const newObj = { ...obj1 } //copy, shallow copy for address.
  newObj.address.city = "Bristol"; // the address of obj will changed as well.
  obj.address.city // Bristol.

  // To solve the problem
  const newObj = { ...obj, address: { ...obj.address }};
  newObj.address.city = "Bristol"; // the address of obj will NOT changed becaue we deep copied obj.
  obj.address.city // London.

update object keys

 const changeKey = (obj, old_key, new_key) => {
      // if the key will change
      if (old_key !== new_key) {
          Object.defineProperty(obj, new_key, // add a new property to obj with the obj[new_key] = same value.
              Object.getOwnPropertyDescriptor(obj, old_key)); // descriptor contains the valeu of the property
          delete obj[old_key]; // delete old key and its value.
      }


  }

Delete object key

  //1
  delete obj.keyName;

  //2
  obj.keyName = undefined;

check if object

  const isObject = obj => !!obj && typeof obj === 'object';