这个问题都是关于语义的
如果我给你这个数据:12
它是什么类型的?你无法确定。可能是整数 - 可能是浮点数 - 可能是字符串。从这个意义上说,它是非常“无类型”的数据。
如果我给你一种想象的语言,它可以让你在这个数据和其他一些任意数据上使用像“add”、“subtract”和“concatenate”这样的运算符,那么“type”就有点不相关(与我想象的语言)(例如: 可能会产生add(12, a)
加上) 的 ascii 值。109
12
a
让我们谈谈C。C 几乎可以让您对任意数据进行任何操作。如果您使用的函数需要两个uint
s - 您可以转换并传递您想要的任何内容 - 并且这些值将简单地解释为uint
s。从这个意义上说,C 是“无类型的”(如果您以这种方式对待它)。
然而——说到布伦丹的观点——如果我告诉你“我的年龄是12
”——那么12
就有一个类型——至少我们知道它是数字的。有了上下文,一切都有一个类型——不管是什么语言。
这就是我一开始说的原因-您的问题是语义问题之一。“无类型”是什么意思?我认为 Brendan 在说“没有静态类型”时一针见血——因为这就是它可能的全部含义。人类自然地将事物分类。我们凭直觉知道汽车和猴子之间存在根本性的不同——我们从来没有被教导要做出这些区别。
回到开头我的例子——一种“不关心类型”(本身)的语言可以让你“添加”一个“年龄”和一个“名字”而不会产生语法错误......但是并不意味着这是一个合乎逻辑的操作。
Javascript 可以让你做各种疯狂的事情而不考虑它们“错误”。这并不意味着你正在做的事情在逻辑上是合理的。那是开发人员解决的问题。
在编译/构建/解释时不强制类型安全的系统/语言是“无类型”还是“动态类型”?
语义。
编辑
我想在这里添加一些东西,因为有些人似乎被“是的,但是 Javascript 确实有一些“类型””所吸引。
在我对别人回答的评论中,我说:
在Javascript中,我可以将对象构建为“猴子”,将对象构建为“人类”,并且可以将某些功能设计为仅对“人类”进行操作,而将其他功能设计为仅对“猴子”进行操作,并且还有一些人只在“带武器的东西”上。无论该语言是否曾被告知存在诸如“带武器的东西”这样的对象类别,它与汇编(“无类型”)和Javascript(“动态”)一样无关紧要。这完全是一个逻辑完整性的问题——唯一的错误是使用没有这种方法的东西。
所以,如果你认为 Javascript 在内部有一些“类型的概念”——因此是“动态类型”——并且认为这在某种程度上“与无类型系统明显不同”——你应该从上面的示例中看到任何“类型的概念”类型”它在内部实际上是无关紧要的。
例如,要使用 C# 执行相同的操作,我需要一个名为ICreatureWithArms
或类似的接口。在 Javascript 中并非如此 - 在 C 或 ASM 中并非如此。
显然,Javascript 是否对“类型”有任何理解是无关紧要的。