首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JS是一种逐步类型化的语言吗?

JS是一种逐步类型化的语言吗?
EN

Software Engineering用户
提问于 2014-06-23 05:39:56
回答 2查看 601关注 0票数 1

我在研究静态类型化和动态类型化的概念,发现有另一种类型系统叫做逐步类型化。

来自维基百科

渐进式类型系统是一种类型系统,可以在编译时(静态类型)或运行时(动态类型)输入变量,允许软件开发人员在一种语言中酌情选择两种类型的范式。尤其是,渐进式类型使用一种名为dynamic的特殊类型来表示静态未知类型,而渐进式类型用一个名为一致性(也称为一致性)的新关系取代了类型相等的概念。(兼容性),它将动态类型与所有其他类型关联起来。一致性关系是对称的,但不是传递的。

如果我正确理解这些概念,"Javascript“是一种逐步类型化的语言。我说的对吗?

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2014-06-23 10:50:29

混合静态和动态类型仍然是一个开放的研究问题,有几种相互竞争的方法,包括但不限于Jeremy Siek的渐进式打字(您提到过)、准静态类型、软类型、混合类型(Flanagan)、可选的静态类型(例如Gilad Bracha)、责怪Calculus (Wadler和Findler)、强制Calculus (Henglein)、合同(Findler和Felleisen)、Manifest合同(Greenberg、still和Weirich)等等。

ECMAScript / JavaScript不是逐步输入的。如果在生产语言(如ECMAScript )中添加仍然是一个开放的研究问题的内容,那将是愚蠢的。语言设计委员会并不是进行前沿研究的地方。

实际上,ECMAScript委员会试图通过在ECMAScript 4…中混合静态和动态类型来进行前沿研究。这是一个惊人的失败。

ECMAScript / JavaScript是动态类型的。没有静态类型,也没有类型注释的语法。

票数 8
EN

Software Engineering用户

发布于 2014-06-24 17:46:21

为了详细说明为什么JavaScript没有逐步类型化,让我们看看C#的另一个方向,它是静态地使用隐式类型输入的。

根据MSDN的说法,C#在2007年发布的3.0版本中引入了var关键字。它只允许在“在方法作用域中声明的变量”上,我称之为局部变量。var关键字并不是动态类型,因为它允许编译器确定声明应该什么类型,但随后将对该变量的所有引用作为给定类型来处理,就像您自己静态声明它一样。

下面是一些如何使用和不能使用它的示例。

代码语言:javascript
复制
class MyClass {
    // Standard member variable
    public string MyName = "Patrick";

    // Illegal declaration - var cannot be used here even though the type may be inferred
    // from the literal definition; compiler throws an error
    private var LuckyNumber = 7;
    // Have to do it like this:
    private int LuckyNumber = 7;

    private MyClass(int luckyNumber) {
         LuckyNumber = luckyNumber;
    }

    public MyClass MyClassFactory(int newLucky) {
         // Legal - myInstance is in the method scope
         var myInstance = new MyClass(newLucky);
         // Not legal - myInstance is not a dynamic type just because we declared it with var
         myInstance = new MyOtherClass();

         // We can return myInstance because its type matches the method signature
         return myInstance;
     }
}

换句话说,C#没有提供一种方法来声明可以容纳任意类型的变量。您能得到的最接近的是多态,其中的赋值仅限于继承树。

注意,与之形成鲜明对比的是,JavaScript将允许MyClassFactory中的非法行。以下内容在JS中是完全合法的:

代码语言:javascript
复制
var foo = "foo";
foo = 1;
foo = 2.0;
foo = new Date();
foo = [];
foo = {};
foo = function() {};

每一行都会更改foo的类型。此外,无法将foo声明为不可更改的类型。

请注意,有一些方法可以将静态类型压缩到JavaScript中,但它们实际上是实际JS代码的包装层,最终会以动态输入方式结束,就好像您是手工编写的一样。事实证明,有比我想象的更多的方法:下面是一个看似全面的语言列表(或者更恰当的语法或解析器),这些语言可以生成JavaScript。。在我的经验中,CoffeeScript是最常见的。

最后,一种语言必须同时提供动态和静态声明,才能被认为是动态类型的。换句话说,必须有一些语法才能做到以下几点:

代码语言:javascript
复制
// Statically typed declaration
Integer myNumber = 3;
// May be legal if the language provides for auto-conversion or dynamic-casting; may
// throw an error. It depends on the language
myNumber = 7.5;

// Static type declaration of an object class
MyParentType instance = new MyParentType();
// legal if MyChildType inherits/extends MyParentType - illegal otherwise
instance = new MyChildType();

// Illegal always - MUST throw an error
instance = new IncompatibleType();

// Dynamic typed declaration
dynamic otherInstance = new MyParentType();
// Legal for variables declared dynamic - MUST NOT throw an error
otherInstance = new IncompatibleType();

注意,正如所演示的那样,C#或JS都不支持这两种类型的变量声明,原因不同。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/245742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档