js 柯里化、深拷贝、浅拷贝
curry
const sum = (a, b, c, d) => a + b + c + d
const curry = fn =>
(judge = (...args) =>
args.length >= fn.length ? fn(...args) : (...arg) => judge(...args, ...arg))
const currySum = curry(sum)
console.log(currySum(1, 2)(4)(3)) //10
deepClone
function getType(obj) {
const str = Reflect.toString.call(obj)
const map = {
'[object Boolean]': 'boolean',
'[object Number]': 'number',
'[object String]': 'string',
'[object Function]': 'function',
'[object Array]': 'array',
'[object Date]': 'date',
'[object RegExp]': 'regExp',
'[object Undefined]': 'undefined',
'[object Null]': 'null',
'[object Object]': 'object',
'[object Map]': 'map',
'[object Set]': 'set',
}
if (obj instanceof Element) {
// 判断是否是dom元素,如div等
return 'element'
}
return map[str]
}
function deepClone(ori) {
const type = getType(ori)
let copy
switch (type) {
case 'array':
return copyArray(ori, copy)
case 'object':
return copyObject(ori, copy)
case 'function':
return copyFunction(ori)
case 'map':
return copyMap(ori, copy)
case 'set':
return copySet(ori, copy)
default:
return ori
}
}
function copyArray(ori, copy = []) {
for (const [index, value] of ori.entries()) {
copy[index] = deepClone(value)
}
return copy
}
function copyObject(ori, copy = {}) {
for (const [key, value] of Reflect.entries(ori)) {
copy[key] = deepClone(value)
}
return copy
}
function copyMap(ori, copy = new Map()) {
for (const [key, value] of ori) {
copy.set(deepClone(value))
}
return copy
}
function copySet(ori, copy = new Set()) {
for (const [key, value] of ori.entries()) {
copy.add(key, deepClone(value))
}
return copy
}
function copyFunction(ori) {
const fun = eval(ori.toString())
fun.prototype = ori.prototype
return fun
}
shallowClone
function shallowClone(ori) {
if (typeof ori === 'object' && ori !== null) {
return Array.isArray(ori) ? copyArray(ori) : copyObject(ori)
}
return ori
}
function copyObject(ori, copy = {}) {
for (const [k, v] of Reflect.entries(ori)) {
copy[k] = v
}
return copy
}
function copyArray(ori, copy = []) {
for (const [k, v] of ori.entries()) {
copy[k] = v
}
return copy
}
js 柯里化、深拷贝、浅拷贝的更多相关文章
- js柯里化的一个应用
听到同学说面试一道题目 add(1)(2)(3)(4); 查询了下资料 这是一个js里面的柯里化 现象 add_curry防范返回的是一个 retVal,并不是执行结果.这里的代码很想递归,但是不是 ...
- JS 柯里化 (curry)
用 JS 理解柯里化 函数式编程风格,试图以函数作为参数传递(回调)和无副作用的返回函数(修改程序的状态). 很多语言采用了这种编程风格.JavaScript,Haskell,Clojure,Erla ...
- js 柯里化Currying
今天读一篇博客的时候,看都有关柯里化的东西,由于好奇,特意查了一下,找到一篇比较好的文章,特意收藏. 引子先来看一道小问题:有人在群里出了到一道题目:var s = sum(1)(2)(3) .... ...
- JS - 柯里化
一:what's this? 柯里化: 是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术.其实,柯里化就是用闭包原理实现函数 ...
- js柯里化
这篇文章讲的很好啊~例子很好 http://www.zhangxinxu.com/wordpress/2013/02/js-currying/ 这篇是讲函数式编程的,其中也有涉及到,说明了柯里化是一种 ...
- JavaScript函数的柯里化(currying)
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/currying.html 什么是js函数的currying /柯里化? 说到js的柯里化,相信很多朋友都会头大.或 ...
- JS 函数的柯里化与反柯里化
===================================== 函数的柯里化与反柯里化 ===================================== [这是一篇比较久之前的总 ...
- 【转载】JS中bind方法与函数柯里化
原生bind方法 不同于jQuery中的bind方法只是简单的绑定事件函数,原生js中bind()方法略复杂,该方法上在ES5中被引入,大概就是IE9+等现代浏览器都支持了(有关ES5各项特性的支持情 ...
- js高阶函数应用—函数柯里化和反柯里化(二)
第上一篇文章中我们介绍了函数柯里化,顺带提到了偏函数,接下来我们继续话题,进入今天的主题-函数的反柯里化. 在上一篇文章中柯里化函数你可能需要去敲许多代码,理解很多代码逻辑,不过这一节我们讨论的反科里 ...
随机推荐
- HDU 4678 Mine(博弈)
Mine Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submi ...
- Sass @debug
@debug 在 Sass 中是用来调试的,当你的在 Sass 的源码中使用了 @debug 指令之后,Sass 代码在编译出错时,在命令终端会输出你设置的提示 Bug: @debug 10em + ...
- Codeforces 832D: Misha, Grisha and Underground 【LCA模板】
题目链接 模板copy from http://codeforces.com/contest/832/submission/28835143 题意,给出一棵有n个结点的树,再给出其中的三个结点 s,t ...
- 一些vue 响应式系统的底层的细节
当你把一个普通的 JavaScript 对象传给 Vue 实例的 data 选项,Vue 将遍历此对象所有的属性,并使用 Object.defineProperty 把这些属性全部转为 getter/ ...
- dict以及defaultdict的简单使用
先看一个需求 from collections import defaultdict """ 需求: 统计user_list中字母出现的次数 ""&q ...
- 数据库智能管理助手-CloudDBA
摘要:阿里云CloudDBA主要分为离线分析和在线分析两种功能.帮助用户节省成本,定位问题,分析原因并推荐解决方法.CloudDBA可以做到实时诊断,离线诊断和SQL优化.并且通过MySQL的参数调优 ...
- Linux Crontab命令定时任务基本语法
一.Crontab查看编辑重启 1.查看crontab定时执行任务列表 crontab -l 2.编辑crontab定时执行任务 crontab -e 3.删除crontab定时任务 crontab ...
- 【CF1257F】Make Them Similar【meet in the middle+hash】
题意:给定n个数,让你给出一个数,使得n个数与给出的数异或后得到的数的二进制表示中1的数量相同 题解:考虑暴搜2^30去找答案,显然不可接受 显然可以发现,这是一个经典的meet in the mid ...
- WIN7自带端口转发渗透小技巧
目标是WIN7 X64,且开启了防火墙,想要用他的机器去访问别的机器,又不想登陆他的系统,常规办法一般是上传一个htran,然后进行转发,但是对方有杀软,有被杀的可能性,所以我用另外一种办法达到我的目 ...
- AT3576 E Popping Balls——计数思路
题目:https://code-festival-2017-qualb.contest.atcoder.jp/tasks/code_festival_2017_qualb_e 题解:https://w ...