This solution is generated by ChatGPT, correctness is not guaranteed.

AI solution for JavaScript Coding Question on BFE.dev
63. create `_.cloneDeep()`

Here's one possible solution for _.cloneDeep():

function isObject(value) {
  return typeof value === 'object' && value !== null;
}

function cloneDeep(value) {
  if (!isObject(value)) {
    return value;
  }
  if (Array.isArray(value)) {
    return value.map(cloneDeep);
  }
  const result = {};
  Object.entries(value).forEach(([key, val]) => {
    result[key] = cloneDeep(val);
  });
  return result;
}

// Test cases
console.log(cloneDeep(42)); // 42
console.log(cloneDeep('hello')); // 'hello'
console.log(cloneDeep(true)); // true
console.log(cloneDeep(null)); // null
console.log(cloneDeep(undefined)); // undefined

const obj1 = { foo: 1, bar: 'hello', baz: { qux: [true, false] } };
const obj2 = cloneDeep(obj1);
console.log(obj2); // { foo: 1, bar: 'hello', baz: { qux: [true, false] } }
obj2.foo = 2; // Modify clone, should not affect original
obj2.baz.qux.push(true);
console.log(obj1); // { foo: 1, bar: 'hello', baz: { qux: [true, false] } }
console.log(obj2); // { foo: 2, bar: 'hello', baz: { qux: [true, false, true] } }

const arr1 = [{ name: 'Alice' }, { name: 'Bob' }];
const arr2 = cloneDeep(arr1);
console.log(arr2); // [{ name: 'Alice' }, { name: 'Bob' }]
arr2[0].name = 'Charlie'; // Modify clone, should not affect original
console.log(arr1); // [{ name: 'Alice' }, { name: 'Bob' }]
console.log(arr2); // [{ name: 'Charlie' }, { name: 'Bob' }]

This implementation uses a recursive approach: if the value is not an object, return it as is; if it's an array, use map to create a new array with each element recursively cloned; if it's a plain object, create a new object and assign recursively cloned values to its properties. This way, we ensure that each nested object is also deep-cloned.

Note that this implementation does not cover all data types that lodash's cloneDeep supports (e.g. Dates, RegExp, Maps, Sets, etc.), but it should be enough to cover the requirements stated in the prompt. Additionally, it uses Object.entries to iterate over the properties of an object, which is only available in ES2017+ environments. If you need to support older environments, you may need to use a different approach.