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 柯里化、深拷贝、浅拷贝的更多相关文章

  1. js柯里化的一个应用

    听到同学说面试一道题目 add(1)(2)(3)(4); 查询了下资料  这是一个js里面的柯里化 现象 add_curry防范返回的是一个 retVal,并不是执行结果.这里的代码很想递归,但是不是 ...

  2. JS 柯里化 (curry)

    用 JS 理解柯里化 函数式编程风格,试图以函数作为参数传递(回调)和无副作用的返回函数(修改程序的状态). 很多语言采用了这种编程风格.JavaScript,Haskell,Clojure,Erla ...

  3. js 柯里化Currying

    今天读一篇博客的时候,看都有关柯里化的东西,由于好奇,特意查了一下,找到一篇比较好的文章,特意收藏. 引子先来看一道小问题:有人在群里出了到一道题目:var s = sum(1)(2)(3) .... ...

  4. JS - 柯里化

    一:what's this? 柯里化: 是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术.其实,柯里化就是用闭包原理实现函数 ...

  5. js柯里化

    这篇文章讲的很好啊~例子很好 http://www.zhangxinxu.com/wordpress/2013/02/js-currying/ 这篇是讲函数式编程的,其中也有涉及到,说明了柯里化是一种 ...

  6. JavaScript函数的柯里化(currying)

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/currying.html 什么是js函数的currying /柯里化? 说到js的柯里化,相信很多朋友都会头大.或 ...

  7. JS 函数的柯里化与反柯里化

    ===================================== 函数的柯里化与反柯里化 ===================================== [这是一篇比较久之前的总 ...

  8. 【转载】JS中bind方法与函数柯里化

    原生bind方法 不同于jQuery中的bind方法只是简单的绑定事件函数,原生js中bind()方法略复杂,该方法上在ES5中被引入,大概就是IE9+等现代浏览器都支持了(有关ES5各项特性的支持情 ...

  9. js高阶函数应用—函数柯里化和反柯里化(二)

    第上一篇文章中我们介绍了函数柯里化,顺带提到了偏函数,接下来我们继续话题,进入今天的主题-函数的反柯里化. 在上一篇文章中柯里化函数你可能需要去敲许多代码,理解很多代码逻辑,不过这一节我们讨论的反科里 ...

随机推荐

  1. python基础--匿名函数

    def calc(x): return x+1 a=calc(10) print(calc) print(lambda x:x+1)#lambda函数的内存地址,利用函数名可以作为值传递给变量 b=l ...

  2. window x86编译openssl vs2013

    1.下载OpenSSL,http://www.openssl.org/source/(Feb 8 18:29:10 2011 openssl-.0.0d.tar.gz[LATEST] ),winrar ...

  3. jmeter post请求在终端传参,并且指定请求参数文件

    命令:jmeter -n -t   jmeter_1.jmx   -l   report/report30.jtl    -Jnum=3000 -e -o   webresult/3000result ...

  4. python数据分析第二版:pandas

    一:pandas 两种数据结构:series和dataframe series:索引(索引自动生成)和标签(人为定义)组成---返回一个对象 obj = pd.Series([1,2,3,4]) ob ...

  5. UML建模重点圈划

    面向对象的特征 *P9*>封装性>继承性>多态性>传递性 建模语言的三个类别 *P14*> - 非形式化的.半形式化的和形式化的 UML 特点*15*主要有三个特点:&g ...

  6. dict以及defaultdict的简单使用

    先看一个需求 from collections import defaultdict """ 需求: 统计user_list中字母出现的次数 ""&q ...

  7. java.nio.channels.IllegalBlockingModeException

    报错信息如下: Exception in thread "main" java.nio.channels.IllegalBlockingModeException at java. ...

  8. [super class]和[self class]

    参考: https://www.jianshu.com/p/3f2bcc588b44?utm_campaign=hugo&utm_medium=reader_share&utm_con ...

  9. 【转】iis解决应用程序池**提供服务的进程意外终止进程ID是**。进程退出代码是'0x80'

    转自:http://blog.sina.com.cn/s/blog_56a68d5501013xdd.html 我们公司旗下的红黑互联会遇到这种问题 事件类型: 警告事件来源: W3SVC事件种类: ...

  10. joke python

    w # -*- coding: utf-8 -*- import pycurl import re import cStringIO from pypinyin import lazy_pinyin ...