2010-05-26 111 views
104

我必須編寫一個例程,如果其類型爲number,則將變量值增加1,如果不是,則將0賦值給變量,其中變量最初爲nullundefined爲什麼`null> = 0 && null <= 0`但不是`null == 0`?

第一個實現是v >= 0 ? v += 1 : v = 0,因爲我認爲任何不是數字都會使算術表達式爲false,但由於null >= 0的計算結果爲true,因此它是錯誤的。然後我學會了null的行爲如同0,下面的表達式都被評估爲true。

  • null >= 0 && null <= 0
  • !(null < 0 || null > 0)
  • null + 1 === 1
  • 1/null === Infinity
  • Math.pow(42, null) === 1

當然,null不是0 null == 0被評估爲假。這使得似乎同義反復表達式(v >= 0 && v <= 0) === (v == 0)錯誤。

爲什麼null就像0,雖然它實際上不是0?

+3

他正在談的JavaScript。你的例子是在PHP中。在PHP中,運算符==以特殊方式比較值。你可以做一些非常瘋狂的比較,比如「10」==「1e1」(這是真的)。如果使用operator ===,則會得到完全不同的結果,因爲它會檢查類型是否與值相匹配。查看此鏈接:http://www.php.net/manual/en/language.operators.comparison.php – Pijusn 2012-04-06 05:59:12

+0

PHP'=='運算符確實以「特殊」方式工作。 – 2014-03-19 03:26:01

+0

如果您的要求是從1開始計數而不是0,那麼增加最初爲'null'或'undefined'的計數器的方法非常簡單:c = - 〜c //結果爲1 for null/undefined;如果已經有一個數字,則增加' – 2017-09-12 16:24:37

回答

160

你真正的問題似乎是:

爲什麼:

null >= 0; // true 

但是:

null == 0; // false 

真正發生的是,大於-或相等操作>=),執行類型強制(ToPrimitive),提示類型Number,實際上所有的關係運算符都有這種行爲。

nullEquals Operator==)以特殊方式處理。在簡短的,它只脅迫undefined

null == null; // true 
null == undefined; // true 

值,如false'''0',並且[]受到數值類型轉換,所有的人都強迫爲零。

您可以在The Abstract Equality Comparison AlgorithmThe Abstract Relational Comparison Algorithm中看到此過程的內部細節。

總結:

  • 關係比較:如果兩個值不鍵入字符串,ToNumber上調用兩者。這與在前面添加+相同,對於0爲空脅迫。

  • 平等比較:只在字符串,數字和布爾值上調用ToNumber

+1

嗨CMS,根據您的解釋null原始爲0,所以0> = 0返回true,==返回false.but按照ecma算法如果Type(x)是Object且Type(y)是String或Number , 返回比較的結果ToPrimitive(x)== y.then在這個它應該返回true.please解釋我 – 2016-06-07 06:34:53

+0

給我答案不提供*答案* - null null以特殊方式處理等於運算符(==)。簡而言之,它只會強制未定義:' - 什麼?你能解釋一下,爲什麼'null> = 0'? :) – 2016-06-26 14:01:34

+0

@bharathmuppa @ andrey-deineko: CMS的答案的其餘部分在這裏: [抽象關係比較算法](http://www.ecma-international.org/ecma-262/5.1/#sec -11.8.5) 它在第3點中解釋,如果兩個值都不是字符串類型,則同時調用ToNumber。這與在前面添加一個'+'相同,對於'0'爲空脅迫。 平等僅在字符串,數字和布爾值上調用ToNumber。 – 2016-08-23 15:32:04

7

我想延長的問題,進一步提高問題的可見性:

null >= 0; //true 
null <= 0; //true 
null == 0; //false 
null > 0; //false 
null < 0; //false 

它只是沒有任何意義。像人類語言一樣,這些東西需要通過內心學習。

0

我有同樣的問題!! 目前我唯一的解決方案是分開。

var a = null; 
var b = undefined; 

if (a===0||a>0){ } //return false !work! 
if (b===0||b>0){ } //return false !work! 

//but 
if (a>=0){ } //return true ! 
3

JavaScript有兩個嚴格和類型轉換比較

null >= 0;是真的 但 (null==0)||(null>0)是假

null <= 0;是真實的,但(null==0)||(null<0)是假

"" >= 0也是如此

對於關係抽象比較(< =,> =),在比較之前,操作數首先轉換爲基元,然後轉換爲相同類型。

typeof null returns "object"

當類型是JavaScript的嘗試字符串化的對象的對象(即,空)採取 以下步驟(ECMAScript 2015):

  1. 如果PreferredType未通過,讓hint是「默認」。
  2. 否則,如果PreferredTypehint字符串,則讓hint爲「字符串」。
  3. 其他PreferredTypehint數字,讓hint爲「數字」。
  4. exoticToPrimGetMethod(input, @@toPrimitive)
  5. ReturnIfAbrupt(exoticToPrim)
  6. 如果exoticToPrim未定義,則
    a)令結果爲Call(exoticToPrim, input, «hint»)
    b)ReturnIfAbrupt(result)
    c)如果Type(result)不是Object,則返回結果。
    d)拋出TypeError異常。
  7. 如果hint爲「默認」,則讓hint爲「number」。
  8. 退貨OrdinaryToPrimitive(input,hint)

提示的允許值爲「default」,「number」和「string」。日期對象在內置ECMAScript對象中是唯一的,因爲它們將「default」視爲等同於「string」。 所有其他內置ECMAScript對象將「默認」視爲等同於「數字」。 (ECMAScript 20.3.4.45

所以我覺得null轉換爲0

相關問題