cache

根据参数缓存函数执行的结果, 同样的参数只会执行一次缓存函数

cache(fn: Function): function (string): any
Parameters
fn (Function) 需要缓存的函数
Returns
function (string): any: 缓存过的函数
Example
const cachedToUpperCase = cache(function (str) {
 return console.error(str.toUpperCase())
})

const cachedFunctionWithParam = cache(function (str, fn) {
 return fn(str)
})

cachedToUpperCase('a')
// => 'A'

cachedToUpperCase('a')
// => 'A'

cachedFunctionWithParam('figure', str => str.big())
// => '<big>figure</big>'

cachedFunctionWithParam('figure', str => str.small())
// => '<big>figure</big>'

clone

深度克隆一个对象, 即使是包含了日期、正则、函数. 对于函数即使 clone 过, 也能拿到正确的 this.

clone(obj: any, context: any): any
Parameters
obj (any) 待克隆的对象
context (any)
Returns
any: 深度克隆对象
Example
clone({ name: 'tom', range: [60, 80, 75] })
// => { name: 'tom', range: [60, 80, 75] }

clone({ date: new Date(), regexp: new RegExp('d+', 'g'), call: function () { console.log('sewing') } })
// => { date: new Date(), regexp: new RegExp('d+', 'g'), call: function () { console.log('sewing') } }

const obj = {
  range: 10,
  setRange () {
    return ++this.range && this
  }
}
clone(obj).setRange().range
// => 11

obj.range
// => 10

createSrcElement

通过标签名称来创建 src 元素并绑定 load 事件, 非 HTMLMediaElement | HTMLImageElement 元素 会被直接插入到页面的 head 标签下.

createSrcElement(tag: string, src: string, prophase: any): Promise
Parameters
tag (string) 元素标签名称
src (string) 元素的 src 属性
prophase (any)
Returns
Promise: load/error 事件触发返回 promise
Example
createSrcElement('script', 'https://unpkg.com/vue')
  .then(script => {
    console.log(script) // => <script src="https://unpkg.com/vue"></script>
  })

const setImageCrossOrigin = img => {
  img.crossOrigin = 'Anonymous'
  return img
}
createSrcElement('img', 'https://example.com/example.png', setImageCrossOrigin)
 .then(images => {
   console.log(image)
 })

createStyleElement

创建一个 link[rel="stylesheet"] 并且直接插入到页面的 head 标签下

createStyleElement(href: string, prophase: any): HTMLLinkElement
Parameters
href (string) 标签的样式源
prophase (any)
Returns
HTMLLinkElement: 创建过的 link 标签
Example
function prefetch (url, type = 'image') {
  createStyleElement(url, element => {
    element.rel = 'prefetch'
    element.as = type
    return element
  })
}

prefetch('https://bit.ly/2HqROmb')
// => <link rel="prefetch" href="https://bit.ly/2HqROmb" as="image"/>

createStyleElement('https://unpkg.com/minireset.css/minireset.css')
// => <link rel="stylesheet" href="https://unpkg.com/minireset.css/minireset.css"/>

debounce

防抖动函数, 规定时间内的多次调用归为一次函数调用. 适用于 input、scroll 等事件. 查看 debounce 和 throttle 区别: https://css-tricks.com/debouncing-throttling-explained-examples/

debounce(func: Function, wait: number): any
Parameters
func (Function) 需要防抖动的函数
wait (number = 50) 延迟时间 (毫秒)
Returns
any:
Example
window.addEventListener('resize', debounce(function () { console.log(this) }, 100))

get

通过对象的路径获取对象上的值

get(obj: Object, path: string, defaultValue: any): any
Parameters
obj (Object) 待获取特定值的对象
path (string) 特定值的路径
defaultValue (any) 路径中存在值为 null/undefined 时的默认值
Returns
any: 获取到的特定值
Example
get({ person: { tom: { age: 10 } } }, 'person.tom.age', '18')
// => 10

get({ person: { tom: { age: 10 } } }, 'person.tom.sex', 'male')
// => male

get({ person: null }, 'person.tom.sex', 'female')
// => female

