Я обнаружил, что некоторые люди называют JavaScript «динамически, слабо типизированным» языком, а некоторые даже говорят «нетипизированным»? Что это на самом деле?
источник
Я обнаружил, что некоторые люди называют JavaScript «динамически, слабо типизированным» языком, а некоторые даже говорят «нетипизированным»? Что это на самом деле?
JavaScript является нетипизированным:
(источник: no.gd )
Так говорит даже Брендан Эйх. В Твиттере он ответил на тему, связанную с этим вопросом:
... академические типы используют "нетипизированный" для обозначения "не статических типов" ...
Проблема в том, что существует несколько разных определений нетипизированного .
В одном из приведенных выше ответов говорилось об одном определении - среда выполнения не маркирует значения, а просто обрабатывает каждое значение как биты. JavaScript делает значения тегов и имеет разное поведение в зависимости от этих тегов. Так что JavaScript явно не подходит под эту категорию.
Другое определение взято из теории языков программирования (академическая вещь, о которой говорит Брендан). В этом домене нетипизированный означает, что все принадлежит одному типу .
Зачем? Потому что язык будет генерировать программу только тогда, когда он сможет доказать, что типы совпадают (также известное как соответствие Карри-Ховарда ; типы - теоремы, программы - доказательства). На нетипизированном языке это означает:
В отличие от типизированного языка:
Итак, в PLT нетипизированный означает просто динамически типизированный, а типизированный - просто статический . JavaScript определенно не относится к этой категории.
Смотрите также:
1. 2. 3.
для нетипизированного языка не соответствует JavaScript. Существует не только один тип - их около 4-5. Итак, как это показывает, что JavaScript нетипизирован?Сильный / слабый можно рассматривать в связи с тем, как компилятор, если применимо, обрабатывает типизацию.
Слабо типизированный означает, что компилятор, если применимо, не обеспечивает правильную типизацию. Без неявного вмешательства компилятора инструкция выдаст ошибку во время выполнения.
Строго типизированный означает, что есть компилятор, и он хочет, чтобы вы явно преобразовали строку в целое число .
В любом случае некоторые функции компилятора могут неявно изменять инструкцию во время компиляции, чтобы выполнять преобразования за вас, если он может определить, что это правильно.
Пока что JavaScript можно отнести к категории несильно типизированных. Это либо означает, что он слабо типизирован или не типизирован.
Динамический / статический можно рассматривать в связи с тем, как языковые инструкции манипулируют типами.
Динамически набрано означаетчто значение типа «s это вынужденное, но переменные просто любое значение любого типа.
Статическая типизация означает, чтотип переменной строго применяется, а тип значения - менее строго.
Пока что JavaScript можно отнести к категории нестатически типизированных. Кроме того, он выглядит динамически типизированным, если вообще набирается. Итак, нам нужно увидеть, что означает набор текста.
Типизированный означает, что язык различает разные типы, такие как строка , число , логическое значение , объект , массив , null , undefined и т. Д. Также каждая операция привязана к определенным типам. Таким образом, вы не можете разделить целое число на строку .
Нетипизированный означает, что операция деления целого числа на строку приведет к обработке первых четырех байтов строки как целого числа . Это связано с тем, что нетипизированные операции выполняются непосредственно с битами, нет типов для наблюдения. Результат будет довольно неожиданным:
Поскольку JavaScript ведет себя в соответствии с определением «Типизированный», он должен быть таким. И поэтому он должен быть динамически типизирован и слабо типизирован.
Если кто-то утверждает, что JavaScript является нетипизированным, то это просто для академической теории, а не для практического применения.
источник
JavaScript слабо типизирован . Он определенно не является «нетипизированным», но его слабо типизированный характер обеспечивает большую гибкость с точки зрения неявных преобразований.
Имейте в виду, что JavaScript также динамически типизируется. Этот метод набора текста позволяет так называемый «утиный ввод» .
Для сравнения учтите, что JavaScript не является строго типизированным и статически типизированным. Иногда понимание того, чем что-то не является, может помочь вам лучше понять, что это такое.
источник
По мнению автора, JavaScript также относится к категории динамически типизированных . Wiki утверждает, что языки с динамической типизацией проверяются типом во время выполнения, а не в компиляторе, в то время как слабая типизация относится к возможности изменять тип на лету в вашем коде. Так что да, это как динамически типизировано, так и слабо типизировано.
источник
Проблема, которая сбивает с толку многих программистов, заключается в том, что подобные определения где-то не стандартизированы. Термин « нетипизированный язык программирования» неоднозначен. Относится ли это к языку, у которого нет типов данных, или к языку, который является нетипизированным вариантом лямбда-исчисления ?
JavaScript / ECMAScript имеет систему типов, и все домены его функций принимают любой ссылочный тип спецификации. Это означает, что в действительности JavaScript имеет единственный тип данных. Это вопрос реализации, который более важен для очень продвинутых программистов JavaScript. Среднестатистического программиста JavaScript интересуют только типы данных абстрактного языка , указанные в ECMAScript.
В контексте обычного программиста, а не исследователя или ученого-теоретика, термин « нетипизированный» - неправильное употребление, потому что большинство людей не используют лямбда-исчисления. Таким образом, этот термин сбивает с толку и, кажется, заявляет, что JavaScript не имеет никаких типов данных, что просто неверно. Любой, кто когда-либо использовал,
typeof
знает, что у JavaScript есть свои типы данных языка:дает
ECMAScript определяет следующие типы для языка:
undefined
,null
,string
,boolean
,number
,object
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
Более точное обозначение для JavaScript было бы неявно типизированным, динамически типизированным или слабо / слабо типизированным (или некоторой их комбинацией), в этом JavaScript в некоторых случаях используется приведение типа, что делает тип неявным, поскольку вам не нужно явно указывать тип тип ваших переменных. Он подпадает под слабо типизированный, потому что, в отличие от некоторых языков, которые различают числа с плавающей запятой, целочисленные и т. Д., Он просто использует один
number
тип, охватывающий все числа, и использует приведение типов, упомянутое ранее [Раздел 9 спецификации ECMAScript] , что сильно контрастирует с строго типизированный язык, который будет иметь очень специфические типы данных (т.е. вам нужно будет указатьint
илиfloat
).Определения языков со статической и динамической типизацией не стандартизированы, однако не был и размер байта, когда компьютеры только начинали развиваться. Статическая и динамическая типизация чаще всего подразумевает наличие определенных языковых функций. Одна из них - проверка типов во время выполнения или так называемая динамическая проверка типов . Если вы использовали JavaScript, вы уже знаете, что он определенно ждет, пока среда выполнения проверяет типы, поэтому вы получаете
TypeError
исключения во время выполнения вашего кода. Пример здесьЯ думаю, что получивший наибольшее количество голосов ответ путает полиморфизм функций JavaScript с функциями, которые принимают буквально все (как с нетипизированными вариантами лямбда-исчисления), что является ошибкой ассоциации .
источник
Помните, что JavaScript позволяет вам спрашивать, что такое
typeof(your_variable)
, и сравнивать типы:5==="5"
возвращаетfalse
. Поэтому я не думаю, что это можно назвать нетипизированным.Он динамически и (оценивается как) слабо типизирован. Возможно, вы захотите узнать, что он использует утиную типизацию (см. Ссылку Эндрю) и предлагает ООП через прототипирование вместо классов и наследования.
источник
String a = "blah";
илиvar a:String = 'blah';
(т.е. типизированные переменные) ВООБЩЕ. Вот почему он не типизирован.Пока он набран (вы можете спросить "typeof someVar" и узнать его конкретный тип, он очень слабый.
Дано:
можно сказать, что a - это строка. Однако если вы затем напишете:
b - это int, равное 15, поэтому a действует так же, как int. Конечно, вы можете написать:
и c будет равно "5Hello World", поэтому a снова действует как строка.
источник
b
равные510
: ideone.com/BRcSW7