_ 评论由: favila_ 提供
CLJS 中各种数值断言的目标应该是什么?
目标是与 CLJ 中这些断言的含义一致吗?如果是这样,那么
{{number?}} 对 typeof-number 或 goog.math.Integer 或 goog.math.Long 为真
{{integer?}} 对 goog.math.isInt/Number.isInteger 或 goog.math.Integer 或 goog.math.Long 为真
{{int?}} 对 goog.math.isInt/Number.isInteger 或 goog.math.Long 为真
目标是与平台原生的某个概念一致吗?如果是这样,那么
{{number?}} 对 typeof-number 或 goog.math.Integer 或 goog.math.Long 为真
{{integer?}} 对 goog.math.isInt/Number.isInteger 或 goog.math.Integer 或 goog.math.Long 为真
{{int?}} 只有在 goog.math.isInt 为真时才为真
目的是进行 can-I-do-arithmetic-with-this 类型的检查吗?如果是这样,那么
{{number?}} 只有在 typeof-number 为真时才为真
{{integer?}} 对 goog.math.isInt(也许甚至是 Number.isSafeInteger)为真
{{int?}} 与 integer? 相同
In Java/CLJ 这些三个目标与彼此更加一致。任何数字标识符都可以用于 clj 计算(所以最宽的检查 {{number?}} 也可以用于计算检查),而 {{int?}} 与宿主的原始整数值类型(与对象类型)相对应。
CLJS 缺乏数字塔,所以更有趣。
目前,在CLJS中,{{number?}}看起来被设计为一个谓词,用于测试是否可以进行算术运算,因此它只允许js的type-of===number。{{integer?}}也是一个算术检查,但需要的是非分数数(有趣的是,仍然允许不安全的整数,即超出Number.MAX_SAFE_INTEGER的范围,在那里正常的整数算术无法进行——也许它应该只允许安全的整数)。 {{int?}}不在乎算术,但它仍然很有用,可以看看一个值是否可能是数值标识符(例如,通过transit接收到的记录id);但这与CLJ的int?所关心的完全不同。