Descobri que algumas pessoas chamam o JavaScript de uma linguagem "dinamicamente e fracamente digitada", mas algumas até dizem "não digitada". Qual é realmente?
fonte
Descobri que algumas pessoas chamam o JavaScript de uma linguagem "dinamicamente e fracamente digitada", mas algumas até dizem "não digitada". Qual é realmente?
JavaScript não está tipificado:
(fonte: no.gd )
Até Brendan Eich diz isso. No Twitter, ele respondeu a um tópico relacionado a esta pergunta:
... tipos acadêmicos usam "sem tipo" para significar "sem tipos estáticos" ...
Portanto, o problema é que existem algumas definições diferentes de não tipado .
Uma definição foi mencionada em uma das respostas acima - o tempo de execução não marca valores e apenas trata cada valor como bits. JavaScript faz valores de tag e tem comportamento diferente com base nessas tags. Portanto, obviamente, o JavaScript não se encaixa nessa categoria.
A outra definição vem da Teoria da Linguagem de Programação (a coisa acadêmica a que Brendan está se referindo). Nesse domínio, sem tipo significa apenas que tudo pertence a um único tipo .
Por quê? Porque uma linguagem só irá gerar um programa quando puder provar que os tipos estão alinhados (também conhecida como a correspondência de Curry-Howard ; tipos são teoremas, programas são provas). Isso significa em uma linguagem não digitada:
Em contraste com uma linguagem digitada:
Então aí está, em PLT, não tipado significa apenas digitado dinamicamente e digitado apenas significa digitado estaticamente . JavaScript definitivamente não é tipificado nesta categoria.
Veja também:
1. 2. 3.
para uma linguagem não digitada não corresponde a JavaScript. Não existe apenas um tipo - existem cerca de 4 - 5. Então, como isso demonstra que o JavaScript não está tipado?forte / fraco pode ser considerado em relação a como o compilador, se aplicável, lida com a digitação.
Tipo fraco significa que o compilador, se aplicável, não impõe a digitação correta. Sem a interjeição implícita do compilador, a instrução apresentará um erro durante o tempo de execução.
Fortemente tipado significa que há um compilador e ele deseja uma conversão explícita de string para inteiro .
Em ambos os casos, alguns recursos do compilador podem alterar implicitamente a instrução durante o tempo de compilação para fazer conversões para você, se puder determinar que é a coisa certa a fazer.
Até agora, o JavaScript pode ser categorizado como Não fortemente tipado. Isso significa que está mal digitado ou não digitado.
dinâmico / estático pode ser pensado em relação a como as instruções de linguagem manipulam tipos.
Digitado dinamicamente significa que otipodo valor é imposto, mas a variável simplesmente representa qualquer valor de qualquer tipo.
Com tipagem estática significa que otipo de variável é fortemente imposto e o tipo de valor é menos imposto.
Até agora, o JavaScript pode ser classificado como Não estático. Além disso, parece ser digitado dinamicamente, se for digitado. Portanto, precisamos ver o que significa digitação.
Digitado significa que a linguagem distingue entre diferentes tipos, como string , número , booleano , objeto , array , nulo , indefinido e assim por diante. Além disso, cada operação está vinculada a tipos específicos. Portanto, você não pode dividir um inteiro por uma string .
Sem tipo significa que a operação de divisão de inteiro por string resultaria no tratamento dos primeiros quatro bytes da string como inteiros . Isso ocorre porque as operações sem tipo ocorrem diretamente nos bits, não há tipos a serem observados. O resultado será algo bastante inesperado:
Visto que o JavaScript se comporta de acordo com a definição de ser digitado, ele deve ser. E, portanto, deve ser digitado dinamicamente e fracamente.
Se alguém afirma que o JavaScript não é tipado, é apenas para teoria acadêmica, não para aplicação prática.
fonte
JavaScript é mal digitado . Certamente não é "sem tipo", mas sua natureza fracamente digitada permite muita flexibilidade em termos de conversões implícitas.
Lembre-se de que o JavaScript também é digitado dinamicamente. Este método de digitação permite o que é conhecido como "digitação de pato" .
Para comparação, considere que o JavaScript não é fortemente tipado nem estático. Às vezes, entender o que algo não é pode ajudá-lo a ver melhor o que é.
fonte
Na opinião do autor, o JavaScript também é classificado como digitado dinamicamente . O Wiki afirma que as linguagens dinamicamente digitadas são verificadas por tipo em tempo de execução, em vez de em um compilador, enquanto a Digitação Fraca refere-se à capacidade de alterar o tipo em tempo real em seu código. Então, sim, ele é digitado dinamicamente E fracamente.
fonte
O problema aqui que está confundindo muitos programadores é que definições como essa não são padronizadas em algum lugar. O termo linguagem de programação sem tipo é ambíguo. Isso se refere a uma linguagem que não possui tipos de dados ou a uma linguagem que é uma variante sem tipo de cálculo lambda ?
JavaScript / ECMAScript tem um sistema de tipos e todos os domínios de suas funções aceitarão qualquer tipo de especificação de referência. Isso significa que o JavaScript tem um único tipo de dados, na realidade. Essa é uma questão de implementação que é mais importante para os programadores JavaScript muito avançados. O programador de JavaScript médio só se preocupa com os tipos de dados da linguagem abstrata que foram especificados pelo ECMAScript.
No contexto do programador cotidiano, não do pesquisador ou cientista da computação teórico, o termo não digitado é um nome impróprio porque a maioria das pessoas não está fazendo cálculo lambda. Assim, o termo confunde as massas e parece declarar que o JavaScript não tem nenhum tipo de dados, o que simplesmente não é verdade. Qualquer pessoa que já usou
typeof
sabe que JavaScript tem seus próprios tipos de dados de linguagem:rendimentos
ECMAScript define os seguintes tipos para o idioma:
undefined
,null
,string
,boolean
,number
,object
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
Uma designação mais precisa para JavaScript seria digitada implicitamente, digitada dinamicamente ou fracamente / vagamente digitada (ou alguma combinação disso), em que JavaScript usa coerção de tipo em alguns casos, o que torna o tipo implícito porque você não tem que especificar explicitamente o tipo de suas variáveis. Ele se enquadra na tipagem fraca porque, ao contrário de algumas linguagens que distinguem entre float e inteiro etc, ele apenas usa um
number
tipo para abranger todos os números e faz uso da coerção de tipo mencionada anteriormente [Seção 9 das especificações ECMAScript] , em forte contraste com um linguagem fortemente tipada que teria tipos de dados muito específicos (ou seja, você teria que especificarint
oufloat
).As definições de linguagens tipadas estaticamente e dinamicamente não são padronizadas, mas o tamanho de um byte também não era normal quando os computadores estavam começando a evoluir. A tipagem estática e dinâmica geralmente se refere à presença de certos recursos de linguagem. Uma delas é a verificação de tipo em tempo de execução , ou o que é chamado de verificação dinâmica de tipo . Se você usou JavaScript, já sabe que ele definitivamente espera até o tempo de execução para verificar os tipos, e é por isso que você obtém
TypeError
exceções durante a execução do seu código. Exemplo aquiAcho que a resposta mais votada está confundindo o polimorfismo das funções JavaScript com funções que aceitarão literalmente qualquer coisa (como as variantes não digitadas do cálculo Lambda), o que é uma falácia de associação .
fonte
Lembre-se de que o JavaScript permite que você pergunte o que é
typeof(your_variable)
e compare os tipos:5==="5"
retornafalse
. Portanto, não acho que você possa chamá-lo de não digitado.Ele é dinamicamente e (estimado como) fracamente digitado. Você pode querer saber que ele usa a digitação Duck (veja o link de Andrew) e oferece OOP por meio de prototipagem em vez de classes e herança.
fonte
String a = "blah";
ouvar a:String = 'blah';
(isto é, variáveis digitadas) AT ALL. É por isso que não foi tipado.Enquanto é digitado (você pode perguntar "typeof someVar" e aprender seu tipo específico, é muito fraco.
Dado:
você pode dizer que a é uma string. No entanto, se você escrever:
b é um int igual a 15, então a agiu exatamente como um int. Claro, você pode escrever:
ec será igual a "5Hello World", então a está agindo novamente como uma string.
fonte
b
iguais510
: ideone.com/BRcSW7