gpt4 book ai didi

javascript - JavaScript 是一种类型安全的语言吗?

转载 作者:行者123 更新时间:2023-12-01 15:49:37 25 4
gpt4 key购买 nike

我读过 JavaScript 不是一种类型安全的语言,但我不确定它的真实性如何。

假设我有以下代码:

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

当我运行此代码时,我收到以下错误:

enter image description here

所以基本上我不允许治疗 int变量作为函数,这不是意味着 JavaScript 是一种类型安全的语言吗?

最佳答案

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

但是类型安全语言试图通过类型强制(在编译/解析阶段和代码运行时)阻止或防止由于使用不正确的类型而导致的错误或不良行为。 JavaScript 大多不这样做(尽管如此);一般来说,JavaScript 倾向于强制转换。

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

console.log("hi there" * 4);


...假设 *不是字符串的定义运算符。 (我相信至少存在一种语言,这将导致 "hi therehi therehi therehi there" )。

但是在 JavaScript 中, *对字符串没有定义的含义。但不是导致错误(在编译/解析阶段或运行时),字符串被隐式转换为数字 n,然后在表达式 n * 4 中使用.对于字符串 "hi there" , 强制结果为 NaN (“不是数字”)而不是导致错误(然后 NaN * 4 也会导致 NaN )。

类型安全语言通常(尽管我并不总是这么认为)具有类型化的变量/参数/属性和类似的,并且至少在编译/解析阶段而不是在相关代码运行时进行一些类型检查。在这些语言中, i会有一个与之关联的类型(例如, int i 而不是 var i ),并且尝试将其作为函数调用的代码将在编译/解析阶段失败,而不是稍后在它运行时失败在 JavaScript 中执行。另一方面,JavaScript 根本没有类型变量/参数/属性。一个变量可以先保存一个对象,然后再保存一个原始数字。

这样做的好处之一是 JavaScript 对鸭子类型很友好(如果它看起来像鸭子,叫起来像鸭子,那就是鸭子)。例如,假设您有一个理论上需要字符串的函数:
function capitalize(str) {
return str.charAt(0).toUpperCase() + str.substring(1);
}

在 JavaScript 中,以下代码调用它:
capitalize(42);

是完全正确的,并且在编译/解析包含该调用的代码时不会引发任何错误。但是在调用代码时会引发错误——不是因为 42 不是字符串(不是,但这不是重点),而是因为 42 没有 charAt方法。

在具有静态类型安全的语言中(例如,编译/解析阶段类型安全),会有与 str 相关的类型信息。参数和错误将是在编译/解析代码时。

但是在 JavaScript 中,它不仅乐于编译/解析该代码,而且乐于在非字符串上运行它,只要您提供的任何内容都符合以下标准:
  • 它有一个 charAt返回带有 toUpperCase 的内容的方法方法和
  • 它有一个 substring方法。

  • 只要你给它一些符合这些标准的东西,不管那个东西是不是一个字符串,它都会起作用。

    function capitalize(str) {
    return str.charAt(0).toUpperCase() + str.substring(1);
    }

    var thingy = {
    charAt: function() {
    return {
    toUpperCase: function() {
    return 40;
    }
    }
    },
    substring: function() {
    return 2;
    }
    };

    console.log(capitalize(thingy)); // 42


    ;-)

    关于javascript - JavaScript 是一种类型安全的语言吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39642923/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com