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])/g
var hyphenate = cached(function (str) {
return str
.replace(hyphenateRE, '$1-$2')
.replace(hyphenateRE, '$1-$2')
.toLowerCase()
})
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
缓存结果避免重复计算吧..
这二行是关键吧
存在了就直接用
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", 然后小写化~