本文不讨论详细diff算法只关注setState更新流程(如果不是batchedUpdate也会包装成一个),key索引与id区别
react event
react key使用index和id区别
react日常开发过程中我们经常会遇到一些警告,如:Each child in an array or iterator should have a unique “key” prop。 为了省事我们通常会使用index作为key,警告不见了效果好像也没什么问题。但是真的没问题吗?
for 循环中的let
下面的代码如果使用var,最后输出的是10。
1 | var a = []; |
上面代码中,变量i是var命令声明的,在全局范围内都有效,所以全局只有一个变量i。每一次循环,变量i的值都会发生改变,而循环内被赋给数组a的函数内部的console.log(i),里面的i指向的就是全局的i。也就是说,所有数组a的成员里面的i,指向的都是同一个i,导致运行时输出的是最后一轮的i的值,也就是 10。
如果使用let,声明的变量仅在块级作用域内有效,最后输出的是 6。
1 | var a = []; |
上面代码中,变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量
,所以最后输出的是6。你可能会问,如果每一轮循环的变量i都是重新声明的,那它怎么知道上一轮循环的值,从而计算出本轮循环的值?这是因为 JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。
另外,for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。1
2
3
4
5
6
7for (let i = 0; i < 3; i++) {
let i = 'abc';
console.log(i);
}
// abc
// abc
// abc
上面代码正确运行,输出了 3 次abc。这表明函数内部的变量i与循环变量i不在同一个作用域,有各自单独的作用域。
引自阮老师es6
node commonjs原理
核心思想
1 | let mod = { |
react16系列-代码分割
import()
动态 import() 语法目前只是一个 ECMAScript (JavaScript) 提案, 而不是正式的语法标准。预计在不远的将来就会被正式接受。
当 Webpack 解析到该语法时,它会自动地开始进行代码分割。如果你使用 Create React App,该功能已配置好,你能立刻使用这个特性。Next.js 也已支持该特性而无需再配置。1
2
3import("./math").then(math => {
console.log(math.add(16, 26));
});
react.lazy
1 | const OtherComponent = React.lazy(() => import('./OtherComponent')); |
手写实现call/apply/bind
call
1 | Function.prototype.call = function (context, ...args) { |
apply
1 | Function.prototype.apply = function (context, args) { |
bind
- bind时可以绑定部分参数,执行函数会将新参数和之前的部分参数一块传入并执行
- 绑定函数也可以使用new运算符构造,提供的this值会被忽略,但前置参数仍会提供给模拟函数
- bind多次this仍然指向第一次的指向
1 | Function.prototype.bind = function (otherThis, ...args) { |
array-flattern
扁平化一个数组
1 | // [1, 2, 3, 4, [5, 6, [7, 8], 9], 10] |
implement-new
new一个函数构造器主要步骤1
2
3
4
5function instant(fn,...args){
var obj = Object.create(fn.prototype);
var val = fn.apply(obj,args);
return typeof obj === 'object' ? val : obj;
}