javascript - 为什么 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 都会被平等对待,因为它们都是引用类型。
解决方案
在 JavaScript 中没有可靠的方法来克隆函数,这就是 Lodash 不这样做的原因。
的文档_.clone
将几种类型的值列为不可克隆(并暗示还有其他值):
对于无法克隆的值(例如错误对象、函数、DOM 节点和 WeakMaps)返回一个空对象。
推荐阅读
- javascript - Postresql没有连接到heroku
- ruby-on-rails - nil:NilClass 的未定义方法“create”
- python - 如何将长/纬度整数从谷歌历史 JSON 转换为谷歌地图格式?
- mule - Postman 不考虑以 # 开头的查询参数值
- three.js - ThreeJS - 如何在“mouseout”上缩小相交对象
- python - 在tkinter中单击按钮上的两个脚本之间的链接?
- laravel - Laravel - 如何从与数据透视表相关的表中获取数据
- c++ - 将用户输入的术语与 txt 文件中的列表进行比较
- google-chrome-extension - 如何重新加载后台脚本?
- c++ - 检查二维向量中是否存在元素