Vue2数据劫持原理rollup打包Vue源码配置类库,工具库一般使用rollup打包,打包出的文件比较干净
12# rollup和babel桥梁 babel核心模块 es6=>es5 启动webpack服务yarn add rollup rollup-plugin-babel @babel/core @babel/preset-ent rollup-plugin-serve -D
rollup简单配置123456789101112131415161718192021222324252627282930// rollup.config.jsimport babel from 'rollup-plugin-babel'import serve from 'rollup-plugin-server'export default { input:"./src/index.js", // 入口 output:{ format: ...
防抖触发高频事件n秒内函数只执行一次,如果n秒内高频事件再次被触发,则重新计算时间
12345678910111213141516171819202122232425262728293031323334/** * @desc 函数防抖 * @param {Function} func 函数 * @param {Number} wait 延迟执行毫秒数 * @param {Boolean} immediate true 表示立即执行,false 表示非立即执行 */function debounce(fn, daley, immediate){ let timer return function () { if (timer) clearTimeout(timer) if (immediate) { let run = !timer timer = setTimeout(() => { timer ...
new思路:
创建一个对象__proto__指向这个类的原型对象(可以使用prototype上的方法了)
调用类执行并且修改this指向为新创建的obj,并且传入剩余参数
判断如果构造函数返回的是引用类型则返回这个值,否则返回obj
12345678910111213141516171819202122function Animal(type) { this.type=type; // 如果当前构造函数返回的是一个引用类型 需要把这个返回 //return {name:'a'}}Animal.prototype.say = function () { console.log('say')}function mockNew(){ // Constructor => Animal let Constructor = [].shift.call(arguments); let obj = {}; // 返回的结果 ...
虽然一般用不到,但是能加深对js运行机制的理解
第1题1234function a (b = c, c = 1) { console.log(b, c)}a()
答案: Cannot access ‘c’ before initialization
解析: 给函数多个参数设置默认值实际上跟按顺序定义变量一样,所以会存在暂时性死区,即前面定义的变量不能引用后面还未定义的变量,二后面的可以访问前面的
第2题123456let a = b = 10;(function(){ let a = b = 20 })()console.log(a)console.log(b)
答案: 10 、 20
解析: 连等操作是从右向左执行,相当于 b = 10 , let a = b, 很明显b没有声明就直接赋值了,所以会隐式创建为一个全局变量,函数内的也是一样,并没有声明b,直接就对b赋值了,因为作用域链,会一层一层向上查找,找了到全局的b,所以全局的b就被修改为20了,而函数内的a因为重新声明了,所以只是局部变量,不影响全局的a,所以a还是10。
第3题1 ...
浮动1.场景我们想实现如下效果,肯定会想到float或者flex,flex先不做讨论
12345678910111213141516171819202122<div class="box"> <div class="left"></div> <div class="right"></div></div>.box { border: 1px solid black; padding: 5px; width: 450px;}.left { width: 100px; height: 100px; background-color: red; float: left;}.right { width: 100px; height: 100px; background-color: red; float: right;}
2.寻找原因原因是,浮动的元素会脱离文档流,父元素就无法 ...
深入分析0.1 + 0.2 != 0.3计算机在存储数字是通过二进制来存储的,呈现的时候是通过十进制来呈现的,所以会有误差
那为什么计算机的二进制存储会造成误差呢?下面来一步步深究
十进制转二进制的转换规则整数
转换规则
除二取余,然后倒序排列,高位补零
可以得出1010001,可以看出有7位,但是计算机内部标识数是定长的,例如8位、16位、32位,所以7位是不够的,需要高位补0,也就是01010001,规范写法(81)10 = (01010001)
负整数
转换规则
把正整数转成二进制
对二进制取反
对取反后的二进制进行加1
小数
转换规则
对小数点以后得数乘以2,得出结果,取结果的整数部分(不是0就是1),然后再对结果的小数点以后的数乘以2,得出结果,再取结果整数部分,再然后然后再对结果的小数点以后的数乘以2。。。。以此类推。。直到小数部分为0或者位数已经到达位数。再把这个过程中取的整数按先后顺序排好就行了。
0.1 + 0.2再回到 0.1 + 0.2 这个问题
可以看到,0.1和0.2转为二进制都是无限循环的,超过了最大位数, 所以存储时只能通过 ...
原型链知识点总结prototype(显式原型) 和 __proto__(隐式原型)的关系构造函数的prototype和其实例的proto是指向同一个地方的,这个地方就叫做原型对象构造函数就是可以用了来new的函数,箭头函数不可用来做构造函数
12345678function Person(name,age){ this.name = name this.age = age}// 这是实例const person1 = new Person('小明', 20)const person2 = new Person('小红', 30)
构造函数的prototype和其实例的proto指向同一地方,验证如下
1234567891011121314151617function Person(name, age) { this.name = name this.age = age}Person.prototype.sayName = function() { console.log(this.nam ...
数组转化为树得常用方法总结使用递归来遍历提供一个genChildren方法,该方法递归去查找子集
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 const arrayData = [ { id: 3, title: '广东省', parent_id: 2 }, { id: 4, title: '广州市', parent_id: 3 },{ id: 2, title: '中国', parent_id: 0 }, { id: 5, title: '天河区', parent_id: 4 } ...
数组去重常用方法1.ES6的new Set()去重123let arr = [1, 1, 2, 3, 4, 4, 2, 3, 6]console.log([...new Set(arr)])// [1, 2, 3, 4, 6]
Set无法去重引用类型的数据(对象数组),如果数组中的值都是简单的string或者number,可以使用Set去重
2.使用new Map()去重1234567891011121314function unique(arr){ const result = [] const arrMap = new Map() for(let i = 0 ; i < arr.length ; i++){ if(!arrMap.has(arr[i])){ arrMap.set(arr[i]) result.push(arr[i]) } } return result}let arr = [1, 1, 2, 3, ...
快速排序(Quick Sort)
快速排序(Quick Sort)使用得最广泛,速度也较快,是图灵奖得主C.A.R.Hoare(1934-) 于1960事提出的
算法简介
快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序
算法描述和实现快速排序使用分治法来吧一个串(list)分成两个子串(sub-lists)。具体算法描述如下:
从数列中挑出一个元素,称为”基准“(pivot)
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准值的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为(partition)操作
递归的(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序
js代码实现方法11234567891011121314151617181920212223function quickSort(arr, left, right) { if (Array.isArr ...










