jsperf
jsfiddle
JSBench
JavaScript
代码片段的执行速度。 通过简单而简短的 URL
与他人在线共享和协作。测试条件 | Chrome版本94.0.4606.81 | Firefox版本93.0 (64 位) |
---|---|---|
Object.assign对象合并 | 14.07080078125 ms | 12.11 ms |
展开运算符对象合并 | 18201.126953125 ms | 7424.69 ms |
展开运算符数组加单个 | 42.848876953125 ms | 877.14 ms |
push方法数组加单个 | 0.489013671875 ms | 0.89 ms |
concat方法数组加单个 | 0.6640625 ms | 2.40 ms |
展开运算符两个大数组合并 | 38.1337890625 ms | 43.64 ms |
concat方法两个大数组合并 | 4.3740234375 ms | 31.28 ms |
在循环比较多或者操作的数组长度比较大的情况下:
Object.assign
多数情况下性能比 展开运算符(...)
的性能高connat、push
性能比 展开运算符(...)
的性能高在 Chrome版本94.0.4606.81
、 Firefox版本93.0 (64 位)
的浏览器下
Object.assign、connat
的性能会比 展开运算符“...”
的性能高Object.assign
会触发 Proxy/Object.definedProperty
的 set
方法,展开运算符“...”
不会触发Object.assign
和 展开运算符
都是浅拷贝展开运算符放在前面的性能比放在后面的性能高
function (a, ...b) {}
)的时候,有自己的使用方式展开运算符“...”
比 Object.assign
性能高getBoundingClientRect 返回的是一个 DOMRect 对象,是一组矩形集合,我们这次所使用的返回值主要是left、top、bottom和right。其余的返回值width、height、x、y这次用不到,就不再讨论。
使用方法如下:
let domToTop = dom.getBoundingClientRect().top // dom 的顶边到视口顶部的距离
let domToLeft = dom.getBoundingClientRect().left // dom 的左边到视口左边的距离
let domToBottom = dom.getBoundingClientRect().bottom // dom 的底边到视口顶部的距离
let domToRight = dom.getBoundingClientRect().right // dom 的右边到视口左边的距离
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box {
width: 110%;
height: 200%;
position: absolute;
top: 0;
left: 0;
border: 1px solid red;
}
.content {
width: 20%;
想要的效果
输入: let str ="<div><span>tests</span></div>"
输出 : {
tag: 'div',
children: [
{
tag: 'span'
},
],
}
实现
// 设置每个节点标签属性
// let attrRE = /\s([^'"/\s><]+?)[\s/>]|([^\s=]+)=\s?(".*?"|'.*?')/g;
function parseTag(tag) {
let res = {
type: "tag",
name: "",
voidElement: false,
attrs: {},
children: [],
};
let tagMatch = tag.match(/<\/?([^\s]+?)[/\s>]/);
if (tagMatch) {
// 标签名称为正则匹配的第2项
res.name = tagMatch[1];
if (tag.charAt(tag.length - 2) === "/") {
// 判断tag字符串倒数第二项是不是 / 设置为空标签。 例子:<img/>
res.voidElement = true;
}
}
// 匹配所有的标签正则
let classList = tag.match(/\s([^'"/\s><]+?)\s*?=\s*?(".*?"|'.*?')/g);
if (classList && classList.length) {
for (let i = 0; i < classList.length; i++) {
// 去空格再以= 分隔字符串 得到['属性名称','属性值']
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
function promiseForEach(arr, cb) {
let realResult = []
let result = Promise.resolve()
arr.forEach((a, index) => {
result = result.then(() => {
if (typeof cb === "function") {
return cb(a).then((res) => {
realResult.push(res)
})
}
})
})
return result.then(() => {
return realResult
})
}
promiseForEach(arr, (ele) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(ele)
return resolve(ele)
}, Math.random() * 1000)
})
}).then((data) => {
console.log("成功")
console.log(data)
}).catch((err) => {
console.log("失败")
console.log(err)
})
/**
* 复制文本
* @param text
*/
export function copyText(text) {
const input = document.createElement("input")
input.value = text
document.body.appendChild(input)
input.select()
document.execCommand("Copy")
window.setTimeout(function () {
document.body.removeChild(input)
}, 0)
}
/**
* esc监听全屏
*/
export const listenfullscreen = (callback) => {
function listen() {
callback()
}
document.addEventListener("fullscreenchange", function () {
listen()
})
document.addEventListener("mozfullscreenchange", function () {
listen()
})
document.addEventListener("webkitfullscreenchange", function () {
listen()
})
document.addEventListener("msfullscreenchange", function () {
listen()
})
}
/**
* 浏览器判断是否全屏
*/
export const fullscreenEnable = () => {
return document.isFullScreen || document.mozIsFullScreen || document.webkitIsFullScreen
}
/**
* 浏览器全屏
*/
export const re
Number.prototype.toFixed = function (n) {
if (n != undefined && (isNaN(n) || Number(n) > 17 || Number(n) < 0)) {
throw new Error("输入正确的精度范围");
}
// 拆分小数点整数和小数
var num = this;
var f = '';
if (Number(num) < 0) {
num = -Number(num);
f = '-';
}
var numList = num.toString().split(".");
// 整数
var iN = numList[0];
// 小数
var dN = numList[1];
n = parseInt(n);
if (isNaN(n) || Number(n) === 0) {
// 0或者不填的时候,按0来处理
if(dN === undefined){
return num + '';
}
var idN = Number(dN.toString().substr(0, 1));
if (idN >= 5) {
if (Number(iN) < 0) {
iN = Number(iN) - 1
} else {
iN = Number(iN) + 1
}
}
return iN + '';
} else {
var dNL = dN === undefined ? 0 : dN.length;
if (dNL < n) {
// 如果小数位不够的话,那就补全
var oldN = num.toString().ind