评论由: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类型为===number。 {{integer?}}也是一个算术检查,但是希望得到一个非分数数(有趣的是,仍然允许不安全的整数,即超出Number.MAX_SAFE_INTEGER的范围,在这些范围内普通整数运算无法进行--也许它应该只允许安全的整数)。 {{int?}}不关心算术,但它仍然有助于判断一个值是否可以作为数值标识符(例如,通过transit接收的记录ID);但这绝不是CLJ的int?所关心的。