W3C home > Mailing lists > Public > public-html-ig-zh@w3.org > April 2012

Re: ES5 中跟 '===' 很像的 SameValue

From: John Hax <johnhax@gmail.com>
Date: Sun, 15 Apr 2012 00:52:32 +0800
Message-ID: <CAEeYXHWXHBE9fBFe8MGsT2J5B=7dyKUsoUq-SycECdTfhhTunw@mail.gmail.com>
To: "Kang-Hao (Kenny) Lu" <kennyluck@w3.org>
Cc: (wrong string) 鑸堣叮灏忕祫 <public-html-ig-zh@w3.org>, 椋庝箣鐭 <dh20156@gmail.com>
SameValue确实应该是最快的,因为就是字节比较。(理论上NaN可以有许多种字节表示,不过应该会被归一化为同一个表示。)

而 === / !== 的设计,我想主要是从程序员的方便出发。如果+0 !== -0,恐怕是违背大多数人的直觉的。比如Math.round(-0.1)
=== 0返回false会让人看不懂。


还有你提到的这个检测-0的方法,在这篇blog中已经有提到:http://www.wirfs-brock.com/allen/posts/128
当然原本的 x === 0 && 1/x === -Infinity 或许是更简单的测试方法。

2011/12/21 Kang-Hao (Kenny) Lu <kennyluck@w3.org>

> 風之石在 ECMAScript5 規範中看到了一個很像 '===' 用的演算法 —
> SameValue[1],但是它跟 '===' 的不同處在於:
>
> * SameValue(NaN, NaN) → true
> * SameValue(+0, -0) → false
> * SameValue(-0, +0) → false
>
> (跟 '===' 相反)
>
> [1] http://www.w3.org/html/ig/zh/wiki/ES5#samevalue
>
> 我研究了一下,發現@個結果可以用下面@個方式實驗:
>
> (function(){
>    'use strict';
>    var x = {data: +0};
>    Object.freeze(x);
>    Object.defineProperty(x, "data", {value: -0});
> })() // 拋錯。兩個都 NaN 則不拋。
>
> 詳細解釋可以參考 [[DefineOwnProperty]] 的演算法[2],特別是 10.a.ii。我/
> 猜/有可能可以不靠 'use strict' 跟 Object.defineProperty 做出@種實驗,可
> 能要看看 [[DefineOwnProperty]] 的回傳值用在什麼比較隱晦的地方(arguments
> 之類的),不過不繼續研究了。對 test262[3] 比較熟了人可以去裡面找找看。
>
> [2] http://es5.github.com/#x8.12.9
> [3] http://test262.ecmascript.org/
>
> 話說回來,SameValue(+0, -0) 是 false 的原因應該跟浮點數的內部實作有關
> 吧,所以 SameValue 應該是最快的。我的問題是,NaN !== NaN 我大概可以理
> 解,-0 === 0 的理由是什麼呢?
>
> (在 HTML5 規範翻譯群最近還蠻不少規範討論的,寫一點分享到@個公開郵件群
> 來。上個禮拜還討論了一個禮拜的 AppCache。基本上群裡的人都可以討論可以公
> 開,不過不太清楚 QQ 群的技術機器人要怎麼搞?還有,有沒有違反 QQ 的使用條
> 例啊?不然的話,我一直是覺得 WHATWG IRC 頻道的紀錄[4]還蠻好用的。)
>
> [4] http://krijnhoetmer.nl/irc-logs/
>
>
> 此致
>
> Kenny
>
>
Received on Saturday, 14 April 2012 16:53:02 UTC

This archive was generated by hypermail 2.3.1 : Tuesday, 6 January 2015 20:43:50 UTC