Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.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_Type Safety - Fatal编程技术网

JavaScript是类型安全语言吗?

JavaScript是类型安全语言吗?,javascript,type-safety,Javascript,Type Safety,我曾读到JavaScript不是类型安全语言,但我不确定这是否正确 假设我有以下代码: <script> var i = 123; // i is an int i(); // treat i as a function (this will produce an error) </script> 变量i=123;//我是一个整数 i();//将i视为函数(这将产生错误) 当我运行此代码时,出现以下错误: 因此,基本上我不允许将int变量视为函

我曾读到JavaScript不是类型安全语言,但我不确定这是否正确

假设我有以下代码:

<script>
    var i = 123;  // i is an int
    i();  // treat i as a function (this will produce an error)
</script>

变量i=123;//我是一个整数
i();//将i视为函数(这将产生错误)
当我运行此代码时,出现以下错误:

因此,基本上我不允许将
int
变量视为函数,这难道不意味着JavaScript是一种类型安全的语言吗?

是一个复杂的话题,对于“类型安全”语言到底是什么还没有一致的定义。但根据几乎所有的定义,不,JavaScript不是类型安全的。:-)不过,在那个特定的例子中,JavaScript确实提供了运行时类型安全性:它实际上没有尝试调用
i
,并导致某种内存访问异常或类似情况;相反,当您的代码试图调用它时,JavaScript引擎所做的第一件事就是检查它是否可调用,因为它不可调用,所以引发了一个保护性错误

但是类型安全语言试图通过类型强制(在编译/解析阶段和代码运行时)阻止或防止由于使用不正确的类型而导致的错误或不希望出现的行为。JavaScript基本上没有做到这一点(尽管如此);一般来说,JavaScript倾向于强制

例如,在类型安全语言中,这可能会失败:


console.log(“你好”*4)但该类型错误发生在运行时,而不是编译时

显然,如果你试着把一个数字当作一个函数来处理,它会在某个时候失败

在一种安全的语言中,它会在编译过程中捕捉到这一点,这样坏代码就永远不会在运行时失败

Javascript(与Java、Ruby、Haskell并列)是一种类型安全语言(而C不是)

另一方面,JavaScript不能保证静态(编译时)类型的安全性,这是不同的(由描述)


简单地说,如果一种语言对任何一段代码都有一个有用的答案,那么它就是类型安全的

免费书说明如下(第4页):

类型安全语言[…]为每个操作指定一个含义,即使该含义只是为了引发异常

您得到的类型错误正是您操作的含义

相比之下,C不是类型安全的(尽管它在编译时检查代码),因为您可以创建这样的情况:它不会抛出异常,而只是执行随机操作。(有关示例,请参见《为什么生锈》一书的第3页和第4页) Javascript中存在的隐式类型强制(例如,将数字
1
转换为字符串
1
进行字符串连接:
1+'2'
)是一种定义良好的操作

《为什么生锈》一书对的定义如下:

如果一个程序的编写使得任何可能的执行都不能表现出未定义的行为,我们就说该程序定义良好

使用定义明确的继续:

如果一种语言的类型系统确保每个程序都定义良好,我们就说该语言是类型安全的

关于类型安全性的说明也很有趣:

注意,类型安全与语言是在编译时检查类型还是在运行时检查类型无关:C在编译时检查类型,而不是类型安全;Python在运行时进行检查,并且是类型安全的。任何实用的类型安全语言在运行时都必须至少进行一些检查(例如数组边界检查)



有点讽刺的是,一本关于生锈的书帮助我更好地理解了Javascript

JS中的类型安全将自动将某些内容转换为适合您的不同类型,例如,
alert('himom'+42)
将输出
himom42
,即使“字符串+整数”在数学上没有意义。整数不是函数,若并没有一个错误表明这一事实,那个么您希望发生什么呢?Javascript具有动态类型安全性,换句话说,它在运行时为某些类型错误引发异常。一般来说,“类型安全语言”是一个用来表示这种验证发生在代码执行之前的术语。看看这个术语,它展示了JS中利用解析规则的一些非常奇怪的行为,从而暴露出缺乏类型安全性。你也可以阅读。你还可以看一看。所以解释语言永远不会是类型安全的,只有编译语言可以?@user4582812:不,解释语言可以是类型安全的。只是与类型相关的错误发生在解析阶段,而不是等待有问题的代码行被执行。在类型安全的解释语言中,如果从未执行该行,仍然会出现错误(在解析期间)。但在非类型安全的解释语言中,如果从未执行该行,则不会出现错误。我假设“解析阶段”是指在执行代码之前检查代码类型错误的阶段。我有一个相关的问题:动态类型语言(一种允许您在运行时更改变量类型的语言)是否可以是类型安全的?@user4582812我认为这是不可能的。假设变量的类型由用户在运行时决定。类型系统如何检查此类代码的安全性?如果必须推断变量可能的每种类型;这甚至不可能在所有情况下都是可行的。这个答案后面的例子很漂亮。这是鸭子打字的一个例子,不是吗?实际类型不重要;只是它符合调用者的标准。你不是在混合静态/动态和强/弱类型的定义吗?Javascript和Python都是动态的。Javascript不是类型安全的(例如,
'1'+2
),而是Pyt