# cloneWith
# Description
这个方法类似 clone,除了它接受一个 customizer 定制返回的克隆值。 如果 customizer 返回 undefined 将会使用拷贝方法代替处理。 customizer 调用 4 个参数: (value [, index|key, object, stack])。
# Params
(value, customizer)
customizer -- 拷贝的方法
# Return
{*}
-- 拷贝的结果
# Depend
import baseClone from './.internal/baseClone.js'
# Code
const CLONE_SYMBOLS_FLAG = 4
function cloneWith(value, customizer) {
customizer = typeof customizer === 'function' ? customizer : undefined
return baseClone(value, CLONE_SYMBOLS_FLAG, customizer)
}
# Analyze
- 判断了传入的
customizer
是否为function
,如果是function
,则使用 传入的customizer
,否则就定义为undefined
,使用baseClone
的逻辑 - 调用
baseClone
这里传入的bitmask
为 4, 表示会拷贝symbol
# Remark
和 clone 一样 借鉴了 结构化克隆算法 MDN (opens new window) 以及支持 arrays、array buffers、 booleans、 date objects、maps、 numbers, Object 对象,regexes, sets, strings, symbols, 以及 typed arrays。 arguments 对象的可枚举属性会拷贝为普通对象。 一些不可拷贝的对象,例如 error objects、functions, DOM nodes, 以及 WeakMaps 会返回空对象
# Example
function customizer(value) {
if (_.isElement(value)) {
return value.cloneNode(false);
}
}
var el = _.cloneWith(document.body, customizer);
console.log(el === document.body); // => false
console.log(el.nodeName); // => 'BODY'
console.log(el.childNodes.length); // => 0
← cloneDeepWith compact →