2014-10-16 4 views
42

Я работаю над проектом, который имеет как угловое, так и подстрочное значение в качестве зависимости.Должен ли я использовать Angular.copy() или _.clone()?

Когда мне нужно создать копию объекта, в зависимости от настроения в то время, я мог бы использовать angular.copy() или _.clone()

Это происходит со мной, что один из этих методов, вероятно, более быстрая/надежный/надежной чем другой.

Есть ли какая-либо известная проблема с любой из этих функций, которая делает ее лучше или хуже для использования, чем другая, если обе библиотеки уже включены?

+1

есть ли у вас какие-либо результаты сравнений, которые вы уже бежали, возможно, с JSPerf? или вы еще не проводили никаких исследований. –

+4

эти два метода четко выполняют две разные задачи, в соответствии с документацией (глубокая копия или мелкая копия), поэтому наилучшее использование будет зависеть от того, что именно вы хотели сделать в каждом случае. –

+1

Итак, у lodash есть метод cloneDeep, а также если вы передаете логический метод клонирования lodash, он создает глубокий клон в соответствии с документацией.Любые предложения по поводу эффективности этих методов против angular.copy? –

ответ

39

Что касается вашего вопроса: angular.copy и _.clone разные. Речь идет не о том, что лучше, речь идет о том, что вам нужно, как @Kevin B, изложенном в комментариях.

angular.extend(), с другой стороны, представляет собой неглубокую копию сродни _.clone

Angular.copy vs Angular.extend

С точки зрения производительности, я не уверен, что лучше, но ради мнения, я 'm против включения библиотек в глобальную область (подчеркивание) с любым угловым приложением, так как обычно эти вещи записываются как angular modules. angular.copy/angular.extend выиграл бы в этом случае.

Shallow/Deep Copy:

Его очень просто, что если объект имеет только примитивные поля, то, очевидно, вы будете идти на мелкую копию, но если объект имеет ссылки на другие объекты, а затем на основе требуется отбор, мелкая копия или глубокая копия. Я имею в виду здесь, если ссылки не изменяются в любое время, тогда нет смысла искать глубокую копию. Вы можете просто выбрать мелкую копию. Но если ссылки часто меняются, то вам нужно пойти на глубокую копию. Опять нет жесткого правила, все зависит от требования.

Source

+1

«Но если ссылки часто изменяются, вам нужно перейти на глубокую копию». Вместо этого я бы сказал, что если ссылки будут изменены, то, вероятно, имеет значение, делаете ли вы глубокие или мелкие, но если они нет, то это, вероятно, не имеет значения. На самом деле я бы сказал, что в случаях, когда ссылки изменены, вы чаще всего захотите использовать мелкую копию. Но, как сказал livepo, вам нужно принять решение в каждом конкретном случае. Что касается производительности, то, как правило, мелкий клон должен быть быстрее, чем глубокий клон, особенно для глубоких структур данных. Для неглубоких структур это может зависеть от библиотеки. –

+1

Обычно я использую подчеркивание как услугу в приложениях, которые должны выполнять обширные преобразования данных. Это предотвратит использование глобального '_'. Этот подход также хорошо работает для других полезных автономных библиотек, например. momentjs. –

+2

Бьюсь об заклад, ваш ответ будет другим в 2016 году. Вы можете очень легко использовать инъекцию зависимостей (не угловатую), используя общие или требуемые, и иметь доступ к подчеркиванию или lodash. Было обнаружено, что в некоторых случаях Lodash быстрее, чем собственные браузерные методы, такие как _.forEach в Chrome. Может быть очень важным в широкомасштабном приложении данных. – bwinchester

3

У нас были некоторые сообщения об ошибках, подтверждающих, что использование angular.copy действительно создают пустые объекты на некоторых мобильных телефонах Windows. Так что если вам нужно поддерживать любую версию IE на мобильных устройствах, не используйте angular.copy! Якобы эта ошибка была исправлена ​​с помощью Microsoft, но тем не менее мы имели дело с этим ...

На самом деле, вы можете также использовать Object.assign() ...

Docs: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

Дальнейшие примеры: https://googlechrome.github.io/samples/object-assign-es6/

Я знаю, что это не говорит, не IE, но я попробовал это на моем IE11 и это работает ...

Смежные вопросы