JavaScript是一种无types的语言吗?

我发现有些人把JavaScript称为“dynamic的,弱types的”语言,但有些人甚至会说“无types”? 这是真的吗?

JavaScript 无types的:

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

甚至Brendan Eich也这么说。 在Twitter上,他回答了一个与这个问题相关的话题:

学术types使用“无types”来表示“没有静态types”…

所以问题是没有任何types的定义。

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

另一个定义来自编程语言理论 (Brendan所指的学术性东西)。 在这个领域, 无types意味着一切都属于单一types 。

为什么? 因为一种语言只能在certificatetypesalignment(也就是咖喱霍华德对应 ;types是定理,程序是certificate)时才会生成一个程序。 这意味着以一种无types的语言:

  1. 程序总是生成
  2. 因此types总是匹配
  3. 因此只能有一种types

与types语言相反:

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

所以,在PLT中, 无types意味着dynamictypes化input只是静态types化的 。 在这个类别中,JavaScript绝对是无types的。

也可以看看:

  • 在讨论types系统之前应该知道些什么
  • 在学术CS世界中,“无types”是否也意味着“dynamictypes”?

强弱 可以被认为是关于如何编译器,如果适用,处理打字。

  • 弱types意味着编译器,如果适用的话,不强制正确的input。 没有隐含的编译器插入,指令将在运行时错误。

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

    强types意味着有一个编译器,它希望你显式的从string转换整数

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

    在这两种情况下,如果编译器的function可以确定是正确的,那么在编译期间,某些编译器的function可以隐式地改变指令来为你做转换。

    到目前为止,JavaScript可以分类为非强types。 这意味着它是弱打字或不打字。

dynamic/静态 可以被认为与语言指令如何操纵types有关。

  • dynamictypes意味着的types是强制的,但variables只是表示任何types的任何值。

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

    静态types意味着variablestypes被强制执行,而值types更less执行。

     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可以分类为非静态types。 此外,它似乎是dynamictypes,如果打字。 所以我们需要看看打字的意思。

Typed表示语言区分不同types,如string数字布尔值对象数组空值未定义等等。 另外每个操作都绑定到特定的types。 所以你不能用一个string来分割一个整数

  2 / "blah" // produces NaN 

Untyped表示按string分割整数的操作会导致将string的前四个字节视为整数 。 这是因为非types化操作直接发生在位上,没有types可以观察。 结果将是非常意外的事情:

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

由于JavaScript的行为是按照被定义的types定义的,所以它必须是。 因此它必须是dynamicinput和弱input。

如果有人声称JavaScript是非types的,那仅仅是为了学术理论,而不是为了实际应用。

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

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

为了比较,可以考虑JavaScript不是强types的,也不是静态types的。 有时候了解什么不是什么可以帮助你更好地了解它是什么。

作者的观点JavaScript也被分类为dynamictypes 。 Wiki指出dynamictypes语言是在运行时而不是在编译器中进行types检查的,而弱types则是指在代码中dynamic改变types的能力。 所以是的,它是dynamicinput和弱types。

这里很多程序员混淆的问题是这样的定义在某个地方是不规范的。 术语无types的编程语言是不明确的。 这是否指的是没有数据types的语言或者是lambda微积分无types变体的语言?

JavaScript / ECMAScript有一个types系统 ,其所有函数的域将接受任何引用规范types。 这意味着JavaScript实际上只有一种数据types。 对于非常先进的JavaScript程序员来说,这是一个实施问题。 一般的JavaScript程序员只关心ECMAScript指定的抽象 语言数据types 。

在日常程序员而不是研究人员或理论计算机科学家的背景下,“ 无types”这个术语是一个误称,因为大多数人没有进行lambda演算。 因此,这个词混淆了群众,似乎宣称JavaScript没有任何数据types,这是不正确的。 任何曾经使用typeof人都知道JavaScript有自己的语言数据types:

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

产量

“串”

ECMAScript为语言定义了以下types: undefinednullstringbooleannumberobject

publications/files/ECMA-ST/Ecma-2622.html

对JavaScript的更准确的定义是隐式types,dynamictypes或弱/松散types(或其组合),因为JavaScript在某些情况下使用types强制 ,这使得types隐式,因为您不必显式指定你的variables的types。 它属于弱types,因为与区分浮点和整数等的一些语言不同,它只是使用一个numbertypes来包含所有数字,并且使用前面提到的types强制[ECMAScript Spec第9节] ,与一个强types的语言,将有非常具体的数据types(即你将不得不指定intfloat )。

静态和dynamictypes语言的定义不是标准化的,但是当计算机开始发展时,字节的大小也不是。 静态和dynamicinput通常指的是某些语言function的存在。 其中之一就是在运行时进行types检查 ,或称为dynamictypes检查 。 如果您使用过JavaScript,那么您已经知道它在运行时肯定会等待检查types,这就是为什么在执行代码的过程中出现TypeErrorexception的原因。 这里的例子

我认为最受赞赏的答案是将JavaScript函数的多态性与接受字面上任何事情的函数混淆在一起(与Lambda微积分的无types变体一样),这是一种关联谬误 。

请记住,JavaScript允许您询问什么是typeof(your_variable) ,并比较types: 5==="5"返回false 。 所以我不认为你可以称之为无types的。

它是dynamic的(估计为)弱types。 你可能想知道它使用Duck打字(见andrew的链接),并提供OOP,但通过原型,而不是类和inheritance。

虽然它是键入(你可以问“打字someVar”,并了解其具体types,这是非常薄弱的​​。

鉴于:

  var a = "5"; 

你可能会说a是一个string。 但是,如果你这样写:

  var b = a + 10; 

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

  var c = a + "Hello World"; 

c将等于“5Hello World”,所以a又是一个string。