再看antd源码的时候,有一点疑惑



export interface IconProps {
  type: string;
  className?: string;
  title?: string;
  onClick?: React.MouseEventHandler<any>;
  spin?: boolean;
  style?: React.CSSProperties;
}

const Icon = (props: IconProps) => {
  const {type, className = '', spin} = props;

  const classString = classNames({
    anticon: true,
    'anticon-spin': !!spin || type === 'loading',
    [`anticon-${type}`]: true,
  }, className);
  return <i {...omit(props, ['type', 'spin'])} className={classString}/>;
};

export default Icon;
这是里面最简单的Icon的组件源码,在看到!!spin 这里。不理解为什么要用!!spin 这样来写。一开始认为是如果spin没有传入的话,那么这个值就是undefined,所以需要用!undefined 来转为boolean类型,但是后来自己测试了下 undefined 默认是false的,好像并没有影响结果。希望哪位可以解惑下。
因为在其他组件里面好多都是这样写的额
阅读 3.7k
6 个回答

JavaScript是一门弱类型的语言,但是,在使用中有时需要强制转化为相应的类型。所以,!!() ,这种写法有将弱类型转化为强类型的作用

!!意思就是把后面的变量转换为bool类型,再判断是否为真

就是不管什么值都强制转换为 boolean 类型,不然代码逻辑要写反

clipboard.png

!是取反, !! 是强制转换为布尔值

只是因为anticon-spin期望值是bool,否则隐式类型转换也没什么问题。

var a = 'a'||true; //'a'

!!用来把一个值强制转换成boolean类型的值,antd的tsconfig里面设置了strictNullChecks,boolean类型不能赋值为null和undefined,需要强转

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题