关于javascript:ruby强烈还是弱类型?

Is ruby strongly or weakly typed?

Ruby是强类型还是弱类型?

对于javascript来说,可能也是如此。


Ruby是"强类型"。

强类型化是指在对对象执行要求某种类型的操作之前检查对象的类型(不是OOP意义上的,而是一般意义上的)。

弱类型意味着不执行任何检查以确保对对象的操作可以成功。(例如,当函数访问类似字符串和浮点数组时,如果不进行类型检查,则允许该操作)

编辑:这个答案发布已经6年了,我认为它需要一些额外的澄清:

多年来,"类型安全是表盘而不是绝对的"这一概念开始被用来支持二进制含义(是/否)。

与大多数典型的动态语言相比,Ruby具有更强的类型(带有"er")。Ruby需要显式语句来进行转换,例如:array("foo"),"42"。对于_i,float(23),Ruby类型的拨号比"弱类型"更接近"强类型"的频谱末端。

所以我会说"Ruby是一种比大多数常用的动态语言更强的类型化动态语言"


wikpedia将其标记为"动态(‘duck’)类型"。

关于波普关于它是"强类型"的评论,我不确定他的解释是否与封面下面的内容相符。MRI并不真正"检查"是否可以对一个对象执行操作;它只是将消息发送给该对象,如果该对象不接受该消息(通过方法声明或通过在缺少方法的情况下处理该消息),它就会死机。如果实际检查运行时以确保操作是可能的,那么丢失的方法将无法工作。

另外,应该注意的是,因为Ruby中的所有内容都是一个对象(我的意思是所有内容),所以我不确定他所说的"不从OO意义上讲"是否准确。在Ruby中,您要么是对象,要么是消息。


虽然你可以讨论这些术语的定义,但我想说:

Ruby动态强类型化,而JavaScript动态弱类型化。


imho ruby是强但动态类型的。


我认为这些语言都是鸭式的。


我只是偶然发现了这条旧线,但认为我可以提出我的意见是恰当的。(不,我不是"劫持"僵尸线。)

我对"强类型"一词的口语解释具体地说是"编译时"(这是当今许多语言,包括Ruby,"根本没有的东西")。

例如,一个简单的赋值语句,如a = b;可以由编译器根据它对ab的"类型"的评估以及程序员提供的类型转换(如果适用)的规定来判断是否可以接受。如果该语句被判定为不可接受,则会抛出编译时错误,并且不会生成"可执行文件"。

当然,这个概念与诸如ruby、php、perl、javascript等语言的基本设计规则,或当今使用非常广泛(并且非常成功)的许多其他语言不兼容。(提醒你,我不是说这是对他们的"判决"。它们就是它们的样子,它们确实把培根带回家了。)

因为这些语言没有"编译时间",我的(!)它们不能被称为"强类型",它们必须在运行时做出决策,而根据它们的设计,这些决策是不可能很快做出的。


(另外,请注意,为了提前捕获更多的错误,我特别排除了针对该语言或该语言出现的各种"lint"工具。这些是非常有用的,是的,但不是同一件事。)

(我也有意排除各种优秀的!!)以各种目标语言生成源代码的工具…出于同样的原因。)

而且——我再说一遍——我正在进行分类,而不是判断。


过度简化的答案是ruby和javascript都是弱类型的。

然而,这个问题并不像看上去那么清晰——请参阅维基百科的这篇文章,更深入地讨论强类型语言和弱类型语言之间的区别。