js Array数组展平 多维数组数据展平:let arr = [1,[3,2,[4]]]let arr = [1,[3,2,[4]]] let flatten = (arr)=>{ // '1,3,2,4' => ['1','3','2','4'] => [1,3,2,4] return (arr + '').split(',').map(str=>parseInt(str)) } let flatten
js js事件循环机制Event Loops 关键名词主执行栈:会一直执行同步任务到结束,异步任务会通过任务队列Event Queue机制来进行协调异步任务又分为微任务micro task和宏任务macro task总结:任务优先级:先执行同步任务 > 微任务 > 宏任务微任务:browser环境(Promise.then catch finally、MutationObserver)、node环境(Promise.then catch finally、process.nextTick)宏任务:browser环境(setTimeout、setInterver、requestAnimationFrame)、node环境(setImmediate)注意:new Promise(resolve=>{ console.log('我是同步的') })
es6 ES6 let&const js只存在全局作用域和函数作用域。var声明变量存在的三个问题 可以重复声明:var a=1; var a=2; //不会报错没有块级作用域:if(true){ var a=10; } console.log(a); //输出a=10不可以定义常量:var PI=3.14; PI=3.15; //赋值成功,不会报错
js insertBefore、insertAfter insertBefore:在已有元素前插入一个新元素 新元素:插入的元素(newElement)目标元素:新元素插入到哪个元素(targetElement)之前父元素:目标元素的父元素调用语法:targetElement.parentNode.insertBefore(newElement, targetElement) insertAfter实现:在现有元素后插入一个新元素 function insertAfter(newElement, targetElement){ var parentElement = targetElement.parentNode; // 获取父元素 // 判断targetElement是否为父元素最后一个子元素 if(parentElement.lastChild === targetElement){ // 父元素直接插入新元素 parentElement.appendChild(newElement); }else{ // 往目标元素的下一个兄弟元素前面插入新元素 parentElement.insertBefore(newElement, targetElement.nextSibling); } }
js window.onload优化 当一个页面挂载多个onload事件时,只有最后一个会执行。 // 挂载window.onload函数 function addLoadEvent(fun){ var oldLoadFun = window.onload; //缓存onload函数 if(typeof window.onload === 'function'){ // 存在onload函数,则新创建一个匿名函数并先后执行旧onload函数、新onload函数 window.onload = function(){ oldLoadFun(); fun(); } }else{ // 直接挂载onload函数 window.onload = fun; } }
js requirejs简易实现 // define 声明模块 require使用模块 function define(moduleName, dependList, factory){ if(!this[__filename]){ this[__filename] = {} } // 依赖缓存 this[__filename][moduleName] = {moduleName: moduleName, depends: dependList, factory: factory} } function require(moduleList, callback){ var dependModules = [] for(var i=0; i<moduleList.length; i++){ var module = this[__filename][moduleList[i]
dom javascript DOM 001 W3C对DOM的定义是:一个与系统平台和编程语言无关的接口,程序和脚本可以通过这个接口动态的访问和修改文档的内容、结构和样式。 1998年10月完成了"第一级DOM"(DOMLever1) 兼容性查询:caniuse.com/ 一、节点:<p class="属性节点">文本节点<p> 元素节点(p标签节点)文本节点属性节点二、常用方法: document对象方法:getElementById(ie6+)/getElementsByTagName(ie6+)/getElementsByClassName(ie9+)// className查找的类名:不支持多类名、node查找的指定范围:不传则从html开始查找 function getElementsByClassName(className, node){ if(typeof className !== 'string')
js 光标操作 // 获取光标位置 function getCursorPosition(dom) { var cursorPos = 0; if (document.selection) { // IE Support dom.focus(); var range = document.selection.createRange(); range.moveStart ('character', -dom.value.length); cursorPos = range.text.length; } else if (dom.selectionStart || dom.selectionStart == '0'){ // Firefox support cursorPos = dom.selectionStart; } return cursorPos; } // 设置光标位置
vue Vue Class Component 一、vuex定义 import Vue from 'vue' import Component from 'vue-class-component' import { mapGetters, mapActions } from 'vuex' // post接口 import { Post } from './post' @Component({ computed: mapGetters([ 'posts' ]), methods: mapActions([ 'fetchPosts' ]) }) export default class Posts extends Vue { // 在类属性声明映射的getter和action // 你可能需要添加 `!` 在类属性后面 // 为了避免编译错误(需要明确的赋值断言). // 映射getter posts!: Post[] // 映射action fetchPosts!
vue Vue Class Component使用三 一、extends扩展 // super.js import Vue from 'vue' import Component from 'vue-class-component' // 超类必须继承于Vue @Component export default class Super extends Vue { superValue = 'Hello' } // HelloWorld继承于超类 @Component export default class HelloWorld extends Super { created() { console.log(this.superValue) // -> Hello } }二、mixins混合 // mixins.js import Vue
vue Vue Class Component使用二 一、vue router hooks路由钩子 import Component from 'vue-class-component' // 注册路由钩子,必须在任何组件定义之前注册它们 Component.registerHooks([ 'beforeRouteEnter', 'beforeRouteLeaver', 'beforeRouteUpdate' ]) 二、类组件将它们实现为类原型方法 import Vue from 'vue' import Component from 'vue-class-component' @Component export default class HelloWorld extends Vue{ beforeRouteEnter(to, from, next){ console.log('beforeRouteEnter') next() } beforeRouteLeaver(to, from, next)
vue Vue Class Component使用一 一、模板定义 import Vue from 'vue' import Component from 'vue-class-component' // HelloWorld class will be a Vue component @Component export default class HelloWorld extends Vue {}二、data数据 import Vue from 'vue' import Component from 'vue-class-component' @Component export default class HelloWorld extends Vue { // 请避免使用undefined作为初始值,class属性不具有反应性(检测能力)
js javascript递归和尾递归 一、递归 ,即一个函数内部不断循环调用自身函数,需要终止条件。 // 一个累加的递归函数 var s = new Date().getTime() function count(num){ if(num<=0){ return num } return num + count(num-1) } console.log( count(5) );//输出15 var e = new Date().getTime() console.log('执行时间', e-s)注意:此种递归方式会不断的把函数压入栈,如果num的数值越大,栈就会越大。二、尾递归,只存在一个函数在栈中。
js javascript宽高 一、获取宽高 网页可见区域宽: document.body.clientWidth; 网页可见区域高: document.body.clientHeight; 网页可见区域宽: document.body.offsetWidth (包括边线的宽); 网页可见区域高: document.body.offsetHeight (包括边线的宽); 网页正文全文宽: document.body.scrollWidth; 网页正文全文高: document.body.scrollHeight; 网页被卷去的高: document.body.scrollTop; 网页被卷去的左: document.body.scrollLeft; 网页正文部分上: window.screenTop; 网页正文部分左: window.screenLeft; 屏幕分辨率的高: window.
js javascript防抖和节流 概念防抖(debounce):触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间。节流(throttle):高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率。节流(throttle)与 防抖(debounce)都是为了限制函数的执行频次,以优化函数触发频率过高导致的响应速度跟不上触发频率,出现延迟,假死或卡顿的现象。一、示例:监听scroll事件获取滚动条高度 //防抖函数 function debounce(fn, delay){ var timer = null;//存放定时器 return function(e){ clearTimeout(timer);//清除上一个定时器 //创建定时器任务,间隔内时间scroll事件连续触发,就不会执行fn函数 timer = setTimeout(()=>{ fn.
js javascript-封装-103 完善一个类:利用闭包、自检测thisvar Book = (function(){ //静态私有变量 var _num = 0 //静态私有方法 function checkBook(){} //创建类 function _book (id, bookName){ //优化用户忘记使用new关键词实例化对象 //没有new关键词,this则指向Book函数执行所在的作用域(全局作用域window) if( !(this instanceof Book) ){ return new _book(id, bookName); } //私有变量 var name; //私有方法 function check(){} //特权方法 this.setName = function(){} this.getName = function(){} //对象公有属性
js javascript-封装-102 面向对象编程-类class一、类的概念 //创建一个类 var Book = function(id, bookName, bookPrice){ this.id = id this.name = bookName this.price = bookPrice } Book.prototype.show = function(){ console.log(this.id + this.name + this.price) } //实例化 var mathBook = new Book(1, '数学', 39); mathBook.show(); 二、类的理解 //Book类结构 Book
js javascript-封装-101 函数的创建与管理一、减少污染全局变量 var checkName = function(){} var checkPassword = function(){} 1.1 用对象收编变量var CheckObject = { checkName: function(){}, checkPassword: function(){} } 1.2 用类的原型对象var CheckObject = function(){} CheckObject.prototype = { checkName: function(){ return this;//链式调用 }, checkPassword: function(){ return this; } };//注意:不可与CheckObject.prototype.xxx混用了 //实例化 var check = new CheckObject(); check.checkName().checkPassword(
js is常用判断函数集合 一、javascript:typeof 返回的是字符串,有六种可能, "number"、"string"、"boolean"、"object"、"function"、"undefined" 是否为字符串:"", "false", "0", "Hello World"var isString = function(obj){ return typeof obj === 'string'; } var isString = function(obj){ return Object.prototype.toString.call(obj) === '[object String]'; };是否为布尔值:false, truevar isBoolean = function(obj)
vue 拓展extendVue方法 类jquery.extend方法,默认深拷贝。 // es6: extendVue.js // 拓展合并对象方法、兼容vue export default extendVue = (target, ...objs)=>{ let isDeep = true;//默认深拷贝 let length = objs.length;//可变参数长度 let i = 0;//索引号 if(typeof target == 'boolean'){ isDeep = target; if(length){ target = objs[i]; i++; }else{ return false;//不存在拷贝数据,返回false
app 移动端rem问题 rem自适应设置:设计稿宽度750px(iphone6/7/8) 设置:1rem = 100px,font-size: 0.16rem; //font-size: 16px; (function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize', recalc = function () { var clientWidth = docEl.clientWidth; if (!clientWidth) return; // fontSize / 100 = clientWidth / 750; docEl.style.fontSize = (clientWidth / 7.