Поведение Lodash.clone и .cloneDeep

Контекст

Я пытаюсь клонировать массив объектов с вложенными объектами.

Что-то вроде:

var data = [
    { id: 1, values: { a: 'a', b: 'b' } },
    { id: 2, values: { c: 'c', d: 'd' } }
];

_. Клон

С помощью _.clone и параметра isDeep в true:

var clone = _.clone(data, true);

data[1].values.d = 'x';

console.log( _.isEqual(data, clone) ); // true, clone[1].values.d == 'x'

Я ожидал clone[1].values.d == 'd':

Если isDeep - это истинные вложенные объекты, также будут клонированы, иначе они будет присвоено по ссылке.

Что не так?

_. CloneDeep

Кроме того, когда я пытаюсь использовать метод _.cloneDeep, я получаю сообщение об ошибке:

var clone = _.cloneDeep(data);

// Uncaught TypeError: Object function u(n){return n instanceof u?n:new o(n)}
// has no method 'cloneDeep'

Почему эта ошибка?

$. Простираться

С $.extend клон не имеет ссылки на исходный объект, как ожидалось:

var clone = $.extend(true, {}, data);

console.log( _.isEqual(data, clone) ); // false, clone[1].values.d == 'd' 

Ответы

Ответ 1

Спасибо Gruff Bunny и Louis, которые помогли мне с их комментариями.

Фактически, когда я использую Backbone.js, я загрузил Lodash Underscore build, который отключает некоторые функции:

var clone = _.clone(data, true);

data[1].values.d = 'x';

console.log( _.isEqual(data, clone) , data , clone );

В описании говорится:

Подстрока подстроки (включает в себя сборку Backbone, которая является подмножеством Подчеркивание)

Я точно не знаю, что это значит.

Я просто изменил сборку Underscore с помощью стандартной сборки в мое приложение Backbone, и приложение все еще работает. Поэтому я могу использовать Lodash.clone с ожидаемым поведением.