JavaScript 是一种无类型语言吗?

IT技术 javascript types
2021-01-11 18:32:28

我发现有些人称 JavaScript 为“动态、弱类型”的语言,但有些人甚至说“无类型”?哪个是真的?

6个回答

JavaScript无类型的:


(来源:no.gd

甚至 Brendan Eich 也这么说。在 Twitter 上,他回复了与此问题相关的线程:

...学术类型使用“无类型”来表示“没有静态类型”...

所以问题是untyped有几个不同的定义

在上述答案之一中已经讨论了一个定义 - 运行时不标记值,只是将每个值视为位。JavaScript标记值并根据这些标记具有不同的行为。所以 JavaScript 显然不适合这个类别。

另一个定义来自编程语言理论(Brendan 所指的学术内容)。在这个领域,无类型只是意味着一切都属于单一类型

为什么?因为一种语言只有在可以证明类型对齐时才会生成程序(又名Curry-Howard 对应关系;类型是定理,程序是证明)。这意味着在无类型语言中:

  1. 总是生成一个程序
  2. 因此类型总是匹配
  3. 因此必须只有一种类型

与类型化语言相反:

  1. 可能不会生成程序
  2. 因为类型可能不匹配
  3. 因为一个程序可以包含多种类型

所以你去了,在 PLT 中,无类型只是意味着动态类型类型只是意味着静态类型JavaScript 在此类别中绝对是无类型的。

也可以看看:

我很高兴看到这个答案引用了Harper 的博客文章,但如果 PLT 社区放弃“untyped”而支持“unityped”,那就太好了。“无类型”的定义意味着“只是位”实际上是有道理的。使用“无类型”来描述一种语言,其正式规范使用“类型”一词并说它有七种类型(未定义、空、数字、字符串、布尔、符号和对象),这真的很令人困惑。大多数人不想将这种类型的概念与 PLT 定义区分开来。
2021-03-12 18:32:28
编程语言理论是正确的。巨幅截图不正确。
2021-03-17 18:32:28
1. 2. 3.的无类型语言与 JavaScript 不匹配。没有只有一个类型-大约有4 - 5。那么,如何演示JavaScript是无类型?
2021-03-28 18:32:28
当然,“无静态类型”也不等同于“无类型声明”。
2021-04-03 18:32:28
+1。您也许还应该在答案中链接这种“弱类型”的 bs 太普遍了。
2021-04-05 18:32:28

强/弱 可以被认为与编译器如何处理类型有关(如果适用)。

  • 弱类型意味着编译器(如果适用)不会强制执行正确的类型。如果没有隐式编译器插入,指令将在运行时出错。

    "12345" * 1 === 12345  // string * number => number
    

    强类型意味着有一个编译器,它需要你从stringinteger的显式转换

    (int) "12345" * 1 === 12345
    

    在任何一种情况下,某些编译器的功能都可以在编译时隐式更改指令,以便为您进行转换,前提是它可以确定这是正确的做法。

    到目前为止,JavaScript 可以归类为非强类型。这要么意味着它是弱类型的或非类型的。

动态/静态 可以被认为与语言指令如何操作类型有关。

  • 动态类型意味着强制执行的类型,但变量仅表示任何类型的任何值。

    x = 12345;    // number
    x = "string"; // string
    x = { key: "value" }; // object
    y = 123 + x; // error or implicit conversion must take place.
    

    静态类型意味着变量类型是强强制的,而值类型是不那么强制的。

    int x = 12345; // binds x to the type int
    x = "string";  // too late, x is an integer - error
    string y = 123; // error or implicit conversion must take place.
    

    到目前为止,JavaScript 可以归类为非静态类型。此外,它似乎是动态类型的,如果有输入的话。所以我们需要看看打字是什么意思。

Typed意味着语言区分不同的类型,例如string number boolean object array null undefined等。此外,每个操作都绑定到特定类型。因此,您不能将整数除以字符串

    2 / "blah"  // produces NaN

无类型的装置分割的操作整数将导致在治疗的头四个字节的字符串作为整数这是因为无类型操作直接在位上进行,没有要观察的类型。结果将是非常出乎意料的:

    2 / "blah"  // will be treated as  2 / 1500275048

由于 JavaScript 根据类型化的定义运行,因此必须如此。因此它必须是动态类型和弱类型的。

如果有人声称 JavaScript 是无类型的,那只是为了学术理论,而不是为了实际应用。

@skurpur:您已经完全交换了动态和弱类型的含义 - 更正了这一点。
2021-03-12 18:32:28
如果您有更好的定义/描述,请随时对其进行编辑。这就是我将其设为社区维基的原因。
2021-03-19 18:32:28
-1. 你需要阅读这个
2021-03-21 18:32:28
但我认为最后一句话有矛盾。在 JavaScript 中,整数字符串除法的结果是明确定义的,对于整数或字符串的任何值。它只是不是很有用!
2021-04-01 18:32:28
哦,对不起,你编辑了它为什么我也在编辑它并且我覆盖了你的更改。
2021-04-08 18:32:28

JavaScript 是弱类型的它肯定不是“无类型的”,但其弱类型的性质允许在隐式转换方面具有很大的灵活性。

请记住,JavaScript 也是动态类型的。这种打字方法允许所谓的“鸭子打字”

为了进行比较,请考虑 JavaScript 不是强类型的,也不是静态类型的。 有时,了解某物不是什么可以帮助您更好地了解它是什么。

这个答案比投票最高的答案要好得多,也更准确。
2021-03-24 18:32:28
@Suamere - 这是O'Reilly 的“Javascript:权威指南”中的一段话“JavaScript 与 Java 和 C 等语言之间的一个重要区别是 JavaScript 是无类型的。这在某种程度上意味着,JavaScript 变量可以保存任何数据类型的值,这与 Java 或 C 变量不同,后者只能保存为其声明的一种特定类型的数据。”
2021-03-30 18:32:28
-1. 你需要阅读这个
2021-04-04 18:32:28
@JimboJonny:不正确。除非有汇编开发人员在场,否则声明每种语言都是类型化的也不会太不正确。无类型意味着唯一的操作是直接进行位操作。但是考虑到 Javascript 有 toString() 和 parseInt() 方法。不要输入更多。
2021-04-07 18:32:28
因此,如果您相信某些人声称学术界人士故意使用“无类型”一词来表示“动态类型”的 BS。那么是的,您的所有证明都未对 JavaScript 进行类型化。但是,如果您知道“无类型”被错误地用于表示真正“动态类型”的语言,那么只需将 dang 语言称为“动态类型”即可。tinyurl.com/czhcv54
2021-04-09 18:32:28

在作者看来,JavaScript 也被归类为Dynamically typedWiki 指出动态类型语言在运行时而不是在编译器中进行类型检查,而弱类型是指在代码中动态更改类型的能力。所以是的,它既是动态类型又是弱类型。

这里让很多程序员感到困惑的问题是,像这样的定义在某处没有标准化。术语无类型编程语言是模棱两可的。那是指没有数据类型的语言还是 lambda 演算无类型变体的语言

JavaScript/ECMAScript 有一个类型系统,它的所有函数域都可以接受任何引用规范类型。所以这意味着 JavaScript 实际上只有一种数据类型。这是一个对非常高级的 JavaScript 程序员来说更重要的实现问题。一般的 JavaScript 程序员只关心ECMAScript 已经指定抽象 语言数据类型

在日常程序员的上下文中,而不是研究人员或理论计算机科学家,术语无类型是用词不当,因为大多数人不做 lambda 演算。因此,这个术语混淆了大众,似乎在声明 JavaScript 没有任何数据类型,这根本不是真的。任何使用过的人都typeof知道 JavaScript 有自己的语言数据类型:

var test = "this is text";
typeof(test);

产量

“string”

ECMAScript 为语言定义了以下类型:undefined, null, string, boolean, number,object

http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

对 JavaScript 更准确的指定是隐式类型化、动态类型化或弱/松散类型化(或它们的某种组合),因为 JavaScript在某些情况下使用类型强制,这使得类型隐式,因为您不必显式指定你的变量类型。它属于弱类型,因为与一些区分浮点数和整数等的语言不同,它只使用一种number类型来包含所有数字,并使用前面提到的类型强制转换[ECMAScript Spec 的第 9 节],与 a具有非常特定数据类型的强类型语言(即您必须指定intfloat)。

静态和动态类型语言的定义没有标准化,但是当计算机开始发展时,字节的大小也没有标准化。静态和动态类型通常是指某些语言功能的存在。其中之一是在运行时进行类型检查,或称为动态类型检查如果您使用过 JavaScript,您就会知道它肯定会等到运行时才检查类型,这就是您TypeError在代码执行期间遇到异常的原因示例在这里

我认为最高投票的答案是将JavaScript 函数的多态性与实际上可以接受任何东西(如 Lambda 微积分的无类型变体)的函数混淆,这是一种关联谬误

不知道为什么你觉得参考我以前的答案而不是在这里重复它是“无耻的”。另外,我清楚地说过上下文很重要。与 K. Rudolph 的抱怨相反,文献中对“类型系统”有完全一致且被广泛接受的定义,我引用了一个。当然,您可以随意地在您的上下文中发现它们令人困惑,但这并不会使它们“用词不当”。
2021-03-14 18:32:28
@AndreasRossberg 这绝对用词不当。您在无耻的自我宣传链接中所指的是一个类型系统。该术语用词不当的原因是因为它含糊不清。大多数程序员在听到无类型语言认为是数据类型而不是类型系统我认为Konrad Rudoph 的评论确实说明了这一点。
2021-03-27 18:32:28
@AndreasRossberg 上下文在这里非常重要。最高投票的答案是“无类型 = 无类型声明”,这显然是不正确的。在这种情况下,我要说的是用词不当。没有人在这里提到 lambda 演算,在这个简单的例子中这样做有点自命不凡。
2021-04-07 18:32:28
这不是用词不当,但上下文很重要,请参阅stackoverflow.com/questions/9154388/...
2021-04-08 18:32:28