2014-10-30 74 views
9

在試圖完全理解等號運算符和身份運算符之間的區別時,我在MSDN上遇到了一個article,它解釋了它們在內部工作方面所做的工作,但我仍然有一些疑問並決定創建一個流程圖,以便我可以有更好的圖片。現在我的問題是,這個流程圖是否正確?或者我錯過了什麼?搞清楚javascript相等運算符

這也是我的理解,身份運算符(===)將以幾乎相同的方式工作,但不嘗試在第一步中將A和B轉換爲布爾值,數字或字符串。那是對的嗎?

你可以看到圖像here太:

enter image description here

確定這裏是真實的東西,這是原則問題;)

enter image description here

+0

圖表很好! – 2014-10-30 02:25:24

+4

沒有「身份運算符」,但有一個嚴格的等於(相等)運算符。如果你的問題是「*流程圖模型是用於'=='操作符*'的抽象比較算法,那麼答案是」否「。最好的開始是規範:[*抽象平等比較算法*](http://ecma-international.org/ecma-262/5.1/#sec-11.9.3)。 – RobG 2014-10-30 02:30:04

+0

您可能會將[* MSDN *](http://msdn.microsoft.com/zh-cn/library/ie/ky6fyhws%28v=vs.94%29.aspx)文章與[* MDN * ](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators)。 – RobG 2014-10-30 03:23:18

回答

4

是這個流程圖正確?

不可以。您應該對Abstract Equality Comparison Algorithm使用ECMAScript規範來創建流程圖。 ToBoolean當然不是第一步(它不用於任何步驟)。

還是我錯過了什麼?

是的,很多。

這也是我的理解,身份運算符(===)將以幾乎相同的方式工作,但不嘗試在第一步中將A和B轉換爲布爾值,數字或字符串。那是對的嗎?

Strict Equality Comparison Algorithm是幾乎相同的Abstract Equality Comparison Algorithm,只有當參數類型有不同的差,並且在那種情況下存在其中的類型是相等的比較作出前以精確的順​​序。

+0

優秀的,很好的答案! – Overlord 2014-10-30 03:43:38

+0

「,在這種情況下,在進行比較之前,有一個精確的類型相同的順序。」不是真的。爲了嚴格比較,類型根本不相同。如果它們不相等,答案就是* false *。 – Octopus 2015-09-01 17:02:24

+0

@ Octopus-該評論適用於抽象的相等算法,不嚴格(正如你所說,它不會轉換類型)。 – RobG 2015-09-02 13:19:03

-2

這個流程圖是否正確?

不可以。除了可怕的被掩蓋之外,它是誤導性的,部分錯誤的。

我錯過了什麼嗎?

是的。第一步,「嘗試將A和B轉換爲布爾值,字符串或數字」是錯誤的 - 這不是equality comparison algorithm中的第一步。另外,何時轉換哪些類型的變量?

然後,下一步應該是一個類型區分,而不是反覆詢問具體類型的相同值。

「最後」的步驟「他們可以(類型)強制進入最後5種情況嗎? - >強制類型」缺少細節。所有的細節。哪一個是馬虎相等比較中最相關的部分:

  • 哪些類型可以被強制?
  • 什麼類型將被強制轉移到哪個?
  • 價值觀的強制是如何運作的?

而且,在強制之後,算法幾乎從一開始就開始,而不是與字符串有關的問題。

這也是我的理解,身份運算符(===)將以幾乎相同的方式工作,但不嘗試在第一步中將A和B轉換爲布爾值,數字或字符串。

即第一步是看不出來的實際算法,因此號事實上,===工作原理相同除了最後步驟,其值強制轉換成其他類型的 - 相反,則返回false


編輯:你的第二張圖是準確的(正確的),雖然它仍然有一些奇怪的佈局決定。