references:
React 精要面试题讲解(五) 高阶组件真解
对于复用的ui、数据逻辑的一个封装
是一个函数,接收一个组件作为参数,返回一个处理后的组件或者新的组件
是一个函数,接收一个函数作为参数,返回一个经过处理后的函数或者新函数
function testedFunc() {
this.a=1;
}
function hof(func){
func.prototype.aaa=3;
return func;
}
const newfunc=hof(testedFunc);
const func0=new newfunc();
console.info(newfunc.prototype.aaa,func0.aaa,func0.a);
// 3 3 1
这部分可以参考阮一峰的博客
es6 decorator
用来注释或修改类和类方法。
@decorator
class A {}
// 等同于
class A {}
A = decorator(A) || A;
装饰器本质就是编译时执行的函数。不是运行时哦~
// 下面写一个简单的高阶组件
const wrapedComponent=(component)=>{
class newComponent extends React.Component{
render(){
return <component info="xxx" />
}
}
return newComponent;
}
class MyReactComponent extends React.Component {}
export default connect(mapStateToProps, mapDispatchToProps)(MyReactComponent);
可以这样写
@connect(mapStateToProps, mapDispatchToProps)
class MyReactComponent extends React.Compone
nt {}
函数柯里化其实就是将输入的多个参数变成只使用第一个参数并且返回以剩余参数为参数且有返回结果的函数。
hoc form组件我更新在了github上面:
https://github.com/LynnWonder/dva-router-demo
接收fields作为初始state,handleInputChange用value来更新state,其实这里有点类似于父子组件传值。
function
A function to be executed after the timer expires.
code
An alternative syntax that allows you to include a string instead of a function, which is compiled and executed when the timer expires. This syntax is not recommended for the same reasons that make using eval() a security risk.
再参考这篇博文:关于setTimeout 第一个参数的问题解析
第一个参数只能放函数指针,如果想传参就直接用匿名函数包裹起来即可
当你在做一个题目找不到什么规律的时候,可以考虑贪心算法,先去解决局部的最优问题,然后逐步的改进提升。
注意:
F(10)=F(9)+F(8);
F(9)=F(8)+F(7);
···
- 状态转移方程:F(n)=F(n-1)+F(n-2) n>=3
- 最优子结构:F(9) F(8)
- 边界:F(1)=1 F(2)=2
【C语言】求取第n个斐波那契数的时间复杂度、空间复杂度分析,用三种方式实现(普通递归,循环,优化递归)
//递归写法
const fib=(n)=>{
if (n===1) return 1;
if(n===2) return 1;
return fib(n-1)+fib(n-2);
}
时间复杂度分析:参考等比数列求和公式
T= 2^0+2^1+...+2^(n-2)=2^(n-2)-1
空间复杂度分析:
fib(n)=fib(n-1)+fib(n-2)=… 创建了n-1个空间
const fib=(n)=>{
let res=new Array(n);
for(let i=0;i<n;i++){
if (i===1) res[0]=1;
if(i===2) res[1]=1;
res[i]=res[i-1]+res[i-2];
}
return res[n-1];
}
真的心累,又又又记录这个问题了。。。
是因为今天看到一个
[]===[]; //false
从这篇文章做笔记而来:
探究 == 本质
详解 javascript 中的比较(==和 ===)
参考上面的文章可以发现:如果是两个基本类型的变量相比较一般都会化成number类型对比。
如果其中有一方是对象就要先将其变成原始类型
转换原始类型:Symbol.toPrimitive
在Symbol.toPrimitive 属性(用作函数值)的帮助下,一个对象可被转换为原始值。该函数被调用时,会被传递一个字符串参数 hint ,表示要转换到的原始值的预期类型。 hint 参数的取值是 “number”、“string” 和 “default” 中的任意一个。
var obj = {
[Symbol.toPrimitive](hint) {
if (hint == "number") {
return 10;
}
if (hint == "string") {
return "hello";
}
return '10';
}
};
console.info(obj=='10');//true
ans |
---|
首先我们知道,!的优先级要大于==的,所以先运算右边,![]---->结果为false |
此时两边数据类型已经不一样了,先转换数据类型 []空数组转换为false |
相当于,Number([])为0,Number(false)为0 |
基本数据类型 | 引用类型 |
---|---|
值存放在栈中 | 地址放在栈里,值放在堆里 |
复制的时候传值 | 一般来讲,浅复制就是传址 |
因而如果比较两个空数组,虽然值一样,但是指向的地址不一样,所以不相等也不全等。
另:
console.info('null===null',null===null); //true
console.info('undefined===undefined',undefined===undefined); //true
console.info('[]===[]',[]===[]); //false
// Object.is 的polyfill
if (!Object.is) {
Object.is = function(x, y) {
// SameValue algorithm
if (x === y) { // Steps 1-5, 7-10
// Steps 6.b-6.e: +0 != -0
return x !== 0 || 1 / x === 1 / y;
} else {
// Step 6.a: NaN == NaN
return x !== x && y !== y;
}
};
}
console.info(Object.is(null,null)); // true
console.info(Object.is(NaN,NaN)); // true