1, isStatic: check whether the data is the original data except symbol

function isStatic(value) {
    return(
        typeof value === 'string' ||
        typeof value === 'number' ||
        typeof value === 'boolean' ||
        typeof value === 'undefined' ||
        value === null
    )
}
Copy the code

2. IsPrimitive: Check if the data is raw

function isPrimitive(value) {
    return isStatic(value) || typeof value === 'symbol'
}
Copy the code

Array, Functions, Objects, Regexes, New Number(0), and New String(“)

function isObject(value) { let type = typeof value; return value ! = null && (type == 'object' || type == 'function'); }Copy the code

4. IsObjectLike: Check whether value is a class object. If a value is a class object, it should not be null, and the result after typeof is “object”.

function isObjectLike(value) { return value ! = null && typeof value == 'object'; }Copy the code

5. GetRawType: Gets the data type. The result is Number, String, Object, Array, etc

function getRawType(value) {
    return Object.prototype.toString.call(value).slice(8, -1)
}
//getoRawType([]) ==> Array
Copy the code

6. IsPlainObject: Determines whether the data is of type Object

function isPlainObject(obj) {
    return Object.prototype.toString.call(obj) === '[object Object]'
}
Copy the code

7. IsArray: Checks whether the data is an array

The function isArray (arr) {return Object. The prototype. ToString. Call (arr) = = = '[Object Array]'} will isArray mounted to the Array Array.isArray = Array.isArray || isArray;Copy the code

IsRegExp: checks whether data is a regular object

function isRegExp(value) {
    return Object.prototype.toString.call(value) === '[object RegExp]'
}
Copy the code

9. IsDate: Determine whether data is a time object

function isDate(value) {
    return Object.prototype.toString.call(value) === '[object Date]'
}
Copy the code

10. IsNative: Determine whether value is a built-in function of the browser

The main code block after the built-in Function toString is [native code], while non-built-in functions are related code, so non-built-in functions can be copied.

function isNative(value) {
    return typeof value === 'function' && /native code/.test(value.toString())
}
Copy the code

IsFunction: check whether value is a function

function isFunction(value) {
    return Object.prototype.toString.call(value) === '[object Function]'
}
Copy the code

12. IsLength: Check if value is a valid class array length

function isLength(value) {
      return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= Number.MAX_SAFE_INTEGER;
}
Copy the code

IsArrayLike: Check if value is a class array

If a value is considered an array of classes, it is not a function, and value.length is an integer greater than or equal to 0 and less than or equal to number. MAX_SAFE_INTEGER. Here strings will also be treated as class arrays.

function isArrayLike(value) { return value ! = null && isLength(value.length) && ! isFunction(value); }Copy the code

14. IsEmpty: check whether value isEmpty

If null, return true; If it is a class array, determine the length of the data; If the Object is an Object, check whether it has attributes. For other data, return false(or return true instead)

function isEmpty(value) { if (value == null) { return true; } if (isArrayLike(value)) { return ! value.length; }else if(isPlainObject(value)){ for (let key in value) { if (hasOwnProperty.call(value, key)) { return false; } } return true; } return false; }Copy the code

Cached: Memory function: cached result of operation

function cached(fn) {
    let cache = Object.create(null);
    return function cachedFn(str) {
        let hit = cache[str];
        return hit || (cache[str] = fn(str))
    }
}
Copy the code

16. Camelize: Naming of horizontal turning hump

