Base64加密
function Base64(input) {
const _keyStr =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var output = "";
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
var i = 0;
input = _utf8_encode(input);
while (i < input.length) {
chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
} else if (isNaN(chr3)) {
enc4 = 64;
}
output =
output +
_keyStr.charAt(enc1) +
_keyStr.charAt(enc2) +
_keyStr.charAt(enc3) +
_keyStr.charAt(enc4);
}
return output;
}
utf8转换
function _utf8_encode(string) {
string = string.replace(/\r\n/g, "\n");
var utftext = "";
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
utftext += String.fromCharCode(c);
} else if (c > 127 && c < 2048) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
} else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
}
字符串转hashCode
function hashCode(str) {
let hash = 0;
if (str.length === 0) return hash;
for (let i = 0; i < str.length; i++) {
let char = str.charCodeAt(i);
hash = (hash << 5) - hash + char;
hash = hash & hash; // Convert to 32bit integer
}
return hash;
}
世界世界转年/月/日
function timeTransform(time) {
if (time) {
let timeA = new Date(time)
.toLocaleString("chinese", { hour12: false })
.split(" ");
return timeA[0];
} else {
return "";
}
}
逢三加逗号(处理金额)
function NumFormat(value) {
if (!parseInt(value, 10)) return "0.00";
//var intPart = Number(value).toFixed(0); //获取整数部分
var intPart = parseInt(value, 10);
var intPartFormat = intPart.toString().replace(/(\d)(?=(?:\d{3})+$)/g, "$1,"); //将整数部分逢三���断
var floatPart = ".00"; //预定义小数部分
var value2Array = value.split(".");
if (value2Array.length === 2) {
floatPart = value2Array[1].toString(); //拿到小数部分
if (floatPart.length === 1) {
//补0,实际上用不着
return intPartFormat + "." + floatPart + "0";
} else {
return intPartFormat + "." + floatPart;
}
} else {
return intPartFormat + floatPart;
}
}
解决toFixed不兼容问题
function toFixeds(value,n) {
if (n > 20 || n < 0) {
throw new RangeError('toFixed() digits argument must be between 0 and 20');
}
const number = value;
if (isNaN(number) || number >= Math.pow(10, 21)) {
return number;
}
if (typeof (n) === 'undefined' || n === 0) {
return (Math.round(number)).toString();
}
let result = number.toString();
const arr = result.split('.');
// 整数的情况
if (arr.length < 2) {
result += '.';
for (let i = 0; i < n; i += 1) {
result += '0';
}
return result;
}
const integer = arr[0];
const decimal = arr[1];
if (decimal.length === n) {
return result;
}
if (decimal.length < n) {
for (let i = 0; i < n - decimal.length; i += 1) {
result += '0';
}
return result;
}
result = integer + '.' + decimal.substr(0, n);
const last = decimal.substr(n, 1);
// 四舍五入,转换为整数再处理,避免浮点数精度的损失
if (parseInt(last, 10) >= 5) {
const x = Math.pow(10, n);
result = (Math.round((parseFloat(result) * x)) + 1) / x;
result = result.toFixed(n);
}
return result;
};
节流
throttle(fn, ms) {
let canRun = true; // 通过闭包保存一个标记
return function () {
if (!canRun) return; // 在函数开头判断标记是否为true,不为true则return
canRun = false; // 立即设置为false
setTimeout(() => { // 将外部传入的函数的执行放在setTimeout中
fn.apply(this, arguments);
/* 最后在setTimeout执行完毕后再把标记设置为true(关键)表示可以执行下一次循环了。
当定时器没有执行的时候标记永远是false在开头被return掉 */
canRun = true;
}, ms);
};
}
防抖
function debounce(fn, ms) {
let timeoutId
return function () {
clearTimeout(timeoutId)
timeoutId = setTimeout(() => {
fn.apply(this, arguments)
}, ms)
}
}
判断是否是微信,qq 或 uc
const checkWeixinQqUc = () => {
const u = navigator.userAgent;
const obj = {
weixin: u.indexOf("MicroMessenger") > -1, //是否微信
qq: u.match(/QQ/i) == "qq"&&!u.indexOf('MQQBrowser') > -1, //是否QQ
uc: u.indexOf('UCBrowser') > -1
}
return Object.keys(obj)[Object.values(obj).indexOf(true)]
};
检查是否是 IphoneX
/**
* 检查是否是 IphoneX
*/
export const checkIsIphoneX = () => {
const u = navigator.userAgent;
const isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
if (isIOS && screen.height >= 812) {
return true;
}
};
格式化文件单位
/**
* 格式化文件单位
* @param {String || Number} size 文件大小(kb)
*/
export const fileFormatSize = size => {
var i
var unit = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']
for (i = 0; i < unit.length && size >= 1024; i++) {
size /= 1024
}
return (Math.round(size * 100) / 100 || 0) + unit[i]
}
对象深克隆
/**
* 对象深度克隆,
* JSON.stringify深度克隆对象
* 无法对函数 、RegExp等特殊对象的克隆,
* 会抛弃对象的constructor,所有的构造函数会指向Object
* 对象有循环引用,会报错
* @param {Object} obj 克隆的对象
*/
export const objDeepClone = obj => {
return clone(obj)
}
const isType = (obj, type) => {
if (typeof obj !== 'object') return false;
// 判断数据类型的经典方法:
const typeString = Object.prototype.toString.call(obj);
let flag;
switch (type) {
case 'Array':
flag = typeString === '[object Array]';
break;
case 'Date':
flag = typeString === '[object Date]';
break;
case 'RegExp':
flag = typeString === '[object RegExp]';
break;
default:
flag = false;
}
return flag;
};
/**
* deep clone
* @param {[type]} parent object 需要进行克隆的对象
* @return {[type]} 深克隆后的对象
*/
const clone = parent => {
// 维护两个储存循环引用的数组
const parents = []
const children = []
const _clone = parent => {
if (parent === null) return null
if (typeof parent !== 'object') return parent
let child, proto
if (isType(parent, 'Array')) {
// 对数组做特殊处理
child = []
} else if (isType(parent, 'RegExp')) {
// 对正则对象做特殊处理
child = new RegExp(parent.source, getRegExp(parent))
if (parent.lastIndex) child.lastIndex = parent.lastIndex
} else if (isType(parent, 'Date')) {
// 对Date对象做特殊处理
child = new Date(parent.getTime())
} else {
// 处理对象原型
proto = Object.getPrototypeOf(parent)
// 利用Object.create切断原型链
child = Object.create(proto)
}
// 处理循环引用
const index = parents.indexOf(parent)
if (index !== -1) {
// 如果父数组存在本对象,说明之前已经被引用过,直接返回此对象
return children[index]
}
parents.push(parent)
children.push(child)
for (const i in parent) {
// 递归
child[i] = _clone(parent[i])
}
return child
}
return _clone(parent)
}
全部字母大写开头
export const strToCapitalLetter = (str) => {
const strOne = str.toLowerCase()
return strOne.charAt(0).toUpperCase() + strOne.slice(1)
}