Является ли JavaScript нетипизированным языком? - PullRequest
89 голосов
/ 08 июня 2009

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

Ответы [ 7 ]

118 голосов
/ 06 февраля 2012

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

http://no.gd/p/untyped-20120205-235300.jpg

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

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

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

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

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

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

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

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

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

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

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

74 голосов
/ 08 июня 2009

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

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

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

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

    (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.
    

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

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

Типизированный означает, что язык различает различные типы, такие как string , number , boolean , объект , массив , null , undefined и так далее. Также каждая операция связана с конкретными типами. Таким образом, вы не можете разделить integer на string .

    2 / "blah"  // produces NaN

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

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

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

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

44 голосов
/ 08 июня 2009

JavaScript слабо напечатан . Он, безусловно, не является «нетипизированным», но его слабо типизированный характер обеспечивает большую гибкость с точки зрения неявных преобразований.

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

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

7 голосов
/ 08 июня 2009

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

6 голосов
/ 30 мая 2014

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

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

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

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

выходы

"строка"

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

http://www.ecma -international.org / публикации / файлы / ECMA-ST / ECMA-262.pdf

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

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

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

1 голос
/ 08 июня 2009

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

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

0 голосов
/ 08 июня 2009

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

Дано:

  var a = "5";

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

  var b = a + 10;

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

  var c = a + "Hello World";

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...