1, 关于 if()的判断条件;
我们知道 使用if 的条件 ;期望得到一个布尔值;
我们也经常在会遇到这种场景, 使用一个对象的某条属性作为判断条件;
比如
const test={isl:""};
if(test.isl){ //dosth };
这里会做一个 隐式转化;
几种为flase的情况:
1,等一个对象为空“”;通过隐式转化为false;
2,未定义一个属性; 值就是 undefined ; 通过隐式转化为false;
3 ,预设属性等于null,值就是null ; 通过隐式转化为false;
4,值为0;值为0,通过隐式转化为false;
然后的话 ,这就有问题了;
如果 这个属性的的值为期待正常的值0;那么这种情况就会有bug了;
有人说这样
if(!!test.isl){//dosth};
双向转化一下;强制转布尔值;我试了一下,以上四种情况 全部为false,那就说明没有解决问题;
高程上的方案;用期待的类型去做比较;typeof 之类的 比较;
麻烦是麻烦了点 ,在某些 场景会需要这样做的;
除非在编程的过程中把这四种情况统一是为异常情况,否则就是会有这个比较隐蔽bug的风险,需要要严谨一些。
2, 关于bind的入参接受参数
直接上react代码了;
<InputItem onChange={v=>this.handlerChange.bind(this,"user",v)()}>user</InputItem>
handlerChange(k,v){
this.setState({[k]:v})
}
这里是正常的bind传参; bind 从第二个参数起才是要传的参数,
如果 没有传递参数 ,单纯是入参this呢?
那么将会接受到一个proxy对象
- Proxy {dispatchConfig: {…}, _targetInst: FiberNode, isDefaultPrevented: ƒ, isPropagationStopped: ƒ, _dispatchListeners: ƒ, …}
- [[Handler]]:Object
- [[Target]]:Class
- [[IsRevoked]]:false
这个应该是 bind 自己内部的闭包来实现的代理把, 猜测 ; 有不妥指出还望指正
3, react props传输 值类型的限制
注意: 从 React v15.5 开始 ,React.PropTypes
助手函数已被弃用,我们建议使用 prop-types
库 来定义contextTypes
。
我们提供 一个 codemod 脚本来自动转换。
import PropTypes from 'prop-types';
class Greeting extends React.Component {
render() {
return (
<h1>Hello, {this.props.name}</h1>
);
}
}
Greeting.propTypes = {
name: PropTypes.string
};
引入,定义 就完事了 这样就可以为传入的props 来 限制类型了
4, obj的对象属性是为定义导致的 Uncaught TypeError
声明一个对象 var obj={};
obj.a //undefined
obj.a.a 会直接报错 Uncaught TypeError;
这样写可以规避 报错 obj.a&&obj.a.a //undefined