强制:parseInt parseFloat toString
隐式:if、逻辑运算、==、+拼接字符串css
手写深度比较isEqualnode
//判断是不是对象或者是数组 function isObject(obj){ return typeof obj === 'object' && obj !== null } function isEqual(obj1,obj2){ if(!isObject(obj1) || !isObject(obj2)){ //值类型 return obj1 === obj2 } if(obj1 === obj2){ return true } //两个都是数组或者对象 //一、先取出obj1和obj2的keys,比较个数 const obj1Keys = Object.keys(obj1) const obj2Keys = Object.keys(obj2) if(obj1Keys.length !== obj2Keys.length){ return false } //二、以obj1为基准,和obj2递归依次比较 for(let key in obj1){ //比较当前key的value值 const res = isEqual(obj1[key],obj2[key]) if(!res){ return false } } return true } const obj1 = { a:100, b:{ x:100, y:200 } } const obj2 = { a:100, b:{ x:100, y:200 } }
split()和join()的区别ajax
'1-2-3'.split('-') //[1,2,3] [1,2,3].join('-') //'1-2-3'
const arr = [10,20,30,40] const popRes = arr.pop() console.log(popRes) //40 console.log(arr) //[10,20,30]
const arr = [10,20,30,40] const pushRes = arr.push(50) console.log(pushRes) // 5 console.log(arr) //[10,20,30,40,50]
const arr = [10,20,30,40] const unshiftRes = arr.unshift(5) console.log(unshiftRes) // 5 console.log(arr) //[5,10,20,30,40]
const arr = [10,20,30,40] const shiftRes = arr.shift(5) console.log(shiftRes) // 10 console.log(arr) //[20,30,40]
一、不改变原数组(没有反作用)
二、返回的是一个数组
const arr = [10,20,30,40] const arr1 = arr.concat([50,60,70]) console.log(arr) //[10,20,30,40] console.log(arr1) //[10,20,30,40,50,60,70]
const arr = [10,20,30,40] const arr2 = arr.map(num=>num*10) console.log(arr) //[10,20,30,40] console.log(arr2) //[100,200,300,400]
const arr = [10,20,30,40] const arr3 = arr.filter(num=>num>25) console.log(arr) //[10,20,30,40] console.log(arr3) //[30,40]
const arr = [10,20,30,40] const arr4 = arr.slice() console.log(arr) //[10,20,30,40] console.log(arr4) //[10,20,30,40]
const arr = [10,20,30,40,50] const arr1 = arr.slice(1,4) //第一个参数为从第几个位置开始,第二个参数为到第几个位置前结束 const arr2 = arr.slice(2) const arr3 = arr.slice(-2) //截取最后两位 console.log(arr1) //[20,30,40] console.log(arr2) //[30,40,50] console.log(arr3) //[40,50]
const arr = [10,20,30,40,50] const spliceRes = arr.splice(1,2,'a','b','c')//参数含义:把第一个参数到第二个参数位置剪切下来,把后面的参数放在剪切区域内 console.log(arr) //[10,'a','b','c',40,50] console.log(spliceRes) //[20,30]
const res = [10,20,30].map(parseInt) console.log(res) //[10,NaN,NaN] //拆解 [10,20,30].map((num,index) = >{ return parseInt(num,index) })
apply()方法 接收两个参数,一个是函数运行的做用域(this),另外一个是参数数组。
call()方法 第一个参数和apply()方法的同样,可是传递给函数的参数必须列举出来。
event.stopPropagation()
event.preventDefault()正则表达式
const div1 = document.getElementById("div1") //添加新节点 const newP = document.createElement('p') newP.innerHTML = "this is p1" div1.appendChild(newP)//添加新建立的元素 //移动已有节点,注意是移动 const p2 = document.getElementById('p2') div1.appendChild(p2) //获取子元素列表 const div1 = document.getElementById("div1") const div1ChildNodes = div1.childNodes console.log(div1.childNodes)//打印出两种标签,一种是p标签,一种是text标签,由于p标签里面含有文本,text的nodeType为3,p的nodeType为1,因此经过转化为数组过滤。 const div1ChildNodesP = Array.prototype.slice.call(div1.childNodes).filter(child=>{ if(child.nodeType == 1){ return true } return false }) //删除子节点 div1.removeChild(div1ChildNodesP[0]) //获取父元素 const div1 = document.getElementById("div1") const parent = div1.parentNode
函数声明function fn(){}
函数表达式const fn = function(){}json
{}等同于new Object(),原型链Object.prototype
Object.create(null)没有原型
Object.create({})能够指定原型数组
const res = /^[a-zA-Z]\w{5,29}$/
const res = /\d{6}/
String.prototype.trim = function(){ return this.replace(/^\s+/,'').replace(/\s+$/,'') }
//第一种获取最大值 Math.max(10,20,30,40) //40 //第二种获取最大值 function max(){ const nums = Array.prototype.slice.call(arguments)//变为数组 let max = nums.length ? nums[0] : null nums.forEach(n=>{ if(n>max) { max = n } }) return max } //获取最小值 Math.min(10,20,30,40) //10
//第一种手动捕获异常 try{ }.catch(ex){ console.error(ex) //手动捕获异常 }.finally{ } //第二种自动捕获异常 window.onerror = function(message,source,lineNum,colNum,error){ console.log(message,source,lineNum,colNum,error) }
json是一种数据格式,本质是一串字符串
json格式和js对象结构一致,对js语言更友好
window.json是一个全局对象:JSON.stringify JSON.parse
location.search
URLSearchParams浏览器
//传统方式 functoin query1(name){ const search = location.search.substr(1)//去掉前面的‘?’ const reg = new RegExp(`(^|&)${name}=([^&]*)(&|$)`,'i') const res = search.match(reg) if(res == null){ return null } return res[2] } //URLSearchParams funcrion query2(name){ const search = location.search const p = new URLSearchParams(search) return p.get(name) } //将url参数解析为json对象 function queryToObj(){ const res = {} const search = location.search.substr(1) search.split('&').forEach(paramsStr=>{ const arr = paramsStr.split('=') const key = arr[0] const val = arr[1] res[key] = val }) return res }
function flat(arr){ const isDeep = arr.some(item=>item instanceof Array) if(!isDeep){ return arr } const res = Array.prototype.concat.apply([],arr) return flat(res) }
//第一种 function unique(arr){ const res = [] arr.forEach(item=>{ if(res.indexOf(item)<0){ res.push(item) } }) return res } //第二种 function unique(arr){ const set = new Set(arr) return [...set] }
Object.assign为浅拷贝缓存
function deepClone(obj = {}) { if (typeof obj !== 'object' || obj == null) { // obj 是 null ,或者不是对象和数组,直接返回 return obj } // 初始化返回结果 let result if (obj instanceof Array) { result = [] } else { result = {} } for (let key in obj) { // 保证 key 不是原型的属性 if (obj.hasOwnProperty(key)) { // 递归调用!!! result[key] = deepClone(obj[key]) } } // 返回结果 return result }
更新频率要60帧/s,即16.67ms跟新一次视图
//设置一个div宽度为100px,3s后变为640px,即增长540px //60帧/s 3s->180帧 每次变化3px const $div1 = $("#div1") let curWidth=100 let maxWidth=640 //第一种 function animate(){ curWidth =+ curWidth $div1.css('width',curWidth) if(curWidth<naxWidth){ setTimeout(animate,16.7) } } //第二种 function animate(){ curWidth =+ curWidth $div1.css('width',curWidth) if(curWidth<naxWidth){ requestAnimationFrame(animate) } } animate()