Является ли JavaScript нетипизированным языком?

Я обнаружил, что некоторые люди называют JavaScript "динамически, слабо типизированным" языком, но некоторые даже говорят "нетипизированные"? Что это на самом деле?

Ответ 1

JavaScript без :


(источник: no.gd)

Даже Брендан Эйч так говорит. В Твиттере он ответил на ветку, которая ссылалась на этот вопрос:

... академические типы используют "нетипизированный" для обозначения "нет статических типов"...

Так что проблема в том, что есть несколько разных определений нетипизированных.

В одном из вышеприведенных ответов говорилось об одном определении - среда выполнения не помечает значения, а просто обрабатывает каждое значение как биты. JavaScript делает значения тегов и имеет различное поведение в зависимости от этих тегов. Так что JavaScript явно не подходит под эту категорию.

Другое определение взято из Теории языка программирования (академическая вещь, на которую ссылается Брендан). В этом домене нетипизированный означает только то, что все принадлежит одному типу.

Почему? Поскольку язык генерирует программу только тогда, когда он может доказать, что типы совпадают (a.k.a. соответствие Карри-Говарда; типы - это теоремы, программы - это доказательства). Это означает, что нетипизированный язык:

  1. Программа всегда генерируется
  2. Поэтому типы всегда совпадают
  3. Поэтому должен быть только один тип

В отличие от типизированного языка:

  1. Программа не может быть сгенерирована
  2. Потому что типы могут не совпадать
  3. Поскольку программа может содержать несколько типов

Итак, в PLT нетипизированный означает просто динамически типизированный, а типизированный означает статически типизированный. JavaScript определенно нетипизирован в этой категории.

Смотрите также:

Ответ 2

сильный/слабый можно рассматривать в отношении того, как компилятор, если применимо, обрабатывает ввод.

  • Слабо напечатанный означает, что компилятор, если применимо, не обеспечивает правильную типизацию. Без неявного смешения компилятора команда будет ошибкой во время выполнения.

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

    Сильно напечатанный означает, что есть компилятор, и он хочет, чтобы явное преобразование из строки в целое.

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

    В любом случае некоторые функции компилятора могут неявно изменять инструкцию во время компиляции, чтобы сделать для вас конверсии, если она может определить, что это правильно делать.

    До сих пор JavaScript можно было классифицировать как не-сильно-типизированный. Это либо означает, что он слабо типизирован или не типизирован.

динамический/статический можно рассматривать в отношении того, как языковые инструкции манипулируют типами.

  • Динамически типизированный означает, что тип value применяется, но переменная просто представляет любое значение любого типа.

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

    Статически типизированный означает, что тип variable строго принудительно применяется, а тип значения менее принудительно.

    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 можно было классифицировать как нестатистически типизированный. Кроме того, он, как представляется, динамически типизирован, если набирается вообще. Таким образом, нам нужно понять, что означает Typing.

Typed означает, что язык различает различные типы, такие как строка, число, логическое значение, объект, массив, null, undefined и т.д. Также каждая операция привязана к определенным типам. Таким образом, вы не можете разделить целое число на строку.

    2 / "blah"  // produces NaN

Untyped означает, что операция деления целых чисел на строку приведет к обработке первых четырех байтов строки как целого. Это связано с тем, что операции Untyped выполняются непосредственно на битах, нет типов для наблюдения. Результат будет чем-то совершенно неожиданным:

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

Так как JavaScript ведет себя в соответствии с определением Typed, он должен быть. И поэтому он должен быть динамически типизирован и слабо типизирован.

Если кто-то утверждает, что JavaScript является Untyped, это просто для академической теории, а не для практического применения.

Ответ 3

JavaScript слабо типизирован. Это, безусловно, не "нетипизировано", но его слабо типизированная природа допускает большую гибкость в плане неявных преобразований.

Имейте в виду, что JavaScript также динамически типизирован. Этот метод ввода позволяет узнать, что известно как "duck typing" .

