JavaScript是一种无类型语言吗?

时间:2009-06-08 13:25:01

标签: javascript types

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

9 个答案:

答案 0 :(得分:119)

JavaScript 无类型:

http://no.gd/p/untyped-20120205-235300.jpg

甚至Brendan Eich也这么说。在推特上,他回复了一个与这个问题相关的主题:

  

... academic types use "untyped" to mean "no static types"...

所以问题是无类型有几个不同的定义。

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

另一个定义来自编程语言理论(Brendan所指的学术事物)。在此域中,无类型仅表示everything belongs to a single type

为什么呢?因为语言只能在证明类型对齐时生成一个程序(a.k.a。the Curry-Howard correspondence;类型是定理,程序是证明)。这意味着使用无类型语言:

  1. 程序始终生成
  2. 因此始终匹配
  3. 因此,必须只有一个类型
  4. 与输入语言形成对比:

    1. 因为类型可能匹配
    2. 因为程序可以包含多个类型
    3. 所以你去,在PLT中,无类型只是意味着动态类型类型只是意味着静态类型 。 JavaScript在此类别中绝对是无类型的。

      另见:

答案 1 :(得分:72)

强弱/ 可以与编译器(如果适用)如何处理输入相关联。

  • Weakly typed表示编译器(如果适用)不强制执行正确的键入。如果没有隐式编译器插入,则指令在运行时会出错。

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

    强类型 表示有一个编译器,它需要您从 string integer 的显式强制转换

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

    在任何一种情况下,一些编译器的功能可以在编译时隐式地改变指令,为你做转换,如果它可以确定这是正确的事情。

    到目前为止,JavaScript可以归类为Not-Strongly-Typed。这或者意味着它是弱类型或非类型的。

动态/静态 可以与语言指令如何操纵类型相关联。

  • Dynamically typed表示强制执行的类型,但该变量只表示任何类型的任何值。

    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 < / em>, array null undefined 等等。此外,每个操作都绑定到特定类型。所以你不能用字符串来划分整数

    2 / "blah"  // produces NaN

无法输入 表示将整数除以 string 的操作会导致处理<的前四个字节< em> string 整数。这是因为Untyped操作直接在位上发生,没有可观察的类型。结果将是非常意外的:

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

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

如果有人声称JavaScript是Untyped,那它仅仅是学术理论,而不是实际应用。

答案 2 :(得分:44)

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

请记住,JavaScript也是动态类型的。这种打字方法允许所谓的"duck typing"

为了进行比较,请考虑JavaScript不是strongly typed,也不是statically typed.有时理解不是的内容可以帮助您更好地了解它是什么。

答案 3 :(得分:7)

作者要点JavaScript也被归类为Dynamically typed。 Wiki声明动态类型语言在运行时而不是在编译器中进行类型检查,而Weakly Typed指的是在代码中动态更改类型的能力。所以它是动态类型和弱类型。

答案 4 :(得分:6)

这里令许多程序员感到困惑的问题是,这样的定义在某处并未标准化。术语无类型编程语言是不明确的。这是指没有数据类型的语言还是lambda演算语言无类型变体

JavaScript / ECMAScript有一个类型系统及其所有功能&#39;域将接受任何参考规范类型。这意味着JavaScript实际上只有一种数据类型。这是一个实现问题,对于非常高级的JavaScript程序员来说更为重要。普通的JavaScript程序员只关心ECMAScript指定的 abstract language data types

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

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

产量

  

&#34;串&#34;

ECMAScript为该语言定义了以下类型:undefinednullstringbooleannumberobject

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

JavaScript的更准确的名称将被隐式输入,动态类型或弱/松散类型(或其某种组合),因为JavaScript在某些情况下使用type coercion,这使得类型隐含,因为你不# 39; t必须明确指定变量的类型。它属于弱类型,因为与一些区分float和integer等的语言不同,它只使用一个number类型来包含所有数字,并使用前面提到的类型强制 [Section 9 of ECMAScript Spec] ,与具有非常特定数据类型的强类型语言形成鲜明对比(即您必须指定intfloat)。

静态和动态类型语言的定义不是标准化的,但是当计算机开始发展时,字节的大小也不是。静态和动态类型通常是指某些语言功能的存在。其中一个是type-checking at runtime,或称为dynamic type-checking。如果您已经使用过JavaScript,那么您已经知道它一直等​​到运行时检查类型,这就是为什么在执行代码期间会出现TypeError异常的原因。 Example here

我认为最高投票的答案让JavaScript functions' polymorphism混淆了几乎可以接受任何事物的函数(与Lambda微积分的无类型变体一样)Association Fallacy

答案 5 :(得分:1)

请记住,JavaScript允许您询问typeof(your_variable)是什么,并比较类型:5==="5"返回false。 因此,我认为你不能称之为无类型。

它是动态的(估计为)弱类型。 您可能想知道它使用Duck类型(请参阅andrew的链接)并提供OOP Prototyping而不是类和继承。

答案 6 :(得分:0)

虽然它是键入的(你可以问“typeof someVar”并了解它的特定类型,但它非常弱。

假设:

  var a = "5";

你可能会说a是一个字符串。但是,如果你那么写:

  var b = a + 10;

b是一个等于15的int,所以一个行为就像一个int。当然,你可以写:

  var c = a + "Hello World";

和c将等于“5Hello World”,所以a再次表现得像一个字符串。

答案 7 :(得分:0)

我认为 JavaScript 是强类型和动态类型的。

但这取决于一堆似乎充其量只是松散定义的术语,因此只有当您接受以下定义时,上述内容才正确......

强/弱

  • “强”类型可防止针对一种类型的数据执行的操作在另一种类型上执行。例如,尝试写入数组的第 Nth 个元素,其中对象不是数组。内存安全需要强类型。
  • “弱”是强的反义词。

静态/动态

  • “静态”类型在程序执行之前(在编译/转译时)检查类型。这需要将类型信息编码到语言的语法中。
  • “动态”是静态的对立面。

JavaScript 不会让您破坏内存(因此是“强”),但会在运行时执行所有检查和类型转换/强制(因此是“动态”)。


我发现将“强 vs 弱”视为与“静态 vs 动态”正交是有帮助的。有些语言是强而静态的(例如,没有 unsafe 上下文的 C#)、强而动态的(大多数“脚本”语言似乎都属于这一类)、弱和静态(C/C++)。

不确定什么是弱和动态的...汇编程序,也许:)

答案 8 :(得分:-1)

另一个有趣的松散类型 JS 示例:

console.log(typeof(typeof(5)))

结果是字符串。为什么?因为初始 typeof 结果是 'integer',它本身就是一个字符串。我会假设在强类型语言中,这种类型的变化不会是一回事。也许我错了,但那是我开始了解 CRAZY JS 可以是怎样的第一个实例,哈哈