Object Descriptors & Property Flags

What's the key difference between these two functions?
function shallowFreeze(obj) {
  Object.freeze(obj);
  return obj;
}

function deepFreeze(obj) {
  // Freeze properties before freezing self
  Object.keys(obj).forEach(prop => {
    if (
      obj[prop] !== null &&
      (typeof obj[prop] === 'object' || typeof obj[prop] === 'function') &&
      !Object.isFrozen(obj[prop])
    ) {
      deepFreeze(obj[prop]);
    }
  });
  
  return Object.freeze(obj);
}
Next Question (39/40)