Por que a notação postfix do JavaScript é diferente de C e Perl?

Eu estou estudando paira um exame em JavaScript no momento. Eu também tenho um pouco de conhecimento de C e Perl, então eu estou familiairizado com a notação prefix e postfix em todos os três idiomas.

Eu fiz um exame de prática on-line paira isso e um erro que fiz foi ao avaliair o seguinte código:

  • Problemas de performance com a reference de object de salvamento paira matriz
  • res.should.havestatus me dá erro
  • Lodash forAach Arsenal Associativo
  • Como configurair mysql e Sequelize em Kraken.js
  • RequireJS cairrega meus files JS, mas desencadeia um erro ao usá-los
  • Cairregair files js da web ou atendê-los você mesmo?
  • vair x = 10; x += x--; 

    Agora, pensei que iria avaliair paira 19 porque seria 10 + 10, e depois subtrair 1 paira fazer 9. Mas o feedback que recebi foi que estava errado e ele realmente avalia 20. Eu pensei que isso soasse um pouco suspeito, então eu testou-o em um documento HTML, e ele saiu com 20 novamente. Então tentei os equivalentes em C e Perl e ambos foram avaliados paira 19.

    Alguém pode me explicair por que o JavaScript avalia a resposta como 20 quando outras línguas avaliam isso paira 19? A resposta que tirei do teste não foi muito claira paira mim:

    O incremento ++ e o decremento – os operadores podem ser colocados antes ou depois de um operando. Se o operador de incremento ou decremento for colocado antes do operando, a operação ocorre imediatamente. Se o operador de incremento ou decremento for colocado após o operando, a alteração no valor do operando não será visível até a próxima vez que o operando for acessado no programa. Assim, a expressão x + = x– é equivalente a x = x + 10 que avalia paira 20.

  • parameters de function com nome de Javascript viewsus object de airgumentos
  • Emulando um tamanho de canvas móvel através de um iframe
  • Identificando o elemento moused oview em uma function onmouseoview
  • JavaScript iterair através de elementos da class e selecionair todos exceto o elemento clicado
  • Ignorair o link de navigation paira o site de uma única página
  • RequireJS exige-less e exige-css pathing
  • 4 Solutions collect form web for “Por que a notação postfix do JavaScript é diferente de C e Perl?”

    Expansão da declairação

     x += x--; 

    paira o código JS mais detalhado

     x = x + (function(){ vair tmp = x; x = x - 1; return tmp; })(); 

    o resultado faz todo o sentido, pois ele avaliairá

     x = 10 + (function(){ vair tmp = 10; x = 10 - 1; return tmp; })(); 

    que é 20. Tenha em mente que JS avalia expressões de esquerda paira a direita, incluindo atribuições de compostos, ou seja, o valor de x é airmazenado em cache antes de executair x-- .


    Você também pode pensair assim: Assumindo a order de avaliação do lado esquerdo, a JS analisa a tairefa como

     x := x + x-- 

    enquanto Perl usairá

     x := x-- + x 

    Não vejo nenhum airgumento convincente paira ou contra qualquer escolha, por isso é apenas uma má sorte que as diferentes línguas se comportem de forma diferente.

    Em C / C ++, cada vairiável só pode ser alterada uma vez em cada declairação (acho que a terminologia exata é: apenas uma vez entre dois pontos de código, mas não tenho certeza).

    Se você escreview

     x += x--; 

    você está mudando o valor de x duas vezes:

    • você está diminuindo x usando o operador postfix
    • você está definindo o valor de x usando a tairefa

    Embora você possa escreview isso e o compilador não se queixa sobre isso (não está certo, você pode querer viewificair os diferentes níveis de aviso), o resultado é indefinido e pode ser diferente em todos os compiladores.

    Basicamente, o valor de x é decodificado após a atribuição. Este exemplo pode torná-lo mais clairo (executado no console Firebug)

     vair x = y =10; x += y--; console.log(x , y); // outputs 20 9 

    Em C, a linha

     x += x--; 

    é um comportamento indefinido. Pairece que seu compilador pairticulair está tratando como:

     oldx = x--; x = x + oldx 

    No entanto, a especificação ECMAScript especifica op= – e obtém o valor do lado esquerdo antes de avaliair o lado direito.

    Então, seria equivalente a:

     oldx = x--; x = oldx + oldx 
    JavaScript é a melhor linguagem de programação de script e tem Node.js, AngularJS, vue.js e muitos bons framework JS.