# 选择器函数

window.$ = (selector,context,undefined)=>{
	let matches = {
        '#':"getElementById",
        '.':"getElementByClassName",
        '@':"getElementByName",
        '=':"getElementByTagName",
        '*':"querySelectorAll"
    }[selector[0]]
    //selector.slice(1)去掉例如'.name'&&'#name'的'.#'后的值
    let el = ((context === undefined ? document:context)[matches](selector.slice(1)))
    return el.length < 2 ? el[0]:el
}

# 复制到剪贴板

可以使用 navigator.clipboard.writeText 将任何文本复制到剪贴板


const copyToClipboard = (text) => navigator.clipboard.writeText(text);
copyToClipboard("Hello World");

# 找出一年中的哪一天

查找给定日期的哪一天


const dayOfYear = (date) =>  Math.floor((date - new Date(date.getFullYear(), 0, 0)) / 1000 / 60 / 60 / 24);
dayOfYear(new Date());
// Result: 272

# 找出两日期之间的天数

获取 给定两个日期之间间隔的天数


const dayDif = (date1, date2) => Math.ceil(Math.abs(date1.getTime() - date2.getTime()) / 86400000)

dayDif(new Date("2020-10-21"), new Date("2021-10-22"))// Result: 366

你可以通过使用 document.cookie 访问 cookie 并清除它来轻松清除存储在网页中的所有 cookie。


const clearCookies = document.cookie.split(';').forEach(cookie => document.cookie = cookie.replace(/^ +/, '')
.replace(/=.*/, `=;expires=${new Date(0).toUTCString()};
path=/`));

# 生成随机十六进制

可以使用 Math.random 和 padEnd 属性生成随机十六进制颜色。


const randomHex = () => `#${Math.floor(Math.random() * 0xffffff).toString(16).padEnd(6, "0")}`
console.log(randomHex());
//Result: #92b008

# 生成随机 UUID

window.uuid = ()=>{
    return 'XXX' + Math.Random().toString(36).substring(2,15) + Math.Random().toString(36).substring(2,15)
}

# MyArray

function MyArray() {}
MyArray.prototype.length = 0;
(function() {
	var methods = ['push', 'pop', 'shift', 'unshift', 'slice', 'splice', 'join'];
	for (var i = 0; i < methods.length; i++)(function(name) {
		MyArray.prototype[name] = function() {
			return Array.prototype[name].apply(this, arguments);
		}
	})(methods[i]);
})();
var mine = new MyArray();
mine.push(1, 2, 3);

# Handler

addHandler: function( types, handler ) {
            if( !Array.isArray( types ) ) {
                types = [ types ];
            }
            types.forEach( function( type ) {
                handlers[ type ] = handler;
            });
},

removeHandler: function( types ) {
            this.addHandler( types, undefined );
}

# 判断两个对象是否相等

function isObjectValueEqual(a, b) {
	//判断两个对象是否相等
        var aProps = Object.getOwnPropertyNames(a);
        var bProps = Object.getOwnPropertyNames(b);

	if(a===b){
	    return true;
	}

        if (aProps.length != bProps.length) {
            return false;
        }

        for (var i = 0; i < aProps.length; i++) {
            var propName = aProps[i];

            if (a[propName] !== b[propName]) {
                return false;
            }
        }

        return true;
}

# 防抖函数

const debounce = (fn,delay=500,immediate=false) =>{
   let timer = null
   let args = arguments
   return ()=>{
       clearTimeout(timer);
       if(immediate){
          timer = setTimeout(()=>{
           			fn.apply(this,args)
       			},delay)
       }else{
           fn.apply(this,args)
       }
   }
}

# 节流函数

const throttle = (fn,delay = 500)=>{
    let flag = true
    return (...args)=>{
        if(!flag) return;
         flag = false
        setTimeout(()=>{
            fn.apply(this,args)
            flag = true
        },delay)
    }
}

# 字符串工具方法

# 解析URL Params 为对象

