function cached (fn) { var cache = Object.create(null) return function cachedFn (str) { var hit = cache[str]
return hit || (cache[str] = fn(str))
}
}var hyphenateRE = /([^-])([A-Z])/gvar hyphenate = cached(function (str) { return str
.replace(hyphenateRE, '$1-$2')
.replace(hyphenateRE, '$1-$2')
.toLowerCase()
})
1 回答
慕村9548890
TA贡献1884条经验 获得超4个赞
cached 是经典的memoization, 可以把一个function转换成一个具备cache功能的新函数, 对于已知会重复计算的函数或者递归调用型的函数有很好的优化效果, 用空间换时间(因为相同的输入只会计算一次, 重复调用从cache中取).
其中Object.create(null)
是非常棒的创建全空object
的方法, 是es6引入的新用法, 因为传入null
, 所以创建的object连prototype都没有, 所以后面连hasOwnProperty
的检查都可以避免了.
至于hyphenate
, 只是单纯的把camelCase转成hyphen-case(-
连接的)
至于用两个replace是为了可以转换此种结构:"AAAA", 第一次会变成: "A-AA-A", 第二次就可以彻底分割开了: "A-A-A-A", 然后小写化~
添加回答
举报
0/150
提交
取消