_由favila发布的评论:
CLJS中的各种数值判定符的目标应该是什么?
目标是与CLJ中这些判定符的含义一致吗?如果是这样,那么
{{number?}} 对于typeof-number、goog.math.Integer或goog.math.Long为true
{{integer?}} 对于goog.math.isInt/Number.isInteger、goog.math.Integer或goog.math.Long为true
{{int?}} 对于goog.math.isInt/Number.isInteger或goog.math.Long为true
目标是与一些平台原生态概念一致吗?如果是这样,那么
{{number?}} 对于typeof-number、goog.math.Integer或goog.math.Long为true
{{integer?}} 对于goog.math.isInt/Number.isInteger、goog.math.Integer或goog.math.Long为true
{{int?}} 仅对于goog.math.isInt为true
目标是进行“我可以用这个做算术吗?”类型的检查吗?如果是这样,那么
{{number?}} 仅对于typeof-number为true
{{integer?}} 对于goog.math.isInt(或者甚至可能是Number.isSafeInteger)为true
{{int?}} 与integer?相同
在Java/CLJ中,这三个目标彼此之间更加一致。任何数字作为标识符都可以用于clj算术(所以最宽的检查,{{number?}},也可以用于算术检查),而{{int?}}与主机最原始的整数值类型(与对象类型)相对应。
CLJS缺少数字直方图,因此更有趣。
目前,在CLJS中,{{number?}}似乎被设计为一个谓词,用于测试是否可以进行算术运算,因此它只允许js type-of===number。{{integer?}}也是一种算术检查,但它希望是一个非分数数(有趣的是,仍然允许不安全的整数,即超出Number.MAX_SAFE_INTEGER的范围,因为在这里正常的整数算术不工作——也许它应该只允许安全整数)。 {{int?}}不关心算术,但它仍然有助于检查一个值是否可以是数值标识符(例如,通过transit接收到的记录ID);但柳杰的int?并不关心这一点。