let camelizeRE = /-(\w)/g; function camelize(str) { return str.replace(camelizeRE, function(_, c) { return c ? c.toUpperCase() : ''; } //ab-cd-ef ==> abCdEf // let _camelize = cached(camelize)Copy the code

Horizontal naming: Split strings, concatenated with -, and converted to lowercase

let hyphenateRE = /\B([A-Z])/g; function hyphenate(str){ return str.replace(hyphenateRE, '-$1').tolowerCase ()} //abCd ==> ab-cd // let _hyphenate = cached;Copy the code

Capitalize the first part of a string

Capitalize (STR){return str.charat (0).touppercase () + str.slice(1)} // capitalize = capitalize = cached(capitalize)Copy the code

Extend: blends properties into the target object

function extend(to, _from) {
    for(let key in _from) {
        to[key] = _from[key];
    }
    return to
}
Copy the code

20, Object.assign: Copy Object attributes, shallow copy

Object.assign = Object.assign || function(){
    if(arguments.length == 0) throw new TypeError('Cannot convert undefined or null to object');

    let target = arguments[0],
        args = Array.prototype.slice.call(arguments, 1),
        key
    args.forEach(function(item){
        for(key in item){
            item.hasOwnProperty(key) && ( target[key] = item[key] )
        }
    })
    return target
}
Copy the code

You can shallow clone an Object using object. assign:

 let clone = Object.assign({}, target)
Copy the code

A simple deep clone can use json.parse () and json.stringify (). These apis parse JSON data, so only primitive types and arrays and objects other than Symbol can be parsed

let clone = JSON.parse( JSON.stringify(target) )

21, Clone: clone data, can be deep clone

Cloning rules for primitive types, time, re, error, array, and object are listed here, and the rest is optional

function clone(value, Deep) {if (isPrimitive (value)) {return value} the if (isArrayLike (value)) {/ / is a class Array value = Array. The prototype. Slice. The call (value)  return value.map(item => deep ? Clone (item, deep) : item)}else if(isPlainObject(value)){let target = {}, key; for (key in value) { value.hasOwnProperty(key) && ( target[key] = deep ? clone(value[key], deep) : value[key] ) } } let type = getRawType(value) switch(type){ case 'Date': case 'RegExp': case 'Error': value = new window[type](value); break; } return value }Copy the code

22. Identify browsers and platforms

// Let inBrowser = typeof window! = = “undefined”; Let inWeex = typeof WXEnvironment! = = “undefined” &&!!!!! WXEnvironment.platform; let weexPlatform = inWeex && WXEnvironment.platform.toLowerCase(); / browser/UA judge let UA = inBrowser && window. The navigator. UserAgent. ToLowerCase (); let isIE = UA && /msie|trident/.test(UA); Let isIE9 = UA && uA. indexOf(‘ MSIE 9.0 ‘) > 0; Let isEdge = UA && UA. IndexOf (‘ edge/ ‘) > 0; Let isAndroid = (UA && UA. IndexOf (‘ android ‘) > 0) | | (weexPlatform = = = “android”); Let isIOS = (UA && / iphone | the | | ipod ios /. The test (UA)) | | (weexPlatform = = = “ios”); let isChrome = UA && /chrome/\d+/.test(UA) && ! isEdge;

GetExplorerInfo: Get browser information

function getExplorerInfo() { let t = navigator.userAgent.toLowerCase(); return 0 <= t.indexOf("msie") ? { //ie < 11 type: "IE", version: Number(t.match(/msie ([\d]+)/)[1]) } : !! t.match(/trident\/.+? rv:(([\d.]+))/) ? { // ie 11 type: "IE", version: 11 } : 0 <= t.indexOf("edge") ? { type: "Edge", version: Number(t.match(/edge\/([\d]+)/)[1]) } : 0 <= t.indexOf("firefox") ? { type: "Firefox", version: Number(t.match(/firefox\/([\d]+)/)[1]) } : 0 <= t.indexOf("chrome") ? { type: "Chrome", version: Number(t.match(/chrome\/([\d]+)/)[1]) } : 0 <= t.indexOf("opera") ? { type: "Opera", version: Number(t.match(/opera.([\d]+)/)[1]) } : 0 <= t.indexOf("Safari") ? { type: "Safari", version: Number(t.match(/version\/([\d]+)/)[1]) } : { type: t, version: -1 } }Copy the code

24. IsPCBroswer: Checks whether the browser mode isPC

function isPCBroswer() { let e = navigator.userAgent.toLowerCase() , t = "ipad" == e.match(/ipad/i) , I = = = "iphone" e.m atch (/ iphone/I), r = = = "midp" e.m atch (/ midp/I), n = "rv: 2." = = e.m atch (/ rv: 2. / I). a = "ucweb" == e.match(/ucweb/i) , o = "android" == e.match(/android/i) , s = "windows ce" == e.match(/windows ce/i) , l = "windows mobile" == e.match(/windows mobile/i); return ! (t || i || r || n || a || o || s || l) }Copy the code

25, unique: array to return a new array

function unique(arr){ if(! IsArrayLink (arr)){// Not array-like Object return arr} let result = [] let objarr = [] let obj = object.create (null) arr. ForEach (item) => {if(isStatic(item)){// let key = item + '_' + getRawType(item); if(! Obj [key]){obj[key] = true result.push(item)}}else{// Reference type and symbol if(! objarr.includes(item)){ objarr.push(item) result.push(item) } } }) return resulte }Copy the code

26, Set simple implementation

window.Set = window.Set || (function () { function Set(arr) { this.items = arr ? unique(arr) : []; this.size = this.items.length; } set. prototype = {add: function (value) {// If the element already exists, skip it and return the Set structure. if (! this.has(value)) { this.items.push(value); this.size++; } return this; }, clear: function () {// Clear all members, no return value. This.items = [] this.size = 0}, delete: function (value) {// Delete a value, return a Boolean value indicating whether the deletion was successful. return this.items.some((v, i) => { if(v === value){ this.items.splice(i,1) return true } return false }) }, has: Function (value) {// Returns a Boolean value indicating whether the value is a member of Set. return this.items.some(v => v === value) }, values: function () { return this.items }, } return Set; } ());Copy the code

27, Repeat: Generate a repeated string consisting of N STR, which can be modified to fill an array, etc

function repeat(str, n) {
    let res = '';
    while(n) {
        if(n % 2 === 1) {
            res += str;
        }
        if(n > 1) {
            str += str;
        }
        n >>= 1;
    }
    return res
};
//repeat('123',3) ==> 123123123
Copy the code

28, dateFormater: format time

function dateFormater(formater, t){ let date = t ? new Date(t) : new Date(), Y = date.getFullYear() + '', M = date.getMonth() + 1, D = date.getDate(), H = date.getHours(), m = date.getMinutes(), s = date.getSeconds(); Return formater. Replace (/ YYYY | YYYY/g, Y). The replace (/ YY/g | YY, Y.s ubstr (2, 2)). The replace (/ MM/g (M < 10? '0':'') + M) .replace(/DD/g,(D<10? '0':'') + D) .replace(/HH|hh/g,(H<10? '0':'') + H) .replace(/mm/g,(m<10? '0':'') + m) .replace(/ss/g,(s<10? '0':'') + s) } // dateFormater('YYYY-MM-DD HH:mm', t) ==> 2019-06-26 18:30 // dateFormater('YYYYMMDDHHmm', t) ==> 201906261830Copy the code

DateStrForma: Converts the specified string from one time format to another

The form from should correspond to the position of STR

function dateStrForma(str, from, If (~(Y = from. IndexOf ('YYYY'))){Y = STR. Substr (Y, Y, Y, Y){Y = STR. Substr (Y, Y, Y); 4) to = to.replace(/YYYY|yyyy/g,Y) }else if(~(Y = from.indexOf('YY'))){ Y = str.substr(Y, 2) to = to.replace(/YY|yy/g,Y) } let k,i ['M','D','H','h','m','s'].forEach(s =>{ i = from.indexOf(s+s) k = ~i ? str.substr(i, 2) : '' to = to.replace(s+s, k) }) return to } // dateStrForma('20190626', 'YYYYMMDD', // dateStrForma('121220190626', '----YYYYMMDD', DateStrForma (' dateStrForma ', 'dateStrForma ') ==> dateStrForma(' dateStrForma ',' dateStrForma ', 'dateStrForma '); 'YYYYMMDD') = = > 20190626 / / general can also use regular to implement / / 'on June 26, 2019. The replace ()/(\ d {4}) on (\ d {2})/(\ d {2}),' $1 - $2 - $3) = = > 2019-06-26Copy the code

30, getPropByPath: get object property by string path: ‘obj[0].count ‘

function getPropByPath(obj, path, strict) { let tempObj = obj; path = path.replace(/\[(\w+)\]/g, '.$1'); // convert [0] to.0 path = path.replace(/^\./, "); Let keyArr = path.split('.'); // according to. Cut let I = 0; for (let len = keyArr.length; i < len - 1; ++i) { if (! tempObj && ! strict) break; let key = keyArr[i]; if (key in tempObj) { tempObj = tempObj[key]; } else {if (strict) {throw new Error(' Please transfer a valid prop path to form item! '); } break; }} return {o: tempObj, // original data k: keyArr[I], //key v: tempObj? TempObj [keyArr[I]] : null // Key value}; };Copy the code

GetUrlParam: Gets the Url parameter and returns an object

function GetUrlParam(){ let url = document.location.toString(); let arrObj = url.split("?" ); let params = Object.create(null) if (arrObj.length > 1){ arrObj = arrObj[1].split("&"); arrObj.forEach(item=>{ item = item.split("="); params[item[0]] = item[1] }) } return params; }Copy the code

/ /? A =1&b=2&c=3 ==> {a: “1”, b: “2”, c: “3”}

32, downloadFile: base64 Data export file, file download

function downloadFile(filename, data){ let DownloadLink = document.createElement('a'); if ( DownloadLink ){ document.body.appendChild(DownloadLink); DownloadLink.style = 'display: none'; DownloadLink.download = filename; DownloadLink.href = data; if ( document.createEvent ){ let DownloadEvt = document.createEvent('MouseEvents'); DownloadEvt.initEvent('click', true, false); DownloadLink.dispatchEvent(DownloadEvt); } else if ( document.createEventObject ) DownloadLink.fireEvent('onclick'); else if (typeof DownloadLink.onclick == 'function' ) DownloadLink.onclick(); document.body.removeChild(DownloadLink); }}Copy the code

33. ToFullScreen: full screen

function toFullScreen(){ let elem = document.body; elem.webkitRequestFullScreen ? elem.webkitRequestFullScreen() : elem.mozRequestFullScreen ? elem.mozRequestFullScreen() : elem.msRequestFullscreen ? elem.msRequestFullscreen() : elem.requestFullScreen ? Elem.requestfullscreen () : alert(" browsers do not support full screen "); }Copy the code

34, exitFullscreen: exitFullscreen

function exitFullscreen(){ let elem = parent.document; elem.webkitCancelFullScreen ? elem.webkitCancelFullScreen() : elem.mozCancelFullScreen ? elem.mozCancelFullScreen() : elem.cancelFullScreen ? elem.cancelFullScreen() : elem.msExitFullscreen ? elem.msExitFullscreen() : elem.exitFullscreen ? Elem.exitfullscreen () : alert(" switch failed, try Esc exit "); }Copy the code

RequestAnimationFrame: Window animation

window.requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame || window.oRequestAnimationFrame || function (callback) {// In order to get setTimteout as close to 60 frames per second as possible, window.setTimeout(callback, 1000/60); }; window.cancelAnimationFrame = window.cancelAnimationFrame || Window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || window.msCancelAnimationFrame || window.oCancelAnimationFrame || function (id) { // To get setTimteout as close as possible to the 60 frames per second effect window.clearTimeout(id); }Copy the code

36. _isNaN: Checks whether data is a non-numeric value

Native isNaN converts arguments to numbers (valueof), while NULL, true, false, and arrays of length less than or equal to 1 (elements of non-nan data) are converted to numbers, which is not what I want. Symbol data does not have a Valueof interface, so isNaN throws an error, which is left behind to avoid errors

function _isNaN(v){ return ! (typeof v === 'string' || typeof v === 'number') || isNaN(v) }Copy the code

37, Max: Find the maximum value of non-nan data in the array

function max(arr){ arr = arr.filter(item => ! _isNaN(item)) return arr.length ? Math.max.apply(null, arr) : undefined }Copy the code

// Max ([1, 2, ’11’, null, ‘FDF’, []]) ==> 11

38, min: Find the minimum value in array non-nan data

function min(arr){ arr = arr.filter(item => ! _isNaN(item)) return arr.length ? Math.min.apply(null, arr) : undefined }Copy the code

//min([1, 2, ‘11’, null, ‘fdf’, []]) ==> 1

39. Random: Returns a random number between lower-upper

Lower and upper must be non-nan data regardless of whether they are positive, negative or large

function random(lower, upper){
    lower = +lower || 0
    upper = +upper || 0
    return Math.random() * (upper - lower) + lower;
}
//random(0, 0.5) ==> 0.3567039135734613
//random(2, 1) ===> 1.6718418553475423
//random(-2, -1) ==> -1.4474325452361945
Copy the code

Keys: Returns an array of the self-enumerable properties of a given Object

Object.keys = Object.keys || function keys(object) { if(object === null || object === undefined){ throw new TypeError('Cannot convert undefined or null to object'); } let result = [] if(isArrayLike(object) || isPlainObject(object)){ for (let key in object) { object.hasOwnProperty(key)  && ( result.push(key) ) } } return result }Copy the code

Object.values: Returns an array of all enumerable property values for a given Object itself

Object.values = Object.values || function values(object) { if(object === null || object === undefined){ throw new TypeError('Cannot convert undefined or null to object'); } let result = [] if(isArrayLike(object) || isPlainObject(object)){ for (let key in object) { object.hasOwnProperty(key)  && ( result.push(object[key]) ) } } return result }Copy the code

Arr. fill: Fills the array with a value starting at start and ending at end (but not end), returning the array

Array.prototype.fill = Array.prototype.fill || function fill(value, start, end) {
    let ctx = this
    let length = ctx.length;

    start = parseInt(start)
    if(isNaN(start)){
        start = 0
    }else if (start < 0) {
        start = -start > length ? 0 : (length + start);
      }

      end = parseInt(end)
      if(isNaN(end) || end > length){
          end = length
      }else if (end < 0) {
        end += length;
    }

    while (start < end) {
        ctx[start++] = value;
    }
    return ctx;
}
Copy the code

//Array(3).fill(2) ===> [2, 2, 2]

43, arr.includes: used to determine whether an array contains a specified value. If true, false otherwise, you can specify the starting location of the query

Array.prototype.includes = Array.prototype.includes || function includes(value, start){
    let ctx = this
    let length = ctx.length;

    start = parseInt(start)
    if(isNaN(start)){
        start = 0
    }else if (start < 0) {
        start = -start > length ? 0 : (length + start);
      }

    let index = ctx.indexOf(value)
    return index >= start;
}
Copy the code

Arr. find: Returns the value of the first element in the array that passes the test (judged by fn)

Array.prototype.find = Array.prototype.find || function find(fn, ctx){
    fn = fn.bind(ctx)
    let result;
    this.some((value, index, arr), thisValue) => {
        return fn(value, index, arr) ? (result = value, true) : false
    })
    return result
}
Copy the code

Arr. FindIndex: Returns the index of the first element in the array that passes the test (judged in fn)

Array.prototype.findIndex = Array.prototype.findIndex || function findIndex(fn, ctx){
    fn = fn.bind(ctx)
    let result;
    this.some((value, index, arr), thisValue) => {
        return fn(value, index, arr) ? (result = index, true) : false
    })

    return result
}
Copy the code

Performance. Timing: Performance. Timing is used for performance analysis

Window.onload = function(){setTimeout(function(){let t = performance.timing console.log('DNS query time: '+ (t.domainlookupend - t.domainlookupstart).tofixed (0)) console.log('TCP connection time: '+ (t.connectend - t.connectstart).tofixed (0)) console.log(' Request request time: '+ (t.esponseend - t.esponsestart).tofixed (0)) console.log(' Parsing dom tree time: '+ (t.domcomplete - t.dominteractive).tofixed (0)) console.log(' White screen time: '+ (t.reesponsestart -t.navigationStart).tofixed (0)) console.log(' domReady time: '+ (t.d omContentLoadedEventEnd - t.n avigationStart) toFixed (0)) console. The log (' onload time: ToFixed (0)) if(t = performance.memory){console.log('js memory usage: ' + (t.usedJSHeapSize / t.totalJSHeapSize * 100).toFixed(2) + '%') } }) }Copy the code

Disable certain keyboard events:

document.addEventListener('keydown', function(event){ return ! ( 112 == event.keyCode || //F1 123 == event.keyCode || //F12 event.ctrlKey && 82 == event.keyCode || //ctrl + R event.ctrlKey && 78 == event.keyCode || //ctrl + N event.shiftKey && 121 == event.keyCode || //shift + F10 event.altKey && 115 = = event. The keyCode | | / / Alt + F4 "A" = = event. The srcElement. TagName && event. ShiftKey / / shift + click on A TAB) | | (event.returnValue = false) });Copy the code

Prohibit right clicking, selecting and copying

['contextmenu', 'selectstart', 'copy'].forEach(function(ev){
    document.addEventListener(ev, function(event){
        return event.returnValue = false
    })
});
Copy the code