去重 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 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 24 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 52 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 20 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 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 11 12 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 34 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 24 25 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() //获取当前毫秒数 1531824326654new Date().getTime()//获取毫秒数
1 2 3 4 5 6 7 8 9 10 11 12 13 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 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 30 31 32 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 13 14 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 37 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 2 3 4 <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 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); }); }); };
日期 根据时间获取是第几个周
1 2 3 4 5 6 7 8 9 10 function getWeekNumber (t ) { let date = t ? new Date (`${t} ` ) : new Date (); const yearStart = new Date (date.getFullYear(), 0 , 1 ); const diffDays = Math .floor((date - yearStart) / (24 * 60 * 60 * 1000 )); const weekNumber = Math .ceil((diffDays + yearStart.getDay() + 1 ) / 7 ); return weekNumber; }