Parece haver uma enorme aversão à criação de uma função em JS. Essa aversão faz com que as pessoas tentem ser inteligentes e usar truques ridículos apenas para manter as coisas em uma linha, como uma chamada de função teria sido. Obviamente, o nome da função em uma chamada também funciona como documentação extra. Não podemos anexar um comentário a uma expressão complicada, porque isso seria derrotado, então nós o chamamos de "js idiom" e, de repente, é compreensível.
Javascript é extremamente acessível, a maioria das pessoas não come especificações para o café da manhã como nós. Portanto, eles nunca entenderão quais são as suposições ocultas e os casos extremos de um idioma.
x = x || 'default_value';
O joe médio não entende isso ou memorizou que é o idioma para o valor padrão. Ambos são prejudiciais, na verdade, o último é ainda mais prejudicial. Ele não entenderá as suposições e casos extremos aqui. Ele não se importará de ler a especificação e entendê-la sempre.
Quando eu olho para que o código eu ver "se é null
ou undefined
, então configurá-lo para esse valor padrão. Embora também irá tratar implicitamente +0
, -0
, NaN
, false
, e ""
valores como não adequados. Vou ter que lembrar que 3 meses a partir de agora, quando que as necessidades mudar. Provavelmente esquecerei. "
É extremamente provável que a suposição implícita cause um erro no futuro e, quando sua base de código estiver cheia de truques como esse, não haverá chance de você mantê-los todos em sua mente sempre que estiver pensando sobre o que uma modificação afetará. E isso é para o "JS pro", o joe médio teria escrito o bug, mesmo que os requisitos aceitassem um valor falso, para começar.
Seu novo snippet tem uma sintaxe mais familiar, mas ainda tem o problema acima.
Você pode ir com:
function f(x) {
x = valueOrDefault(x, "default_value");
}
Agora você pode ter uma lógica muito complexa para lidar com casos extremos e o código do cliente ainda parece bonito e legível.
Agora, como você diferencia o recurso de linguagem avançada, como passar uma função como argumento ou como um truque inteligente || "default"
?
Truques inteligentes estão sempre operando sob algumas suposições ocultas que podem ser ignoradas quando o código foi criado inicialmente. Eu nunca terei que modificar um IIFE para outra coisa porque um requisito mudou, ele sempre estará lá. Talvez em 2020 quando eu possa usar módulos reais, mas sim.
| 0
ou a versão de culto à carga ~~num
usada para pisos assume limites inteiros positivos e assinados de 32 bits.
|| "default"
assume que todos os valores falsos são iguais a não passar um argumento.
E assim por diante.