get({ person: { tom: { sex: undefined } } }, 'person.tom.sex', 'female')
// => female

get({ person: { tom: { sex: undefined } } }, null)
// => { person: { tom: { sex: undefined } } }

inRange

判断一个数是否在一段区间内, 与 lodash/inRange 不同的是: lodash 认为 7 不在 [3, 7] 这个区间内

inRange(number: number, start: number, end: number): boolean
Parameters
number (number) 需要判断区间的参数
start (number = 0) 起始区间, 默认值是 0
end (number = Number.MAX_VALUE) 终止区间, 默认值是最大值
Returns
boolean: 是否存在于一段区间内
Example
inRange(7, 3, 7)
// => true

inRange(1, 3, 5)
// => false

inRange(10, 9)
// => true

inRange(0)
// => true

insert

对数组和字符串进行插入操作, 如果插入对象类型不是为数组对象直接返回插入对象

insert(target: (Array | string), index: number, source: any)
Parameters
target ((Array | string)) 插入对象
index (number) 插入位置索引
source (any) 插入对象
Example
insert(['a', 'b', 'c'], 0, 'TEST')
// => ["TEST", "a", "b", "c"]

insert(['a', 'b', 'c'], 0, { foo: true })
// => [{ foo: true }, "a", "b", "c"]

insert('123456', 4, 'TEST')
// => 1234TEST56

insert('object in string', 4, { foo: true })
// => obje{"foo":true}ct in string

insert(undefined, 0, 'foo')
// => undefined

insert(null, 0, 'foo')
// => null

baseCreateElement

通过给定的标签名创建一个元素

baseCreateElement(tag: string): HTMLElement
Parameters
tag (string) 标签名称
Returns
HTMLElement: DOM 元素
Example
baseCreateElement('div')
// => <div></div>

baseCreateElement('script')
// => <script></script>

baseCreateElement('examples')
// => <examples></examples>

formatJSONString

转换 json 格式的 string 为 json 对象, 如果不是则直接返回 string 本身

formatJSONString(str: string): (Object | any)
Parameters
str (string) json 格式的参数
Returns
(Object | any): 转化之后的 json 对象或者原始值本身
Example
formatJSONString({ name: 'tom', age: 18 })
// => { name: 'tom', age: 18 }

formatJSONString('{"name":"tom","age":18}')
// => { name: "tom", age: 18 }

formatJSONString("{\"author\":\"\",\"datetime\":\"\",\"description\":\"default version\",\"modelName\":\"delta\",\"version\":\"eta_agent3.9\"}")
// => { author: "", datetime: "", description: "default version", modelName: "delta", version: "eta_agent3.9" }

isDate

判断是否是日期

isDate(date: (Date | number)): boolean
Parameters
date ((Date | number)) 可以是 date 或者 getTime 之后的数字
Returns
boolean: 是否是日期类型
Example
isDate(Date.now())
// => true

isDate(new Date())
// => true

isDate(Date.now() + '')
// => false

isEmpty

判断一个对象是否是 Empty

isEmpty(obj: Object): boolean
Parameters
obj (Object) 判断的对象
Returns
boolean: 是否为空
Example
isEmpty(null)
// => true

isEmpty(undefined)
// => true

isEmpty('')
// => true

isEmpty(0)
// => false

isEmpty({})
// => true

isEmpty([1, 2, 3])
//=> false

isEmptyObject

判断对象是否是一个空对象

isEmptyObject(obj: any): boolean
Parameters
obj (any) 待判断对象
Returns
boolean: 是否是空对象
Example
isEmptyObject()
// => true

isEmptyObject('')
// => true

isEmptyObject(null)
// => true

isEmptyObject(undefined)
// => true

isEmptyObject([])
// => true

isEmptyObject({})
// => true

isEmptyObject(['a', 'b', 'c'])
// => false

isEmptyObject({ name: 'tom' })
// => false

isEmptyValueObj

判断对象是否为空, 或者判断对象不同层级上是否有为空的值

