nervjs
Version:
A react-like framework based on virtual-dom
165 lines (141 loc) • 3.32 kB
JavaScript
export function type (arg) {
const class2type = {}
const toString = class2type.toString
const types = 'Boolean Number String Function Array Date RegExp Object Error'.split(' ')
for (let i = 0; i < types.length; i++) {
const typeItem = types[i]
class2type['[object ' + typeItem + ']'] = typeItem.toLowerCase()
}
if (arg === null) {
return arg + ''
}
return (typeof arg === 'object' || typeof arg === 'function')
? class2type[toString.call(arg)] || 'object'
: typeof arg
}
export function isBoolean (arg) {
return type(arg) === 'boolean'
}
export function isNumber (arg) {
return type(arg) === 'number'
}
export function isString (arg) {
return type(arg) === 'string'
}
export function isFunction (arg) {
return type(arg) === 'function'
}
export function isArray (arg) {
return type(arg) === 'array'
}
export function isDate (arg) {
return type(arg) === 'date'
}
export function isRegExp (arg) {
return type(arg) === 'regexp'
}
export function isObject (arg) {
return type(arg) === 'object'
}
export function isError (arg) {
return type(arg) === 'error'
}
export function isNative (Ctor) {
return isFunction(Ctor) && /native code/.test(Ctor.toString())
}
export function extend (source, from) {
if (!from) {
return source
}
for (let key in from) {
if (from.hasOwnProperty(key)) {
source[key] = from[key]
}
}
return source
}
export function clone (obj) {
return extend({}, obj)
}
export function getPrototype (obj) {
/* eslint-disable */
if (Object.getPrototypeOf) {
return Object.getPrototypeOf(obj)
} else if (obj.__proto__) {
return obj.__proto__
}
/* eslint-enable */
return obj.constructor.prototype
}
export function proxy (fn, context) {
return function () {
return fn.apply(context || this, arguments)
}
}
export function isEmptyObject (obj) {
if (!obj) {
return true
}
for (let prop in obj) {
if (obj.hasOwnProperty(prop)) {
return false
}
}
return true
}
export function debounce (func, wait, immediate) {
let timeout
let args
let context
let timestamp
let result
const later = function later () {
const last = +(new Date()) - timestamp
if (last < wait && last >= 0) {
timeout = setTimeout(later, wait - last)
} else {
timeout = null
if (!immediate) {
result = func.apply(context, args)
if (!timeout) {
context = null
args = null
}
}
}
}
return function debounced () {
context = this
args = arguments
timestamp = +(new Date())
const callNow = immediate && !timeout
if (!timeout) {
timeout = setTimeout(later, wait)
}
if (callNow) {
result = func.apply(context, args)
context = null
args = null
}
return result
}
}
export function throttle (fn, threshhold, scope) {
threshhold || (threshhold = 250)
let last, deferTimer
return function () {
let context = scope || this
let now = +new Date()
let args = arguments
if (last && now < last + threshhold) {
clearTimeout(deferTimer)
deferTimer = setTimeout(() => {
last = now
fn.apply(context, args)
}, threshhold)
} else {
last = now
fn.apply(context, args)
}
}
}