function parseParams(url){
    const paramsStr = /.+\?(.+)$/.exec(url)[1];	// 将 ? 后面的字符串取出来
    const paramsArr = paramsStr.split('&')		// 将字符串以 & 符号分割后存到数组中
    let paramsObj = {}
    // 将params 存到对象中
    paramsArr.forEach(params=>{
        if(/=/.test(params)){	// 处理有 value 的参数
            let [key,val] = params.split('=')	// 分割 key  和 val
            val = decodeURIComponent(val)	// 解码
            val = /^\d+$/.test(val)?parseFloat(val):val		// 判断是否转为数字

            if(paramsObj.hasOwnProperty(key)){	// 如果对象有key,则添加一个值
                paramsObj[key] = [].concat(paramsObj[key],val)
            }else{	// 如果对象没有这个 key,创建 key 并设置值
                paramsObj[key] = val
            }
        }else { // 处理没有 value 的 参数
            paramsObj[param] = true
        }
    })
    return paramsObj
}


// 使用

let url = 'http://www.domain.com/?user=anonymous&id=123&id=456&city=%E5%8C%97%E4%BA%AC&enabled';
parseParam(url)     // {user:'anonymous',id:[123,456],city:'北京',enabled:true}


# 模板引擎的实现


function render(template,data){
    const reg = /\{\{(\w+)\}\}/;        // 模板字符串正则
    if(reg.test(template)){ // 判断模板里是否有模板字符串
        const name = reg.exec(template)[1]  // 查找当前模板里第一个模板字符串的字段
        template = template.replace(reg,data[name]) // 将第一个模板字符串渲染
        return render(template,data);   // 递归的渲染并返回渲染后的结构
    }
    return template     // 如果模板没有模板字符传直接返回
}


// 使用

let template = '我是{{name}},年龄{{age}},性别{{sex}}'
let data = {name:"姓名",age:18}

render(template,data)       // 我是姓名,年龄18,性别undefined

# 转化为驼峰命名

function f(s){
    return s.replace(/-\w/g,function(x){
        return x.slice(1).toUpperCase()
    })
}

// 使用
f('get-element-by-id)   // getElementById

# 查找字符串中出现最多的字符和个数

例: abbcccddddd -> 字符最多的是 d,出现了5次


    let str = 'abcabcabcbbccccc'
    let num =0
    let char = ''

    // 使其按照一定的次序排列
    str = str.split('').sort().join('')
    // aaabbbbbcccccccc

    // 定义正则表达式
    let re = /(\w)\1+/g
    str.replace(re,($0,$1)=>{
        if(num < $0.length){
            num = $0.length
            char = $1
        }
    })

    console.log(`字符最多的是${char},出现了${num}`)

# 字符串查找

请使用最基本的遍历来实现判断字符串a 是否被包含在字符串 b中,并返回第一次出现的位置(找不到返回-1)


function isContain(a,b){
    for(let i in b){
        if(a[0]===b[i]){
            let tmp = true
            for(let j in a){
                if(a[j]!==b[~~i + ~~j]){
                    tmp = false
                }
            }
            if(tmp){
                return i
            }
        }
    }
    return -1
}

a='34';b='1234567'; // 返回 2
a='35';b='1234567'; // 返回 -1
a='355';b='12354355'; // 返回 5
isContain(a,b);

# 实现千位分隔符


function parseToMoney(num){
    num = parseFloat(num.toFixed(3))
    let [integer,decimal] = String.prototype.split.call(num,'.')
    integer = integer.replace(/\d(?=\B(\d{3})+$)/g,'$&,')
    // integer = integer.replace(/\d(?=(\d{3})+$)/g,'$&,')
    return integer+'.'+(decimal?decimal:'')
}

// 保留三位小数
parseToMoney(1234.56); // return '1,234.56'
parseToMoney(123456789); // return '123,456,789'
parseToMoney(1087654.321); // return '1,087,654.321'

最后更新时间: 3/25/2023, 9:32:12 PM