JavaScript是一种非类型化的语言吗?

2022-08-30 05:31:50

我发现有些人称JavaScript为“动态的,弱类型”的语言,但有些人甚至说“非类型化”?它到底是什么?


答案 1

JavaScript 非类型化的:


(资料来源:no.gd

就连布伦丹·艾希(Brendan Eich)也是这么说的。在Twitter上,他回复了一个与这个问题相关的帖子:

...学术类型使用“非类型化”来表示“无静态类型”...

所以问题在于,非类型化有几种不同的定义。

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

另一个定义来自编程语言理论(Brendan所指的学术事物)。在此域中,未键入仅表示所有内容都属于单个类型

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

  1. 始终生成程序
  2. 因此,类型始终匹配
  3. 因此,只能有一种类型

与类型化语言相比:

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

所以你去了,在PLT中,非类型化只是意味着动态类型化,而类型化只是意味着静态类型化。JavaScript在这个类别中绝对是非类型化的。

另请参阅:


答案 2

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

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

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

    强类型意味着有一个编译器,它希望你从字符串显式转换为整数

    (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可以被归类为非静态类型。此外,它似乎是动态类型的,如果根本就是类型化的。因此,我们需要了解类型的含义。

类型化意味着语言区分不同类型的类型,如字符串数字布尔值对象数组null未定义等。此外,每个操作都绑定到特定类型。因此,不能将整数除以字符串

    2 / "blah"  // produces NaN

非类型化意味着将整数除以字符串的操作将导致将字符串的前四个字节视为整数。这是因为非类型化操作直接在位上发生,没有要观察的类型。结果将是一些非常出乎意料的事情:

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

由于JavaScript的行为符合类型化的定义,因此它必须如此。因此,它必须是动态类型和弱类型。

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