Complementando:
Parâmetros opcionais
No caso de parâmetro opcional, também daria para usar um valor default assim:
function saudacao(nome = 'visitante') {
alert(nome);
}
Só fica um pouco complicado para vários parâmetros. Por exemplo, se todos são opcionais mas eu só quero mudar o segundo:
function saudacao(saudacao = 'Olá', nome = 'visitante') {
alert(`${saudacao}, ${nome}`);
}
// assim ok, usa os valores default
saudacao(); // Olá, visitante
// se quiser mudar só o nome, não dá, pois o primeiro parâmetro sempre é a saudação
saudacao('fulano'); // fulano, visitante
// nesse caso, poderia fazer como vc sugeriu
function saudacao2(saudacao, nome) {
saudacao ||= 'Olá';
nome ||= 'visitante';
alert(`${saudacao}, ${nome}`);
}
// Aí basta passar null para indicar que quero usar o valor default
saudacao2(null, 'fulano'); // Olá, fulano
Ou então usar desestruturação (que fica um pouco mais chato caso precise passar todos os parâmetros, ainda mais se tiver vários; só vale a pena se for mais frequente as chamadas mudando um ou outro):
function saudacao({ saudacao, nome }) {
saudacao ||= 'Olá';
nome ||= 'visitante';
alert(`${saudacao}, ${nome}`);
}
// mudar somente o nome
saudacao({ nome: 'fulano'}); // Olá, fulano
Converter string HTML para elemento
Já para converter string HTML em um elemento, você pode usar o elemento template
. A documentação diz que ele é um "mecanismo para conter HTML que não será renderizado imediatamente na página", ou seja, me parece mais adequado para o caso em questão (fica menos com cara de "gambiarra", na minha opinião):
function evalHTML(string) {
let template = document.createElement("template");
template.innerHTML = string;
return template.content.children[0];
}
O retorno acaba sendo igual à sua função, mas acho que a semântica fica mais adequada, já que um elemento qualquer (a
, div
) poderia deixar ligeiramente mais confuso ("por que tá usando um link?", etc).
Iteráveis e for..of
Sobre iteráveis e for..of
, vale lembrar que também se aplica a strings:
const texto = 'abc 123';
// itera pelos caracteres da string
for (const caractere of texto) {
console.log(caractere);
}
Lembrando que isso pode dar diferença com o for
tradicional, dependendo do conteúdo da string:
// sim, posso colocar um emoji direto no código
const texto = '💩';
// ou, se seu editor não suporta, pode trocar por
// const texto = String.fromCodePoint(0x1f4a9);
console.log('iterando com for..of');
for (const caractere of texto) {
console.log(caractere);
}
console.log('iterando com for tradicional');
for (let i = 0; i < texto.length; i++) {
console.log(texto[i]);
}
A saída é:
iterando com for..of
💩
iterando com for tradicional
�
�
Caso tenha ficado curioso, a explicação está aqui.
Iterar por objeto
Para iterar as chaves e valores de um objeto, também pode usar Object.entries
, que já te dá as chaves e valores ao mesmo tempo:
let objeto = {
'chave 1': 42,
'chave 2': 3.14,
'chave 3': 9.8,
}
for (const [chave, valor] of Object.entries(objeto)) {
console.log(`${chave} = ${valor}`);
}
Saída:
chave 1 = 42
chave 2 = 3.14
chave 3 = 9.8