isEmptyValueObj(obj: Object, depth: number): boolean
Parameters
obj (Object) 判断的对象
depth (number) 递归判断对象的层级
Returns
boolean: 当前对象是否存在空值
Example
isEmptyValueObj({ name: 'tom', age: 0 })
// => false

isEmptyValueObj({ name: '', age: 0 })
// => true

isEmptyValueObj({
  name: 'lee',
  age: 18,
  empty_object: [{ name: undefined }]
})
// => false

isEmptyValueObj({
  name: 'lee',
  age: 18,
  empty_object: [{ name: undefined }]
}, 2)
// => true

isEncodedString

判断字符串是否是经过 encode

isEncodedString(str: string): (boolean | string)
Parameters
str (string) 需要判断的字符串, 如果不是 String 类型则返回 false
Returns
(boolean | string): 没有经过 encode 会返回 false, 反之直接返回 decode 的结果
Example
isEncodedString('name=tom&age=29')
// => false

isEncodedString('name%3Dtom%26age%3D29')
// => 'name=tom&age=29'

isMobile

根据 ua 来判断是否是移动端平台

isMobile(userAgent: string): boolean
Parameters
userAgent (string = navigator.userAgent) navigator.userAgent
Returns
boolean: 是否是移动端平台

isPrimitive

判断一个对象是否是 primitive 值 (Number、String、Boolean、Undefined、Null、Symbol)

isPrimitive(obj: any): boolean
Parameters
obj (any) 判断的对象
Returns
boolean: 是否是 primitive value
Example
isPrimitive(null)
// => true

isPrimitive('tom')
// => true

isPrimitive(Symbol(12345))
// => true

isPrimitive({})
// => false

isPrimitive([])
// => false

isPrimitive(function () {})
// => false

isType

判断对象的类型

isType(obj: any, types: (string | Array)): boolean
Parameters
obj (any) 需要判断类型的对象
types ((string | Array) = '') 对象的类型
Returns
boolean: 入参对象是否与给定的对象类型匹配
Example
isType(null, 'null')
// => true

isType({}, 'object')
// => true

isType([], 'ARRAY')
// => true

isType(undefined, 'undefined')
// => true

isType([], ['string', 'array', 'BOOLEAN'])
// => true

map2SearchString

map 结构对象转化为 url search string. 支持 Array、Object、Function. 应该注意的是 url 的长度最好应该在 2048 之内, 否则可能有部分浏览器不支持.

map2SearchString(map: Object): string
Parameters
map (Object) map 结构的对象
Returns
string: 转化后的 search string
Example
map2SearchString({ foo: undefined, bar: null })
// => '?foo=undefined&bar=null'

map2SearchString({ regexp: /\\d+/g, blank: 'foo bar' })
// => '?regexp=%2F%5Cd%2B%2Fg&blank=foo%20bar'

map2SearchString({ name: 'tom', age: 20 })
// => '?name=tom&age=20'

map2SearchString({ func () { return 'hello world' } })
// => "?func=func()%20%7B%20return%20'hello%20world'%20%7D"

map2SearchString({ array: [1, 2, 3, 4], map: { foo: true, bar: -1 } })
// => '?array=%5B1%2C2%2C3%2C4%5D&map=%7B%22foo%22%3Atrue%2C%22bar%22%3A-1%7D'

parseJSONString

递归格式化 json 对象或者字符串, 为保证超大数值的精准性, 不会将超大数值的字符串转为数字.

parseJSONString(json: (string | Object)): (string | Object)
Parameters
json ((string | Object)) 待格式化的 json 对象或者字符串
Returns
(string | Object): 格式化之后的值
Example
// will convert `age` to numeric type
parseJSONString({ name: 'tom', age: 18 })
// => { name: 'tom', age: 18 }

// will not convert `orderID` to numeric type
parseJSONString({ orderID: '1200020707947551541', riderName: 'bush' })
// => { orderID: '1200020707947551541' }

parseJSONString({ person: "{ \"name\": \"tom\", \"age\": 18 }" })
// => { person: { name: 'tom', age: 18 } }

