这个问题与
语义学有关。
如果我给你这个数据:
12
,它的类型是什么?你无法确定。可能是整数,可能是浮点数,也可能是字符串。从这个意义上说,它是非常“无类型”的数据。
如果我给你一种想象中的语言,让你在这个数据和另一个任意的数据上使用“加”、“减”和“连接”等运算符,那么“类型”就有些无关紧要了(对于我的想象语言而言)。例如:可能
add(12, a)
得到的结果是
109
,即
12
加上
a
的ASCII值。
现在来谈谈C语言。C语言几乎让你可以对任意的数据做任何你想做的事情。如果你使用一个需要两个
uint
参数的函数,你可以将任何你想要的东西进行强制转换并传递进去,这些值将被简单地解释为
uint
。从这个意义上说,C是“无类型”的(如果你以这种方式对待它的话)。
然而 - 正如Brendan所说 - 如果我告诉你“My age is
12
”,那么
12
就有了类型 - 至少我们知道它是数字。在
上下文中,无论使用什么语言,一切都有类型。
这就是为什么我一开始就说 - 你的问题涉及语义学。 “未经分类”是什么意思?当他说“没有静态类型”时,我认为Brendan说得很对 - 因为这是唯一可能的含义。人类天生会将事物分类。我们直观地知道汽车和猴子之间有根本性的不同 - 即使从未被教过如何做出这些区分。
回到我一开始的例子 - 一个“不关心类型”(本质上)的语言可能会让您在不产生语法错误的情况下“添加”“年龄”和“姓名”……但这并不意味着这是一个逻辑上合理的操作。
Javascript可能会让您做各种疯狂的事情,而不考虑它们是否为“错误”。这并不意味着你所做的事情在逻辑上是正确的。这是开发人员需要解决的问题。
一个在编译/构建/解释时不强制进行类型安全的系统/语言是“未分类”还是“动态类型”?
语义学。
编辑
我想在这里补充一些内容,因为有些人似乎被卡在了“是的,但Javascript确实有一些“类型””上。
在我的评论中,我说:
在Javascript中,我可以有我已经构建成“猴子”的对象和我已经构建成“人类”的对象,一些函数可以设计成只对“人类”操作,另一些函数只对“猴子”操作,而其他函数只对“有手臂的东西”操作。无论语言是否被告知“有手臂的东西”这样的对象类别与汇编(“未分类”)或Javascript(“动态”)有何关系都是无关紧要的。这完全是逻辑完整性的问题——唯一的错误就是在该方法中使用没有手臂的东西。
因此,如果你认为Javascript在内部具有某种“类型概念”,因此具有“动态类型”,并认为这与“未分类系统”有所不同,那么从上面的例子中可以看出,它在内部具有的任何“类型概念”都是不相关的。
为了在C#中执行相同的操作,例如,我需要一个名为
ICreatureWithArms
或类似名称的接口。但在JavaScript中不需要,在C或ASM中也不需要。
很明显,JavaScript是否理解“类型”是无关紧要的。