Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript是非类型化语言吗?_Javascript_Types - Fatal编程技术网

JavaScript是非类型化语言吗?

JavaScript是非类型化语言吗?,javascript,types,Javascript,Types,我发现有些人把JavaScript称为“动态的、弱类型的”语言,但有些人甚至说“非类型的”?它到底是什么?JavaScript是。它当然不是“非类型化”的,但它的弱类型特性允许在隐式转换方面有很大的灵活性 请记住,JavaScript也是动态类型的。这种打字方法允许所谓的 比较一下,认为JavaScript不是,也不是有时理解什么是不可以帮助你更好地了解它是什么。Wiki指出,动态类型语言在运行时而不是在编译器中进行类型检查,而弱类型语言指的是在代码中动态更改类型的能力。因此,是的,它同时是动态

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

JavaScript是。它当然不是“非类型化”的,但它的弱类型特性允许在隐式转换方面有很大的灵活性

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


比较一下,认为JavaScript不是,也不是有时理解什么是不可以帮助你更好地了解它是什么。Wiki指出,动态类型语言在运行时而不是在编译器中进行类型检查,而弱类型语言指的是在代码中动态更改类型的能力。因此,是的,它同时是动态类型和弱类型。

强/弱可以根据编译器如何处理类型(如果适用)来考虑

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

    "12345" * 1 === 12345  // string * number => number
    
    强类型意味着有一个编译器,它希望您将字符串显式转换为整数

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

    到目前为止,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"  // will be treated as  2 / 1500275048
由于JavaScript的行为是根据被类型化的定义进行的,所以它必须是。因此它必须是动态类型的,并且是弱类型的

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

虽然它是类型化的(你可以问“typeof someVar”并了解它的具体类型,但它非常弱

鉴于:

  var a = "5";
您可能会说a是字符串。但是,如果您随后编写:

  var b = a + 10;
  var c = a + "Hello World";
b是一个等于15的整数,所以a的作用就像一个整数。当然,你可以这样写:

  var b = a + 10;
  var c = a + "Hello World";

c将等于“5Hello World”,因此a再次像字符串一样工作。

请记住,JavaScript允许您询问(您的_变量)的
类型,并比较类型:
5==“5”
返回
false
。 因此,我认为你不能称之为非类型化

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

JavaScript是非类型化的:


(来源:)

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

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

在上面的一个答案中讨论了一个定义-运行时不标记值,只将每个值作为位处理。JavaScript标记值,并基于这些标记具有不同的行为。因此JavaScript显然不适合这一类别

另一个定义来自编程语言理论(Brendan所指的学术事物)。在这个领域中,非类型化只是指

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

  • 程序总是生成的
  • 因此类型总是匹配的
  • 因此,必须只有一种类型
  • 与键入的语言相比:

  • 可能无法生成程序
  • 因为类型可能不匹配
  • 因为一个程序可以包含多种类型
  • 在PLT中,非类型化只是指动态类型,类型化只是指静态类型。JavaScript在这一类中绝对是非类型的

    另见:


    让许多程序员困惑的问题是,类似这样的定义在某些地方没有标准化。术语非类型化编程语言是不明确的。这是指没有数据类型的语言还是指lambda演算非类型化变体的语言

    JavaScript/ECMAScript有一个类型系统,其所有函数的域都将接受任何引用规范类型。因此,实际上,这意味着JavaScript只有一种数据类型。这是一个对非常高级的JavaScript程序员来说更重要的实现问题。一般的JavaScript程序员只关心关于ECMAScript指定的摘要

    在日常程序员的语境中,而不是研究人员或理论计算机科学家的语境中,非类型化的术语是m
    var test = "this is text";
    typeof(test);