Considere este código:
var age = 3;
console.log("I'm " + age + " years old!");
Existem outras maneiras de inserir o valor de uma variável em uma string, além da concatenação da string?
javascript
string
string-interpolation
Tom Lehman
fonte
fonte
Show GRAPH of : ${fundCode}-${funcCode}
me pegaShow GRAPH of : AIP001-_sma
(usar acentos graves em torno de corda 1 .... não consigo exibir aqui)Respostas:
Desde o ES6, você pode usar literais de modelo :
PS Observe o uso de acentos graves:
``
.fonte
tl; dr
Use literais de cadeia de modelo do ECMAScript 2015, se aplicável.
Explicação
Não existe uma maneira direta de fazer isso, de acordo com as especificações do ECMAScript 5, mas o ECMAScript 6 possui seqüências de modelos , que também eram conhecidas como quase literais durante a elaboração da especificação. Use-os assim:
Você pode usar qualquer expressão JavaScript válida dentro do
{}
. Por exemplo:A outra coisa importante é que você não precisa mais se preocupar com cadeias de linhas múltiplas. Você pode escrevê-los simplesmente como
Nota: Eu usei o io.js v2.4.0 para avaliar todas as sequências de modelos mostradas acima. Você também pode usar o Chrome mais recente para testar os exemplos mostrados acima.
Nota: As especificações ES6 agora estão finalizadas , mas ainda precisam ser implementadas por todos os principais navegadores.
De acordo com as páginas da Mozilla Developer Network , isso será implementado para suporte básico a partir das seguintes versões: Firefox 34, Chrome 41, Internet Explorer 12. Se você é um usuário do Opera, Safari ou Internet Explorer e está curioso sobre isso agora , essa bancada de testes pode ser usada para brincar até que todos obtenham suporte para isso.
fonte
O Remedial JavaScript de Douglas Crockford inclui uma
String.prototype.supplant
função. É curto, familiar e fácil de usar:Se você não quiser alterar o protótipo de String, sempre poderá adaptá-lo para ser autônomo ou colocá-lo em outro espaço para nome, ou o que for.
fonte
"The {0} says {1}, {1}, {1}!".supplant(['cow', 'moo'])
Palavra de cautela: evite qualquer sistema de modelos que não permita que você escape de seus próprios delimitadores. Por exemplo, não haveria como gerar o seguinte usando o
supplant()
método mencionado aqui.A interpolação simples pode funcionar para pequenos scripts independentes, mas geralmente vem com essa falha de design que limitará qualquer uso sério. Sinceramente, prefiro modelos DOM, como:
E use a manipulação do jQuery:
$('#age').text(3)
Como alternativa, se você simplesmente está cansado da concatenação de strings, sempre há uma sintaxe alternativa:
fonte
Array.join()
é mais lenta que a+
concatenação direta ( estilo), porque os mecanismos do navegador (que incluem V8, que inclui nó e quase tudo que executa o JS hoje) a otimizaram enormemente e há muita diferença a favor da concatenação diretatoken
- assim, desde que você não forneça um objeto de dados que possua umage
membro, tudo bem.supplant
é injustificada:"I am 3 years old thanks to my {age} variable.".supplant({}));
retorna exatamente a sequência especificada. Seage
fosse dado, ainda era possível imprimir{
e}
usar #{{age}}
Experimente a biblioteca sprintf (uma implementação completa do sprintf JavaScript de código aberto). Por exemplo:
vsprintf pega uma matriz de argumentos e retorna uma string formatada.
fonte
Eu uso esse padrão em vários idiomas quando ainda não sei como fazê-lo corretamente e só quero ter uma ideia rapidamente:
Embora não seja particularmente eficiente, acho legível. Sempre funciona, e está sempre disponível:
SEMPRE
fonte
Você poderia usar o sistema de modelos do Prototype se realmente sentir vontade de usar uma marreta para quebrar uma noz:
fonte
Você pode fazer isso facilmente usando o ES6
template string
e transpilar para o ES5 usando qualquer transpilar disponível como o babel.http://www.es6fiddle.net/im3c3euc/
fonte
Experimente o kiwi , um módulo JavaScript leve para interpolação de strings.
Você pode fazer
ou
fonte
Se você deseja interpolar na
console.log
saída, bastaAqui
%s
está o que é chamado de "especificador de formato".console.log
tem esse tipo de suporte de interpolação embutido.fonte
Aqui está uma solução que requer que você forneça um objeto com os valores. Se você não fornecer um objeto como parâmetro, o padrão será usar variáveis globais. Mas é melhor usar o parâmetro, é muito mais limpo.
fonte
eval
,eval
é mau!eval
, mas às vezes não. Por exemplo, se o OP quisesse uma maneira de interpolar usando o escopo atual, sem ter que passar por um objeto de pesquisa (como a interpolação do Groovy funciona), tenho certezaeval
que seria necessário. Não basta recorrer ao antigo "eval is evil".eval
é a única maneira de acessar variáveis locais no escopo . Portanto, não o rejeite apenas porque isso machuca seus sentimentos. BTW, eu também prefiro o caminho alternativo porque é mais seguro, mas oeval
método é o que responde com precisão à pergunta do OP, portanto está na resposta.eval
é que não é possível acessar vars de outro escopo; portanto, se sua.interpolate
chamada estiver dentro de outra função e não global, ela não funcionará.Expandindo a segunda resposta de Greg Kindel , você pode escrever uma função para eliminar parte do padrão:
Uso:
fonte
Eu posso te mostrar um exemplo:
fonte
Desde o ES6, se você deseja fazer uma interpolação de cadeias de caracteres em chaves de objeto, você receberá um
SyntaxError: expected property name, got '${'
se fizer algo como:Você deve fazer o seguinte:
fonte
fonte
O uso da sintaxe do modelo falha em navegadores antigos, importante se você estiver criando HTML para uso público. O uso de concatenação é entediante e difícil de ler, principalmente se você tiver muitas expressões ou longas, ou se precisar usar parênteses para manipular misturas de itens de número e sequência de caracteres (os quais usam o operador +).
O PHP expande strings entre aspas contendo variáveis e até algumas expressões usando uma notação muito compacta:
$a="the color is $color";
Em JavaScript, uma função eficiente pode ser escrita para suportar isso:,
var a=S('the color is ',color);
usando um número variável de argumentos. Embora não haja vantagem sobre a concatenação neste exemplo, quando as expressões ficam mais longas, essa sintaxe pode ficar mais clara. Ou pode-se usar o sinal de cifrão para sinalizar o início de uma expressão usando uma função JavaScript, como no PHP.Por outro lado, escrever uma função de solução eficiente para fornecer expansão de strings de modelo para navegadores mais antigos não seria difícil. Alguém provavelmente já fez isso.
Por fim, imagino que o sprintf (como em C, C ++ e PHP) possa ser escrito em JavaScript, embora seja um pouco menos eficiente do que essas outras soluções.
fonte
Interpolação flexível personalizada:
fonte
Embora os modelos provavelmente sejam os melhores para o caso que você descreve, se você possui ou deseja seus dados e / ou argumentos em forma de iterável / matriz, você pode usá-lo
String.raw
.Com os dados como uma matriz, pode-se usar o operador spread:
fonte
Não foi possível encontrar o que estava procurando e o encontrei -
Se você estiver usando o Node.js, há um
util
pacote interno com uma função de formato que funciona assim:Coincidentemente, agora isso também está incluído
console.log
no Node.js.fonte