Ознакомиться с этим эталоном: http://jsben.ch/#/bWfk9
В моих предыдущих тестах, где скорость была главной проблемой, я нашел
JSON.parse(JSON.stringify(obj))
- самый быстрый способ глубокого клонирования объекта (он выдает jQuery.extend с установленным значением глубокого флага на 10-20%).
jQuery.extend довольно быстро, когда для флага глубокого значения установлено значение false (мелкий клон). Это хороший вариант, поскольку он включает некоторую дополнительную логику для проверки типов и не копирует неопределенные свойства и т. Д., Но это также немного замедлит вас.
Если вам известна структура объекты, которые вы пытаетесь клонировать или можете избежать глубоких вложенных массивов, вы можете написать простой цикл for (var i in obj)
, чтобы клонировать ваш объект при проверке hasOwnProperty, и он будет намного быстрее, чем jQuery.
Наконец, если вы пытаясь клонировать известную структуру объекта в горячем цикле, вы можете получить МНОГО БОЛЬШЕ БОЛЬШЕ ПРОИЗВОДИТЕЛЬНОСТИ, просто вставив процедуру клонирования и вручную создав объект.
Механизмы слежения за JavaScript присасываются при оптимизации циклов for..in
и проверка hasOwnProperty также замедлит вас. Ручной клон, когда скорость является абсолютной необходимостью.
var clonedObject = {
knownProp: obj.knownProp,
..
}
Остерегайтесь использования метода JSON.parse(JSON.stringify(obj))
на объектах Date
- JSON.stringify(new Date())
возвращает строковое представление даты в формате ISO, которое JSON.parse()
не обращается обратно к объекту Date
. См. этот ответ для получения дополнительной информации .
Кроме того, обратите внимание, что в Chrome 65, по крайней мере, нативный клонирование не подходит. Согласно этот JSPerf , выполняющий собственное клонирование, создавая новую функцию, почти на 800 раз медленнее, чем использование JSON.stringify, которое невероятно быстро распространяется по всем направлениям.