Descobri que algumas pessoas chamam o JavaScript de uma linguagem "dinamicamente e fracamente digitada", mas algumas até dizem "não digitada". Qual é realmente?
Descobri que algumas pessoas chamam o JavaScript de uma linguagem "dinamicamente e fracamente digitada", mas algumas até dizem "não digitada". Qual é realmente?
Respostas:
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.
"12345" * 1 === 12345 // string * number => number
Fortemente tipado significa que há um compilador e ele deseja uma conversão explícita de string para inteiro .
(int) "12345" * 1 === 12345
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.
x = 12345; // number
x = "string"; // string
x = { key: "value" }; // object
y = 123 + x; // error or implicit conversion must take place.
Com tipagem estática significa que otipo de variável é fortemente imposto e o tipo de valor é menos imposto.
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.
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 .
2 / "blah" // produces NaN
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:
2 / "blah" // will be treated as 2 / 1500275048
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.
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 é.
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.
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:
var test = "this is text";
typeof(test);
rendimentos
"corda"
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 especificar int
ou float
).
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 aqui
Acho 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 .
Lembre-se de que o JavaScript permite que você pergunte o que é typeof(your_variable)
e compare os tipos: 5==="5"
retorna false
. 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.
String a = "blah";
ou var 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:
var a = "5";
você pode dizer que a é uma string. No entanto, se você escrever:
var b = a + 10;
b é um int igual a 15, então a agiu exatamente como um int. Claro, você pode escrever:
var c = a + "Hello World";
ec será igual a "5Hello World", então a está agindo novamente como uma string.