在我阅读的各种文章中,有时会提到原始数据类型,有时也会提到标量。
我的理解是它们都是一些简单的数据类型,例如 int、boolean、char 等。
是否有什么我忽略了的因素,导致应该使用特定的术语,或者这些术语只是可以互换使用的呢? 维基百科的页面并没有显示任何明显的区别。
如果这些术语只是可以互换使用的话,那么哪一个更受欢迎呢?
在我阅读的各种文章中,有时会提到原始数据类型,有时也会提到标量。
我的理解是它们都是一些简单的数据类型,例如 int、boolean、char 等。
是否有什么我忽略了的因素,导致应该使用特定的术语,或者这些术语只是可以互换使用的呢? 维基百科的页面并没有显示任何明显的区别。
如果这些术语只是可以互换使用的话,那么哪一个更受欢迎呢?
我认为它们不是可以互换的。它们常常相似,但是存在区别,主要在于它们所对比的对象和上下文中的相关性。
标量通常与复合类型对比,例如数组、映射、集合、结构等。标量是一个“单一”的值 - 整数、布尔值,可能是字符串 - 而复合类型由多个标量(以及可能是其他复合类型的引用)组成。“标量”在上下文中适用于单个/简单/原子值和复合值之间的相关区别。
然而,基本类型则与例如引用类型相对应,并且当相关区别是“这是直接的值,还是它是指向包含真实值的东西的引用?”时使用,例如Java的基本类型与引用类型。我认为这是比标量/复合类型略低级别的区别,但并不完全相同。
它真的取决于上下文(通常是正在讨论的语言家族)。以一个可能是病态的例子为例:字符串。在C中,字符串是复合类型(字符数组),而在Perl中,字符串是标量。在Java中,字符串是对象(或引用类型)。在Python中,所有内容(概念上)都是对象/引用类型,包括字符串(和数字)。
有很多混淆和误用这些术语。通常一个词被用来代表另一个。以下是这些术语的实际含义。
"Native" 指内置于语言中的类型,而不是由库(即使是标准库)提供的,不管它们如何实现。Perl字符串是Perl语言的一部分,因此在Perl中它们是本地的。C使用库将字符串语义覆盖到指向字符的指针上,因此指向字符是本地的,但字符串不是。
"Atomic" 指不能再分解的类型。它是"composite"的相反。组合可以被拆分成原子值或其他组合的组合。本地整数和浮点数是原子的。分数、复数、容器/集合和字符串是组合的。
"Scalar" - 这是最让人困惑的一个词 - 指能够表示规模(因此得名)的值,例如大小、体积、计数等。整数、浮点数和分数都是标量。复数、布尔值和字符串不是标量。一个原子并不一定是标量,一个标量也不一定是原子。标量可以是本地的,也可以由库提供。
一些类型有奇怪的分类。BigNumber类型通常被实现为数字或整数数组,它们是标量,但它们技术上不是原子的。如果实现被隐藏并且无法访问内部组件,则它们可能表现为原子。但是这些组件只是隐藏的,因此原子性是一种幻觉。它们几乎总是由库提供,因此它们不是本地的,但它们可以是。例如,在Mathematica编程语言中,大数是本地的,并且由于没有办法将它们分解为其构建块,它们在该上下文中也是原子的,尽管在内部(您不再处于Mathematica语言的世界)它们是组合体。
这些定义与所使用的语言无关。
http://ee.hawaii.edu/~tep/EE160/Book/chap5/section2.1.3.html
也许“标量”这个词可能是对C语言的回溯:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1995/N0774.pdf
我想知道这是否指的是这些项目是否会有一个“scale”的值?-比如计数数字。
typeof
运算符或字符串在JSON中的使用方式等方面看出这一点。在Javascript中,如果不考虑null
和undefined
,boolean
、number
和string
是唯一的原始类型。是的,你可以“split”一个字符串并得到两个字符串,但你也可以“spit”一个数字并得到两个数字。有趣的是,数学倾向于将质数视为(整数)数字的真正原始构建块,因为质数除了“1”和它本身外不能被任何东西除尽。 - Stijn de Witt“Scalar”数据类型是指具有一定范围内的可能值,并遵循某种比例尺度,即每个值都可以与其他值进行比较,判断大小或相等。数字(浮点数和整数)很明显属于此类,离散/枚举值也可以被视为标量。在这方面,布尔型是一个只有两个离散可能值的标量,通常情况下true > false。无论编程语言如何,字符串在技术上都不是标量。
现在,“primitive”的定义取决于编程语言。每种语言都会将其“基本类型”分类,并将其指定为原始类型。在JavaScript中,字符串是原始类型,尽管它在一般意义上不是标量。但在某些语言中,字符串并非原始类型。要成为原始类型,语言必须能够将其视为不可变的,并且由于这个原因,引用类型(例如对象、数组、集合)在大多数语言中都不能是原始类型。
空类型是最符合“标量类型”定义的唯一类型。即使将“None”序列化为“N.”,它也适合传统标量类型的16位字或具有多个可能值的单个位--但这并不是“单一数据”。
每个原始类型都是标量,但反之不一定成立。DateTime 是标量,但不是原始类型。