标签:apply das nat one assign 标签 note tag ref
const obj1 = {
a:100,
b: {x:100,y:200}
}
const obj2 = {
a:100,
b: {x:100,y:200}
}
// 判断是否是对象、数组
function isObject(obj){
return typeof obj === "object" && obj !== null
}
function isEqual(obj1,obj2){
if(!isObject(obj1)||!isObject(obj2)){
// 值类型 (参加equal的一般不是函数)
return obj1 === obj2
}
if(obj1 === obj2){ // 同一对象
return true;
}
// 两个都是对象或数组,且不相等
// 1. 先取出obj1和obj2的keys,比较个数
const obj1Keys = Object.keys(obj1)
const obj2Keys = Object.keys(obj2)
if(obj1Keys.length !== obj2Keys.length){
return false
}
// 2. 以obj1为基准,和obj2依次地柜比较
for(let key in obj1){
// 比较当前key的value -- 递归
const res = isEqual(obj1[key],obj2[key])
if(!res){
return false
}
}
// 3. 全相等
return true
}
console.log(isEqual(obj1,obj2)) // true
pop | push | unshift | shift | |
---|---|---|---|---|
功能 | 删除最后一个 | 在最后加一个 | 在开头加一个 | 删除开头一个 |
返回值 | 最后一个数 | 数组长度 | 数组长度 | 开头的一个数 |
// 纯函数: 1. 不改变原数组(没有副作用); 2. 返回一个数组
const arr = [10,20,30,40]
// concat
const arr1=arr.concat([50,60,70])
// map
const arr2 = arr.map(num=>num*10)
//filter
const arr3 = arr.filter(num=>num>25)
// slice 类似一个深拷贝
const arr4 = arr.slice()
// 非纯函数
// push pop shift unshift
// forEach
// some every
// reduce
slice | splice | |
---|---|---|
}返回值 | ||
是否是纯函数 | 是 | 否 |
返回[10,NaN,NaN]
等同写法:
[10,20,30].map((num,index)=>parseInt(num,index))
// parseInt 按照index进制格式化num
const p1 = document.getElementById(‘p1‘)
const body = document.body
bindEvent(p1,‘click‘,e=>{
e.stopPropagation() // 注释掉这一行,可以体会到事件冒泡
alert(‘激活‘)
})
bindEvent(body,‘click‘,e=>{
alert(‘取消‘)
})
const list = document.getElementById(‘list‘)
// 创建一个文档片段,此时还没有插入到DOM结构中
const frag = document.createDocumentFragment()
for(let i=0; i<20; i++){
const li = document.createElement(‘li‘)
li.innerHTML = "item ${i}"
// 先插入文档片段中
frag.appendChild(li)
}
// 都完成之后,统一插入到 DOM结构中
list.appendChild(frag)
<script>
window.abc = function(data){
console.log(data)
}
</script>
// 把function abc作为回调函数传给后端
<script src="http://localhost:8002/jsonp.js?username=xxx&callback=abc"></script>
// 后端 jsonp.js 处理:
abc{
{name:‘jsonp666‘}
}
window.addEventListener(‘load‘,function(){
// 页面的全部资源加载完才会执行,包括图片、视频等
})
document.addEventListener(‘DOMContentLoaded‘,function(){
// DOM渲染完即可执行,此时图片、视频可能还没加载完
})
let a = 100;
function test(){
alert(a)
a = 10
alert(a)
}
String.prototype.trim = function(){
// 直接放到原型上有点暴力,其实应该先判断一下,原型上是否有,没有再整
// 通过正则解决兼容性问题
return this.replace(/^\s+/,‘‘).replace(/\s+$/,‘‘)
}
function max(){
const nums = Array.prototype.slice.call(arguments); // 变为数组
let max = 0;
nums.forEach(n=>{
if(n>max){
max = n
}
})
return max;
}
Math.max([1,2,3,4,5])
// 高风险的地方
try{
// todo
}catch(ex){
console.error(ex) // 手动捕获 catch
}finally{
// todo
}
// 自动捕获
window.onerror = function(message,source,lineNum,colNum,error){
//1. 对跨域的js,如 cdn,不会有详细的报错信息
// 2. 对于压缩的js,还要配合sourceMap反查到未压缩代码的行、列
function query(name){
const search = location.search.substr(1) // substr(1)是为了取消?,类似array.slice()
// search:‘a=10&b=20&c=30’
const reg = new RegExp(`(^|&)${name}=([^&]*)(&|$)`,‘i‘)
const res = search.match(reg)
if(res === null){
return null
}
retrun res[2]
}
function query(name){
cosnt search = location.search;
const p = new URLSearchParams(search);
return p.get(name)
}
// 方法1
function queryToObj(){
const res = {}
const search = location.search.substr(1)
search.split(‘&‘).forEach(paramStr=>{
const arr = paramStr.split(‘=‘)
cosnt key = arr[0]
const val = arr[1]
res[key] = val
})
return res;
}
// 方法2
function queryToObj(){
const res = { }
const pList = new URLSearchParams(location.search)
plist.forEach((val,key)=>{
res[key] = val
})
return res;
}
// arr = [1,[2,3,[4,5,[6.7],8],9]
function flat(arr){
// 验证arr中,是否有深层数组
const isDeep = arr.some(item=>item instanceof Array)
is(!isDeep){
return arr // 平的,直接返回
}
const res = Array.prototype.concat.apply([],arr)
return flat(res) // 递归
}
const res = flat(arr)
// 不考虑层级,可以用concat(只能拍平一层)
arr2 = [1,2,[3,4],5]
Array.prototype.concat.apply([],arr2)
Array.prototype.concat.call([],...arr2)
[].concat(...arr2)
function unique(arr){
const res = []
arr.forEach(item=>{
if(res.indexOf(item)<0){
res.push(item)
}
})
return res
}
function unique(arr){
const res = new Set(arr)
return [...res]
}
注意:Object.assign 不是深拷贝,且有副作用
let curWidth = 100;
const maxWidth = 640;
function animate(){
curWidth = curWidth + 3;
$div1.css(‘width‘,curWidth)
if(curWidth < maxWidth){
window.requestAnimationFrame(animate)
}
}
animate()
标签:apply das nat one assign 标签 note tag ref
原文地址:https://www.cnblogs.com/keepLeung/p/14490445.html