Для сравнения рассмотрим, что JavaScript не является строго типизированным и не является static набирается. Иногда понимание того, что что-то не так, может помочь вам лучше понять, что это такое.

Ответ 4

К автору. JavaScript также классифицируется как Динамически типизированный. Wiki заявляет, что динамически типизированные языки проверяются по типу во время выполнения, а не в компиляторе, в то время как Weakly Typed - это способность изменять тип "на лету" внутри вашего кода. Так что да, это как динамически типизированный, так и слабый.

Ответ 5

Проблема здесь в том, что запутывает много программистов, так это то, что такие определения не стандартизированы где-то. Термин нетипизированный язык программирования неоднозначен. Это относится к языку, у которого нет типов данных или языка, который является лямбда-исчислением нетипизированного варианта?

JavaScript/ECMAScript имеет систему типа, и все ее домены функций будут принимать любой тип спецификации Reference. Таким образом, на самом деле JavaScript имеет один тип данных. Это вопрос реализации, который более важен для очень продвинутых программистов JavaScript. Средний программист JavaScript заботится только об абстрактных языковых типах данных, которые были указаны ECMAScript.

В контексте повседневного программиста, а не исследователя или теоретического компьютерного ученого термин нетипизированный является неправильным, потому что большинство людей не делают лямбда-исчисление. Таким образом, этот термин смущает массы и, как представляется, заявляет, что JavaScript не имеет каких-либо типов данных, которые просто не соответствуют действительности. Любой, кто когда-либо использовал typeof, знает, что JavaScript имеет свои собственные типы данных языка:

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

дает

"строка"

ECMAScript определяет следующие типы для языка: undefined, null, string, boolean, number, object

http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

Более точное обозначение для JavaScript будет неявно напечатано, динамически напечатано или слабо/слабо напечатано (или какая-либо их комбинация), в том, что JavaScript использует тип принуждения в некоторых случаях, что делает тип неявным, потому что вам не нужно явно указывать тип переменных. Он попадает под слабо типизированный, потому что, в отличие от некоторых языков, которые различают float и integer и т.д., Он просто использует один тип number для охвата всех чисел и использует упомянутое ранее упомянутое ранее ограничение типа [Раздел 9 спецификации ECMAScript] в отличие от строго типизированного языка, который имел бы очень специфичные типы данных (т.е. вам нужно было бы указать int или float).

Определения статически и динамически типизированных языков не стандартизированы, однако ни один размер байта, когда компьютеры не начали развиваться. Статическая и динамическая типизация чаще всего относится к наличию определенных функций языка. Одним из них является проверка типов во время выполнения или то, что называется динамический тип проверяющий. Если вы использовали JavaScript, вы уже знаете, что он определенно ждет, пока среда выполнения не проверит типы, поэтому вы получаете исключения TypeError во время выполнения вашего кода. Пример здесь

Я думаю, что голосовой ответ вводит в заблуждение полиморфизм функций JavaScript с функциями, которые будут воспринимать буквально что угодно (как с нетипизированными вариантами Lambda Calculus), который является Association Fallacy.

Ответ 6

Пока он напечатан (вы можете спросить "typeof someVar" и узнать его конкретный тип, он очень слаб.

Дано:

  var a = "5";

вы можете сказать, что a - это строка. Однако, если вы затем напишите:

  var b = a + 10;

b - int, равное 15, поэтому действует как int. Конечно, вы можете написать:

  var c = a + "Hello World";

и c будет равно "5Hello World", поэтому a снова действует как строка.

Ответ 7

Помните, что JavaScript позволяет задать тип typeof(your_variable) и сравнить типы: 5==="5" возвращает false. Таким образом, я не думаю, что вы можете назвать его нетипизированным.

Он динамически и (оценивается как) слабо типизирован. Возможно, вам захочется узнать, что использует Duck typing (см. Ссылку andrew) и предлагает OOP, хотя "Прототипирование" вместо классов и наследования.