首页 > 解决方案 > 为什么 lodash deepClone 不对 Function 属性进行深度克隆?

问题描述

当对象具有 Array/Object 或原始属性时,使用 lodash deepClone 有效。

const _ = require('lodash');

const countries = [ 
  {
    name: 'United States of America',
    capital: 'Washington D.C.',
    languages: [ 'English' ]
  },
  {
    name: 'China',
    capital: 'Beijing',
    languages: [ 'Mandarin', 'Cantonese' ]
  },
];

const countriesClone = _.cloneDeep(countries);

console.log(countries[0] === countriesClone[0]); // returns false

但它似乎不适用于 Function 属性:

const _ = require('lodash');

const sayHi = () => { console.log('hi')};
const sayBye = () => { console.log('bye')};

const myFunctions = {
  sayHi,
  sayBye
};

const myFunctionsClone = _.cloneDeep(myFunctions);

console.log(myFunctions.sayHi === myFunctionsClone.sayHi); // returns true

这是意图吗?如果是,为什么?我假设 Array、Object 和 Function 都会被平等对待,因为它们都是引用类型。

标签: javascriptnode.jslodash

解决方案


在 JavaScript 中没有可靠的方法来克隆函数,这就是 Lodash 不这样做的原因。

文档_.clone将几种类型的值列为不可克隆(并暗示还有其他值):

对于无法克隆的值(例如错误对象、函数、DOM 节点和 WeakMaps)返回一个空对象。


推荐阅读