\\\";const output = safeHTML`User said: ${userInput}`;console.log(output); // User said:
Prós:
Contras:
O que são WeakMaps e WeakSets?
WeakMaps são coleções de pares de valores-chave onde as chaves são fracamente referenciadas. Isso significa que se não existirem outras referências à chave, a entrada será coletada como lixo.
Problema: Você está construindo um sistema de cache e deseja garantir que, quando os objetos não forem mais necessários, eles sejam automaticamente coletados como lixo para liberar memória.
Exemplo:
let user = { name: \\\"Alice\\\" };const weakCache = new WeakMap();weakCache.set(user, \\\"Cached data\\\");console.log(weakCache.get(user)); // Cached datauser = null; // The entry in weakCache will be garbage collected
Prós:
Contras:
O que é curry?
Currying transforma uma função que recebe vários argumentos em uma sequência de funções, cada uma com um único argumento. É uma técnica de programação funcional que pode aumentar a flexibilidade do código.
Problema: Digamos que você tenha uma função que aplica um desconto com base em uma porcentagem. Você deseja reutilizar esta função com diferentes porcentagens em todo o seu aplicativo.
Exemplo:
const applyDiscount = (discount) => (price) => price - price * (discount / 100);const tenPercentOff = applyDiscount(10);const twentyPercentOff = applyDiscount(20);console.log(tenPercentOff(100)); // 90console.log(twentyPercentOff(100)); // 80
Prós:
Contras:
Cada um desses conceitos avançados de JavaScript - Proxies, Símbolos, Geradores, Literais de Modelo Tagged, WeakMaps e Currying - oferece recursos exclusivos para resolver problemas específicos de maneiras mais eficientes, escalonáveis ou elegantes. No entanto, eles apresentam compensações, como maior complexidade ou possíveis problemas de desempenho.
A principal lição é entender quando e onde usar esses conceitos. Só porque eles existem não significa que você deva usá-los em todos os projetos. Em vez disso, incorpore-os quando eles fornecerem benefícios claros, como melhorar a legibilidade, o desempenho ou a flexibilidade do código.
Ao explorar essas técnicas avançadas, você será capaz de resolver problemas mais sofisticados e escrever JavaScript mais poderoso.
","image":"http://www.luping.net/uploads/20241006/172821096567026815e7a06.jpg","datePublished":"2024-11-08T12:01:22+08:00","dateModified":"2024-11-08T12:01:22+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}JavaScript é uma linguagem que muitos desenvolvedores usam diariamente, mas existem inúmeras joias escondidas em seu ecossistema com as quais até mesmo desenvolvedores experientes podem não estar familiarizados. Este artigo explora alguns conceitos JavaScript menos conhecidos que podem aprimorar significativamente suas habilidades de programação. Abordaremos conceitos como Proxies, Símbolos, Geradores e muito mais, demonstrando cada um com exemplos e resolvendo problemas para ilustrar seu poder.
Ao final, você terá um conhecimento mais profundo de JavaScript e saberá quando (e quando não) usar esses recursos avançados.
O que são proxies?
Um proxy em JavaScript permite interceptar e personalizar operações fundamentais, como pesquisas de propriedades, atribuições e invocações de funções.
Problema: Imagine que você está construindo um sistema onde os usuários têm objetos que rastreiam suas ações. Em vez de modificar todas as partes do seu aplicativo para rastrear o acesso à propriedade, você pode usar um proxy para interceptar e registrar essas ações.
Exemplo:
const user = { name: "Alice", age: 25 }; const handler = { get(target, prop) { console.log(`Property '${prop}' was accessed`); return prop in target ? target[prop] : `Property ${prop} doesn't exist`; }, }; const userProxy = new Proxy(user, handler); console.log(userProxy.name); // Logs: Property 'name' was accessed, Returns: Alice console.log(userProxy.address); // Logs: Property 'address' was accessed, Returns: Property address doesn't exist
Prós:
Contras:
O que são símbolos?
Símbolos são um novo tipo primitivo introduzido no ES6. Eles fornecem chaves exclusivas para propriedades de objetos, tornando-os úteis quando você precisa evitar colisões de nomes de propriedades.
Problema: Digamos que você esteja trabalhando em um objeto que se integra a código de terceiros e deseja adicionar propriedades personalizadas sem substituir suas chaves.
Exemplo:
const uniqueId = Symbol('id'); const user = { [uniqueId]: 123, name: "Alice" }; console.log(user[uniqueId]); // 123 console.log(Object.keys(user)); // ['name'] - Symbol key is hidden from iteration
Prós:
Contras:
O que são geradores?
Geradores são funções que podem ser pausadas e retomadas, o que os torna úteis para gerenciar fluxos assíncronos ou produzir dados sob demanda.
Problema: Suponha que você queira gerar uma sequência de números de Fibonacci. Em vez de gerar a sequência inteira antecipadamente, você pode criar um gerador que produza valores um por um, permitindo uma avaliação lenta.
Exemplo:
function* fibonacci() { let a = 0, b = 1; while (true) { yield a; [a, b] = [b, a b]; } } const fib = fibonacci(); console.log(fib.next().value); // 0 console.log(fib.next().value); // 1 console.log(fib.next().value); // 1 console.log(fib.next().value); // 2
Prós:
Contras:
O que são literais de modelo marcados?
Os modelos marcados permitem processar literais de modelo com uma função, tornando-os incrivelmente poderosos para a construção de DSLs (linguagens específicas de domínio), como bibliotecas CSS-in-JS.
Problema: Você precisa construir um sistema de modelo que processe a entrada do usuário e a limpe para evitar ataques XSS.
Exemplo:
function safeHTML(strings, ...values) { return strings.reduce((acc, str, i) => acc str (values[i] ? escapeHTML(values[i]) : ''), ''); } function escapeHTML(str) { return str.replace(/&/g, "&").replace(/, "<").replace(/>/g, ">"); } const userInput = ""; const output = safeHTML`User said: ${userInput}`; console.log(output); // User said: <script>alert('XSS')</script>
Prós:
Contras:
O que são WeakMaps e WeakSets?
WeakMaps são coleções de pares de valores-chave onde as chaves são fracamente referenciadas. Isso significa que se não existirem outras referências à chave, a entrada será coletada como lixo.
Problema: Você está construindo um sistema de cache e deseja garantir que, quando os objetos não forem mais necessários, eles sejam automaticamente coletados como lixo para liberar memória.
Exemplo:
let user = { name: "Alice" }; const weakCache = new WeakMap(); weakCache.set(user, "Cached data"); console.log(weakCache.get(user)); // Cached data user = null; // The entry in weakCache will be garbage collected
Prós:
Contras:
O que é curry?
Currying transforma uma função que recebe vários argumentos em uma sequência de funções, cada uma com um único argumento. É uma técnica de programação funcional que pode aumentar a flexibilidade do código.
Problema: Digamos que você tenha uma função que aplica um desconto com base em uma porcentagem. Você deseja reutilizar esta função com diferentes porcentagens em todo o seu aplicativo.
Exemplo:
const applyDiscount = (discount) => (price) => price - price * (discount / 100); const tenPercentOff = applyDiscount(10); const twentyPercentOff = applyDiscount(20); console.log(tenPercentOff(100)); // 90 console.log(twentyPercentOff(100)); // 80
Prós:
Contras:
Cada um desses conceitos avançados de JavaScript - Proxies, Símbolos, Geradores, Literais de Modelo Tagged, WeakMaps e Currying - oferece recursos exclusivos para resolver problemas específicos de maneiras mais eficientes, escalonáveis ou elegantes. No entanto, eles apresentam compensações, como maior complexidade ou possíveis problemas de desempenho.
A principal lição é entender quando e onde usar esses conceitos. Só porque eles existem não significa que você deva usá-los em todos os projetos. Em vez disso, incorpore-os quando eles fornecerem benefícios claros, como melhorar a legibilidade, o desempenho ou a flexibilidade do código.
Ao explorar essas técnicas avançadas, você será capaz de resolver problemas mais sofisticados e escrever JavaScript mais poderoso.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3