hanyueqiang
hanyueqiang
Link事件源码 ```js if (_this.props.onClick) _this.props.onClick(event); if (!event.defaultPrevented && // onClick prevented default event.button === 0 && // ignore everything but left clicks !_this.props.target && // let browser handle "target=_blank" etc....
#### var、let 和 const区别 - var: 遇到有var的作用域,在任何语句执行前都已经完成了声明和初始化,也就是变量提升而且拿到`undefined`的原因由来 - let:解析器进入一个块级作用域,不会挂在顶层对象下面,变量只是先完成声明,并没有到初始化那一步。此时如果在此作用域提前访问,则报错`xx is not defined`,这就是暂时性死区的由来。等到解析到有let那一行的时候,才会进入初始化阶段。如果let的那一行是赋值操作,则初始化和赋值同时进行 - const: 声明之后必须马上赋值,否则会报错,简单类型一旦声明就不能再更改,复杂类型(数组、对象等)指针指向的地址不能更改,内部数据可以更改,例如`Array.push(1)`或者`Obj['key']=1`,命令声明的常量不提升,存在暂时性死区,只能在声明的位置后面使用 - function: 声明、初始化、赋值一开始就全部完成,所以函数的变量提升优先级更高 #### 实现原理 - var:直接在栈内存里预分配内存空间,然后等到实际语句执行的时候,再存储对应的变量,如果传的是引用类型,那么会在堆内存里开辟一个内存空间存储实际内容,栈内存会存储一个指向堆内存的指针 - let: 是不会在栈内存里预分配内存空间,而且在栈内存分配变量时,做一个检查,如果已经有相同变量名存在就会报错 - const:也不会预分配内存空间,在栈内存分配变量时也会做同样的检查。不过`const`存储的变量是不可修改的,对于基本类型来说无法修改定义的值,对于引用类型来说你无法修改栈内存里分配的指针,但可以修改指针指向的对象里面的属性
示例: ```js 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] ``` 说明: 必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。 解法1: ```js function zeroMove(array) { let len = array.length; let j = 0; for (let i = 0; i <...
```js function symmetry() { let arr = []; for (let i = 1; i < 10000; i++) { let str = i.toString() let reversStr = str.split('').reverse().join(''); if (str === reversStr)...
Promise.all()的参数是传入一个数组,数组的值是Promise对象,如果不是,就会先调用Promise.resolve方法,将参数转为 Promise 实例,这个函数返回一个Promise对象 这个函数顾名思义就是检查传入的所有数组是否都执行成功,如果都成功那么这个函数返回的Promise对象进入resolve状态并将所有promise成功的参数组成一个数组传给resolve函数,如果其中任何一个失败,那么就进入reject状态,并将第一个reject的promise的参数传给Promise.all返回的promise对象的reject函数 ```js function promiseAll(arr = []) { return new Promise((resolve, reject) => { const result = [], len = arr.length; arr.forEach(item => { Promise.resolve(item).then( res => {...
防抖处理 ```js const inputEle = document.querySelector('#input') let dbFun = debounce(500) inputElet.addEventListener('keyup', function (e) { dbFun(e.target.value); }) function debounce(timeout) { let timer; return function (value) { clearTimeout(timer); timer = setTimeout(() =>...
- 加载渲染过程 父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted - 子组件更新过程 父beforeUpdate->子beforeUpdate->子updated->父updated - 父组件更新过程 父beforeUpdate->父updated - 销毁过程 父beforeDestroy->子beforeDestroy->子destroyed->父destroyed 参考:https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/128
> 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 ```js 输入: [1, 2, 3, 4, 5, 6, 7] 和 k = 3 输出: [5, 6, 7, 1, 2, 3, 4] 解释: 向右旋转 1...
```js // example 1 var a={}, b='123', c=123; a[b]='b'; a[c]='c'; console.log(a[b]); --------------------- // example 2 var a={}, b=Symbol('123'), c=Symbol('123'); a[b]='b'; a[c]='c'; console.log(a[b]); --------------------- // example 3 var a={}, b={key:'123'}, c={key:'456'};...
数组根据索引获取下标值,时间复杂度是O(1),所以第一个跟最后一个元素 时间消耗相同。插入值复杂度O(n) 注意:链表的时间复杂度O(n),插入值的复杂度是O(1)