在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ [已解決]js中!!有存在的必要么?為什么?

[已解決]js中!!有存在的必要么?為什么?

業(yè)務背景


  • 瀏覽`lodash源碼
  • 發(fā)現(xiàn)了!!這個用法
  • 查了一下,是兩次取反的意思
  • 但是沒搞懂他存在的必要

示例代碼


lodash官方源碼
function isObjectLike(value) {
  return !!value && typeof value == 'object';
}
我修改后的代碼,即直接去掉!!
function isObjectLike(value) {
  return value && typeof value == 'object';
}

我的困惑


  • 官方代碼的含義

    • 就是取反之后再取反,最后來判斷這個變量是否為真
  • 我的代碼

    • js會根據(jù)數(shù)據(jù)類型以及變量值,自動判斷他為真為假

比如傳一個0進去

  • 官方的步驟:

    1. !0 => true
    2. !true => false
  • 我的步驟

    1. 0 => false\

問題


  • 既然結果都一樣,那很多大佬寫的代碼為什么都要這樣用呢?肯定不是多此一舉吧
回答
編輯回答
枕邊人

作用是為了類型轉換, 強制轉換成布爾值.

至于為什么需要. 我來詳細說說:

function isObjectLike(value) {}

我們期望 isObjectLike 的返回值是個 boolean. 但 && 操作的返回值是參與操作的操作數(shù).

console.log(1 && 2) // 打印 2
console.log(0 && 2) // 打印 0

所以如果我們傳遞給 && 的操作數(shù)不是布爾類型的, 那么我么得到的返回值就不是布爾值. 我們看看去掉 !! 會造成怎樣的不一致性和bug.

function isObjectLike(value) {
  return value && typeof value == 'object'; // 去掉 !!
}

isObjectLike(0) === false // false 什么? 居然不相等?

console.log(isObjectLike(0)) // 打印 0

你能想象一個叫 isObjectLike 的函數(shù)返回值類型卻不是 boolean 值嗎?

2018年2月12日 22:31
編輯回答
小眼睛

它存在的作用就是樓上說的強制轉任何值為布爾值

2018年3月7日 09:57
編輯回答
落殤

強制轉化成bool值,還是有必要的。雖然隱式轉換也是可以運行,在終歸是不科學的

2017年12月16日 08:59
編輯回答
枕邊人

我覺得主要原因還是返回值 因為這是一個判斷真假的方法
0&&true => 0
!!0&&true => false

2018年1月11日 20:28
編輯回答
負我心

這個涉及js的類型轉換網(wǎng)上一直以來都說js的隱性強制轉換不好,相反使用顯性的更容易讓人理解,在某些情況下也可以避免不必要的錯誤,簡單舉個例子,如果你不注意自己的代碼中涉及到這樣的比較:

null == false  // false
!!null == false  // true

當然代碼中最好不要直接通過falsetrue來進行“==”和“===” 的比較。

2017年5月29日 05:21