JavaScript踩坑之逻辑运算符 ||

文章重点:逻辑运算符 || 在js中可以用来取值,比如 4 || 3 会取4,但是如果是0 || 1,等同于 false || true,会取true,也就是1。

 

这几天写前端的时候,一个antd的radio组件取的initialValue有问题,但是其他radio组件都没有问题。

具体表现形式是radio组件的initialValue总是显示固定的一个值。

 

我刚开始还以为是antd组件的问题,后来发现竟是逻辑运算符的问题。

原来我是这样写的:

<FormItem label="分享">
  {
    getFieldDecorator('closeShare', {
      initialValue: courseInfo.closeShare || 1,
    })(
        <Radio.Group>
          <Radio value={0}>开启分享</Radio>
          <Radio value={1}>关闭分享</Radio>
        </Radio.Group>
    )
  }
</FormItem>

这里 courseInfo.closeShare的值预期为1或0。

我的原意是initialValue取courseInfo.closeShare的值,如果没有就默认为1。

结果按钮一直显示为关闭分享,也就是initialValue一直取1。

 

最后发现 || 运算符取值并不是哪个有值就取哪个。

一般是谁有真值取谁,没有则取假值。0 || 1等同于 false || true,这时会取true,也就是取1。

 4 || 3       //取4  
 null || 4    //取4
 4 || 1       // 取4   
 0 || 1       // 取1
 true || true ;   // 取true
 false || true ;  // 取true
 true || false ;  // 取true
 false || false ; // 取false
 4 || true    //取4
true || 4    //取true  短路求值
null || null   //取null

而我的写法就会导致,即使courseInfo.closeShare的值为0,initialValue依然会取1。

最初之所以这样写,是因为项目里也有这样的写法,但是他们的默认值都是0或者其他数字,所以没出现问题。但是值的范围为1和0时,并且默认值为1就会出现问题。

 

最后我的解决方法是改成三目运算符

courseInfo.closeShare == null ? 1 :courseInfo.closeShare

 

其实中间我其实改过一次三目运算符,没生效,如下:

courseInfo.closeShare ?courseInfo.closeShare : 1 

这里没生效是因为courseInfo.closeShare的值预期是1或0。

但是1或0又可以表示true或false,就会导致如果courseInfo.closeShare的值是0,也就是false,则这里会显示1。

 

这次的问题可以说是吃了没了解透js中运算符的亏。

 

参考

JavaScript 中的三个逻辑运算符  (&&也有取值的相关用法)

 

TypeError: Cannot read properties of null (reading 'parentId')是JavaScript中的一个错误。它表示你正在尝试对一个null值的属性进行读取操作,而null并没有这个属性。 这个错误通常发生在你通过点符号(.)或方括号([])访问一个对象的属性时,而该对象的值为null。解决这个错误的方法是确保你在访问属性之前,先检查对象是否为null或undefined。可以使用逻辑与(&&)运算符进行简单的检查,或使用条件语句(如if语句)来处理这种情况。 此外,你还可以通过查看控制台输出来获取更多关于错误的信息。控制台通常会显示错误的堆栈跟踪信息,帮助你找到错误发生的位置。 如果你想深入了解JavaScript中的Object.assign()方法,可以点击以下链接查看Mozilla开发者网络(MDN)上的详细文档。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [element el-select Cannot read properties of null (reading ‘parentNode‘)错误](https://blog.youkuaiyun.com/qq_15903703/article/details/127113926)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [TypeError: Cannot read properties of null (reading ‘parentNode‘) vue3](https://blog.youkuaiyun.com/weixin_57997644/article/details/130475766)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [JavaScript 程序错误Cannot use 'in' operator to search的解决方法](https://download.youkuaiyun.com/download/weixin_38571104/12967332)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值