parseJSONString({ person: "{ \"name\": \"tom\", \"age\": 20, \"other\": \"{ \\\"female\\\": true }\", \"birth\": \"beijin\", \"parent\": \"{ \\\"father\\\": \\\"bush\\\" }\" }" })
// => { person: { name: 'tom', age: 20, other: { female: true }, birth: 'beijin', parent: { father: 'bush' } } }

parseString

将字符串作为 JavaScript 并执行

parseString(str: string): any
Parameters
str (string) JavaScript 表达式, 语句或一系列语句的字符串
Returns
any: 返回计算后的结果
Example
parseString('true')
// => true

parseString("{ name: 'tom', age: 20, parent: { name: 'jack' } }")
// => { name: 'tom', age: 20, parent: { name: 'jack' } }

parseString('1 + 10 * 3')
// => 31

removeOne

从数组中根据 value 值移除特定的 item

removeOne(array: Array, val: any): any
Parameters
array (Array) 数组数据源
val (any) 特定的 item 值, 必须为普通数据类型
Returns
any: 返回删除的 item 值, 如果没有找到这个 item 则为 undefined
Example
removeOne(['a', 'b', 'c', 'd', 'e'], 'd')
// => d

removeOne(['a', 'b', 'c', 'd', 'e'], 'f')
// => undefined

removeOne(undefined, 'f')
// => undefined

renameObjectKeys

替换一个对象的一级 key 名称, 再不修改原始对象的情况下返回一个新的对象.

renameObjectKeys(target: Object, source: Object): Object
Parameters
target (Object = {}) 等待替换名称的对象
source (Object = {}) key-value 结构, 包含替换前后的 key 名称, 替换后的名称不应该存在原始对象的名称中
Returns
Object: 替换名称之后的对象
Example
renameObjectKeys({ name: 'male' }, { name: 'sex' })
// => { sex: 'male' }

renameObjectKeys({ name: 'male', education: '18' }, { name: 'sex', education: 'age' })
// => { sex: 'male', age: '18' }

searchString2Map

将 url search string 格式转化为 map 形式, 键值对中的值将被转化为原始类型. 可从 string 中直接解析出 JSON.

searchString2Map(search: string): Object
Parameters
search (string) 传入的 search string, 如果不传或者类型不为 String, 将使用 location.search 作为默认值
Returns
Object: 转化后的 map 结构对象
Example
searchString2Map('?name=tom&age=18&sex=male')
// => { name: 'tom', age: 18, sex: 'male' }

searchString2Map('?obj=%7Bname%3A%20'tom'%2C%20age%3A%2018%2C%20sex%3A%20'male'%7D&app=true')
=> { obj: { name: 'tom', age: 18, sex: 'male' }, app: true }

throttle

节流函数, 规定时间内函数只会被调用一次. 查看 throttle 和 debounce 区别: https://css-tricks.com/debouncing-throttling-explained-examples/

throttle(func: Function, wait: number): any
Parameters
func (Function) 需要节流的函数
wait (number = 50) 延迟时间 (毫秒)
Returns
any:
Example
window.addEventListener('resize', throttle(function () { console.log(this) }, 100))

throttleWith

根据每次传递节流函数参数的不同, 来决定当前函数是否被节流. 例如: 根据接口返回的 http code 进行前端的交互性提示, http code 的不同来保证相同的 http code 在错误提醒时, 只会触发一次. 查看 throttle 和 debounce 区别: https://css-tricks.com/debouncing-throttling-explained-examples/

throttleWith(func: Function, wait: number, comparator: Function): any
Parameters
func (Function) 需要节流的函数
wait (number = 50) 延迟时间 (毫秒)
comparator (Function) 对比每次进行节流的参数
Returns
any:
Example
const shouldWarnHttpError = ([prev = {}], [next]) => prev.status === next.status

const error = throttleWith(err => {
  alert(err.status)
}, 50, shouldWarnHttpError)

fetch('www.examples/404')
 .then(noop, error)

fetch('www.examples/404')
 .then(noop, error)

fetch('www.examples/502')
 .then(noop, error)

// => will only alert 404、502 once