去重 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Array .prototype.unique = function ( ) { var res = []; var json = {}; for (var i = 0 ; i < this .length; i++){ if (!json[this [i]]){ res.push(this [i]); json[this [i]] = 1 ; } } return res; } var arr = [112 ,112 ,34 ,'你好' ,112 ,112 ,34 ,'你好' ,'str' ,'str1' ];console .log(arr.unique()) let uniqueArr=arr.filter((item,index,arr )=> arr.indexOf(item)==index)console .log(uniqueArr) let a =[...new Set (arr)]console .log(a)
防抖与节流 JS的防抖与节流
防抖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 function debounce (fn, wait ) { var timeout = null ; return function ( ) { if (timeout !== null ) { clearTimeout (timeout) } timeout = setTimeout (fn, wait) } } function handle ( ) { console .log(Math .random()); } window .addEventListener('scroll' , debounce(handle, 1000 ));
节流
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 var throttle = function (func, delay ) { var timer = null ; var startTime = Date .now(); return function ( ) { var curTime = Date .now(); var remaining = delay - (curTime - startTime); var context = this ; var args = arguments ; clearTimeout (timer); if (remaining <= 0 ) { func.apply(context, args); startTime = Date .now(); } else { timer = setTimeout (func, remaining); } } } function handle ( ) { console .log(Math .random()); } window .addEventListener('scroll' , throttle(handle, 3000 ));
多级数组变一级(扁平) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 var arr=[1 ,2 ,3 ,4 ,['a' ,55 ,[111 ,{"name" :'bbb' }]]] var empty=[] function flat (arr ) { arr.forEach(item => { if (typeof item==='string' || typeof item==='number' ){ empty.push(item) }else if (Array .isArray(item)){ flat(item) }else { empty.push(item) } }) return empty } console .log(flat(arr))
千分符 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 var str="3562123761" ;function test (str ) { var iNum=str.length%3 ; var prev="" ; var arr=[]; var iNow=0 ; var tmp='' ; if (iNum !=0 ){ prev =str.substring(0 ,iNum); arr.push(prev) } str =str.substring(iNum); for (var i=0 ;i<str.length;i++){ iNow++; tmp+=str[i]; if (iNow==3 &&tmp){ arr.push(tmp) tmp='' ; iNow=0 ; } } return arr.join(',' ); } console .log(test(str));var str1='abacad' ;var re=/a(?=b)/g str1=str1.replace(re,"*" ); console .log(str1);var re2=/a(?!b)/g var str2=str1.replace(re2,"*" )console .log(str2);function test2 (str ) { var re=/(?=(?!\b)(\d{3})+$)/g ; return str.replace(re,',' ) } console .log(test2(str));
驼峰命名法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 var str="border-bottom-color" ;function test (str ) { var arr=str.split("-" ); for (var i=1 ;i<arr.length;i++){ arr[i]=arr[i].charAt(0 ).toUpperCase()+arr[i].substring(1 ); } return arr.join('' ) } console .log(test(str));function test2 (str ) { var re=/-(\w)/g ; return str.replace(re,function ($0 ,$1 ) { return $1. toUpperCase() }) } console .log(test2(str));
排序 Javascript常见排序算法的笔记
从小到大排序
冒泡排序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 var arr = [15 , 55 , 99 , 77 , 8 , 0 , 2 ]let time = 0 ;function bubbleSort (arr ) { var len = arr.length for (var i = 0 ; i < len; i++) { for (var j = 0 ; j < len - 1 - i; j++) { time++ if (arr[j] > arr[j + 1 ]) { var temp temp = arr[j]; arr[j] = arr[j + 1 ] arr[j + 1 ] = temp } } } return arr } console .log(time) console .log(bubbleSort(arr))
二分法排序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 const Arr = [85 , 24 , 63 , 45 , 17 , 31 , 96 , 50 ];function quickSort (arr ) { if (arr.length <= 1 ) { return arr; } let pivotIndex = Math .floor(arr.length / 2 ); let pivot = arr.splice(pivotIndex, 1 )[0 ]; let left = []; let right = []; for (let i = 0 ; i < arr.length; i++) { if (arr[i] < pivot) { left.push(arr[i]); } else { right.push(arr[i]); } } return quickSort(left).concat([pivot], quickSort(right)); } console .log(quickSort(Arr));
添加class 1 2 3 4 5 6 7 8 9 10 function addClass (el, className ) { let reg = new RegExp ('(^|\\s)' + className + '(\\s|$)' ) if (reg.test(el.className)) { return } let newClass = el.className.split(' ' ) newClass.push(className) el.className = newClass.join(' ' ) }
设置data节点属性 1 2 3 4 5 6 7 function getData (el, name, val ) { const prefix = 'data-' if (val) { return el.setAttribute(prefix + name, val) } return el.getAttribute(prefix + name) }
浏览器css前缀的兼容 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 function prefixStyle (style ) { let elementStyle = document .createElement('div' ).style let vendor = (() => { let transformNames = { webkit : 'webkitTransform' , Moz : 'MozTransform' , O : 'OTransform' , ms : 'msTransform' , standard : 'transform' } for (let key in transformNames) { if (elementStyle[transformNames[key]] !== undefined ) { return key } } return false })() if (vendor === false ) { return false } if (vendor === 'standard' ) { return style } return vendor + style.charAt(0 ).toUpperCase() + style.substr(1 ) } alert(prefixStyle('transform' ))
获取DOM大小和位置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 function getRect (el ) { if (el instanceof window .SVGElement) { let rect = el.getBoundingClientRect() return { top : rect.top, left : rect.left, width : rect.width, height : rect.height } } else { return { top : el.offsetTop, left : el.offsetLeft, width : el.offsetWidth, height : el.offsetHeight } } }
对象 hasOwnProperty 对象本身的属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 function Foo (name ) { this .name=name } Foo.prototype.alertName=function ( ) { alert(this .name) } var f = new Foo('小明' )f.printName=function ( ) { console .log(this .name) } f.printName() f.alertName() f.toString() var item for (item in f){ if (f.hasOwnProperty(item)){ console .log(item) } }
原型链
instanceof 用于判断引用类型
属于哪个构造函数
的方法
f的__proto__一层一层往上,能否找打对应到Foo.prototype
再试判断f instanceof Object
instanceof 变量 属于 数组
1 2 3 var arr=[]arr instanceof Array typeof arr
例子 DOM操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 function Elem (id ) { this .elem = document .getElementById(id) } Elem.prototype.html = function (val ) { var elem = this .elem if (val) { elem.innerHTML = val return this } else { return elem.innerHTML } } Elem.prototype.on = function (type,fn ) { var elem=this .elem elem.addEventListener(type,fn) return this } let div1 = new Elem('div1' ) div1.html("<p>hello world</p>" ).on('click' ,function ( ) { alert('clicked' ) })
深层拷贝 1 2 3 4 5 6 7 function deepClone (obj ) { var newObj=obj instanceof Array ? []:{} for (var key in obj){ newObj[key]= typeof obj[key]==='object' ? deepClone(obj[key]):obj[key] } return newObj }
日期 Date.now()
//获取当前毫秒数1531824326654 new Date().getTime()
//获取毫秒数
1 2 3 4 5 6 7 8 9 10 11 function getTime ( ) { var dt=new Date () var year=dt.getFullYear() var month=dt.getMonth()+1 var date=dt.getDate() var hour=dt.getHours() var minute=dt.getMinutes() var second=dt.getSeconds() return year+'-' +month+'-' +date+' ' +hour+':' +minute+':' +second } getTime()
递归 阶乘 1 2 3 4 5 6 7 8 9 10 11 12 13 14 function factorial (n,p=1 ) { if (n<=1 ){ return 1 *p }else { let result =n*p return factorial(n-1 ,result) } } factorial(3 )
##菲波那契
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 function fibo (n ) { if (n >= 2 ) { return fibo(n - 1 ) + fibo(n - 2 ) } else { return n; } } fibo(3 ) var series = function (n ) { var sum = [0 , 1 ]; if (n < 2 ) { return sum[n]; } var firstNum = 0 ; var secondNum = 1 ; var total = 0 ; for (var i = 2 ; i<= n; i++) { total = firstNum + secondNum; firstNum = secondNum; secondNum = total; } return total; }
浏览器内置对象 navigator navigator.userAgent 浏览器代理器名称
location 例子 location.href=’跳转的地址’https://www.baidu.com/index.html?id=99&a=b#mid=100
location 值
location.protocol https:
location.pathname /index.html
location.search ?id=99&a=b
location.hash #mid=100
事件 event. stopPropagatio()是阻止冒泡事件的方法, 在ie浏览器上没有stopPropagatio()这个方法, 在ie上要用e.cancelBubble=true阻止冒泡事件
1 2 3 4 5 6 7 8 9 function stopPropagation (event ) { var e=window .event||event; if (document .all){ e.cancelBubble=true ; }else { e.stopPropagation(); e.preventDefault() }; }
事件委托代理 1 2 3 4 5 6 7 8 9 10 <div id ="div1" > <a href ="" > 这是a标签</a > </div > <script > let div1=document .getElementById('div1' )div1.addEventListener('click' ,function (e ) { let target=e.target if (target.nodeName==='A' ){ alert(target.innerHTML) } }) </script >
完善封装代理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 function bindEvent (elem,type,selector,fn ) { if (fn==null ){ fn=selector selector=null } elem.addEventListener(type,function (e ) { var target if (selector ){ target=e.target console .log(target) if (target.matches(selector)){ fn.call(target,e) } }else { fn(e) } }) } var div1=document .getElementById('div1' )bindEvent(div1,'click' ,'a' ,function (e ) { console .log(this .innerHTML) })
ajax 1 2 3 4 5 6 7 8 9 10 11 12 var xhr =new XMLHttpRequest()xhr.open('GET' ,'/api' ,false ) xhr.onreadystatechange=function ( ) { if (xhr.readyState=4 ){ if (xhr.status==200 ){ alert(xhr.responseText) } } } xhr.send(null )
AMD 异步模块定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 define(function ( ) { var util={ getFormatData :function (date,type ) { if (type===1 ){ return '2018-06-20' }if (type===2 ){ return '2018年6月20日' } } } return util }) define(['./util.js' ],function (util ) { var aUtil={ aGetFormatDate :function (date ) { return util.getFormatData(date,2 ) } } return aUtil }) define(['./a-util.js' ],function (util ) { var a={ printDate :function (date ) { console .log(util.aGetFormatDate(date)) } } return a }) require (['./a.js' ],function (a ) { var date=new Date () a.printDate(date) })
使用 data-main
1 <script src ="https://cdn.bootcss.com/require.js/2.3.4/require.min.js" data-main ='./main.js' > </script >
运动 运动的tool
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 function getStyle (ele, attr ) //获取样式 { if (ele.currentStyle) { return ele.currentStyle[attr]; } else { return getComputedStyle(ele, false )[attr]; } } function startMove (ele, obj, fn ) { clearInterval (ele.timer); ele.timer=setInterval (function ( ) { var bStop=true ; for (var attr in obj) { var iCur=0 ; if (attr=='opacity' ) { iCur=parseInt (parseFloat (getStyle(ele, attr))*100 ); } else { iCur=parseInt (getStyle(ele, attr)); } var iSpeed=(obj[attr]-iCur)/8 ; iSpeed=iSpeed>0 ?Math .ceil(iSpeed):Math .floor(iSpeed); if (iCur!=obj[attr]) { bStop=false ; } if (attr=='opacity' ) { ele.style.filter='alpha(opacity:' +(iCur+iSpeed)+')' ; ele.style.opacity=(iCur+iSpeed)/100 ; } else { ele.style[attr]=iCur+iSpeed+'px' ; } } if (bStop) { clearInterval (ele.timer); if (fn) { fn(); } } }, 30 ) }
vue 中ajax 直接返回data数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 const axios = require ('axios' )module .exports = function ajax (url = '' , data = {}, type = 'GET' ) { return new Promise (function (resolve, reject ) { let promise if (type === 'GET' ) { let dataStr = '' Object .keys(data).forEach(key => { dataStr += key + '=' + data[key] + '&' }) if (dataStr !== '' ) { dataStr = dataStr.substr(0 , dataStr.lastIndexOf('&' )) url = url + '?' + dataStr } promise = axios.get(url) } else { promise = axios.post(url, data) } promise.then(response => { resolve(response.data) }) .catch(error => { reject(error) }) }) }