Tenho uma função que escrevi que basicamente se parece com isto:
function getNextCard(searchTerms) {
// Setup Some Variables
// Do a bunch of logic to pick the next card based on termed passed through what I'll call here as 'searchTerms' all of this logic is omitted because it's not important for my question.
// ...
// If we find a next card to give, than give it
if (nextCardFound)
return nextCardFound;
// Otherwise - I'm returning undefined
return undefined;
}
Pergunta: Seria melhor retornar "nulo" aqui?
Posso devolver o que quiser - obviamente ... Só não tinha certeza de qual é a melhor coisa a usar.
O código que chama esta função sabe como lidar com indefinidos (na verdade, nunca realmente acontecerá, a menos que algo dê terrivelmente errado)
Estou fazendo essa pergunta porque ouvi em algum lugar algo que soou como "Não atribua variáveis indefinidas a variáveis" ou algo assim - que tornará mais difícil depurar. Portanto, o fato de que eu posso ver que null
é passado de volta me diz que o retorno está funcionando - mas basicamente funciona de forma semelhante a undefined
.
Documentação:
Mozilla Docs não respondeu minha pergunta ... o google também não: \
Esta pergunta SO - era muito ampla para o que estou tentando descobrir aqui.
null
. Deixeundefined
para o próprio JavaScript. No entanto, não há "melhor", então isso é uma questão de opinião.null
como "não há valor apropriado para o que você está pedindo" eundefined
como "Não consigo descobrir o que você está pedindo".Respostas:
Eu argumentarei que não existe a melhor maneira, e mesmo as funções padrão às vezes escolhem um ou outro.
Por exemplo:
[[Protótipo]]
Objetos comuns têm um slot interno [[Prototype]], que determina de qual outro objeto eles herdam. Claro, deve haver uma maneira de dizer que um objeto não herda de nenhum outro. Nesse caso, "esse objeto não existe" é representado por
null
.Object.getOwnPropertyDescriptor
Espera-se retornar um descritor de propriedade, ou seja, um objeto que descreve uma propriedade (por exemplo, valor, capacidade de escrita, enumerabilidade e configurabilidade). No entanto, a propriedade pode não existir. Nesse caso, "essa propriedade não existe" é representado por
undefined
.document.getElementById
Espera-se que ele retorne o elemento com o ID fornecido. No entanto, pode não haver nenhum elemento com esse ID. Nesse caso, "esse elemento não existe" é representado por
null
.Portanto, escolha o que você preferir ou achar que faz mais sentido para o seu caso específico.
fonte
void 0
técnica para futuros leitores desta resposta. Eu também adicionei alguns códigos para tentar deixar seu ponto mais claro. Obrigado pela sua resposta!Indefinido normalmente se refere a algo ao qual ainda não foi atribuído um valor (ainda). Nulo se refere a algo que definitivamente não tem valor. Nesse caso, eu recomendaria retornar um valor nulo. Observe que uma função sem valor de retorno especificado retorna implicitamente indefinido.
Da especificação ECMAScript2015
http://www.ecma-international.org/ecma-262/6.0/#sec-terms-and-definitions-undefined-type
Leitura adicional:
Quando é nulo ou indefinido usado em JavaScript?
fonte
var x=someFunc();
, estou atribuindo intencionalmente um valor xa e preferiria que ele não passasse em nenhum teste que indique que não foi (ou pode não ter) sido atribuído um valor. Just imhonull
), desde que você fique com um, mas ter 2 valores para indicar ausência de valor (seja qual for o "tipo") é sempre confusoDarei a você minha maneira opinativa de escolher entre os dois.
Minha pergunta simples é: o valor, dado outra entrada / estado / contexto, pode ser definido para algo?
Se a resposta for sim, use
null
else useundefined
. Mais geralmente, qualquer função que retorna um objeto deve retornarnull
quando o objeto pretendido não existe. Porque poderia existir dado outra entrada / estado / contexto.null
representa a ausência de valor para uma determinada entrada / estado / contexto. Significa implicitamente que o conceito do próprio valor existe no contexto de seu aplicativo, mas pode estar ausente. Em seu exemplo, o conceito de uma próxima carta existe, mas a própria carta pode não existir.null
deve ser usado.undefined
representa implicitamente a ausência de significado desse valor no contexto do seu aplicativo. Por exemplo, se eu manipular umuser
objeto com um determinado conjunto de propriedades e tentar acessar a propriedadepikatchu
. O valor dessa propriedade deve ser definido comoundefined
porque, em meu contexto, não faz sentido ter tal propriedade.fonte
null
, enquanto as funções com efeitos colaterais devem retornarundefined
, ao pensar como um programador funcional.undefined
não é algo que você deva atribuir. Você pode querer retornar algo diferente deundefined
. No seu caso, mesmo que você não retorne nada, o resultadoundefined
já será . Então, eu sugiro ir comnull
.Considere esta amostra,
function getSomething() { // .. do something return undefined; } function doSomething() { // .. I'm not gonna return anything. } var a = getSomething(); var b = doSomething();
Resultado da amostra acima em
a === b
, que éundefined
. A diferença é que você salva 1 execução de instrução.fonte
undefined
não precisa ser atribuído. Todas as variáveis declaradas sem valores já sãoundefined
.(function(){ /* code */ })()
retorna null em um console.undefined
no meu console Chrome e Firefox.undefined
se algo não retornar antes - eu não preciso porque o comportamento padrão da função se você não retorna nada é retornar indefinido - eles estão apenas dizendo que isso não é necessário. Além disso ... gostei do que você disse sobre as funções getter integradas que retornam null. Por favor, poste sua resposta para esse efeito e eu a aceitarei.Depende do que você precisa fazer com o valor retornado.
typeof null retorna um objeto. esse objeto tem um valor de indefinido
typeof undefined retorna undefined
fonte
typeof
não retorna necessariamente o tipo de dados verdadeiro de um valor, ele tem um mapa que mapeia os tipos de dados para rótulos e retorna o rótulo correspondente.typeof
, apesar do nome não diz o tipo de um valor.Aqui está um exemplo onde
undefined
faz mais sentido do quenull
:Eu uso uma função de wrapper para
JSON.parse
converter sua exceção emundefined
:// parses s as JSON if possible and returns undefined otherwise // return undefined iff s is not a string or not parseable as JSON; undefined is not a valid JSON value https://stackoverflow.com/a/14946821/524504 function JSON_parse_or_undefined(s) { if ("string" !== typeof s) return undefined try { const p = JSON.parse(s) return p } catch (x){} return undefined }
Observe que
null
é válido em JSON, enquantoundefined
não é.fonte
let getStringOrJSON = value => { try { value = JSON.parse(value); } catch(e) { return value; } return value; };
. Agora, tenho certeza de que as duas devoluções podem ser tratadas de forma diferente e podem não vencer a competição de golfe JS. Funciona.A primeira resposta está certa. Eles têm significados teoricamente diferentes. No entanto, nem sempre está claro qual escolher.
Eu tendo a usar null no meu desenvolvimento, embora eu ache que isso seja uma coisa completamente subjetiva.
Eu uso isso principalmente porque:
variável indefinida pode ser substituída em navegadores antigos, portanto, devolvê-la é um pouco mais complicado. Esse mesmo problema o força a usar
typeof var === 'undefined'
ao obter resultados de funções. ligaçãoOutras linguagens tendem a usar null amplamente, muitas delas nem mesmo têm undefined (php por exemplo). Isso me dá um tipo de consistência ao alternar rapidamente entre os idiomas.
fonte
Eu acho que é muito discutível o que usar. Eu prefiro um código que seja semanticamente o mais preciso possível, então acho que
undefined
é apropriado neste caso.Eu penso em
null
atribuições como significando "uma variável definida para nada". Isso é o oposto deundefined
significar "essa coisa não está lá"Como uma resposta anterior apontou, retornar
undefined
tem problemas e você decide se isso o incomoda. Isso não me incomodaria.fonte
document.getElementById('iDoNotExist')
retornanull
, mesmo que o significado esteja mais próximo de "essa coisa não está lá de jeito nenhum". Se os métodos padrão fazem isso, por que não o OP?Eu diria que, neste caso,
null
deve ser devolvido.Se você considerar a questão de um ponto de vista teórico da ciência da computação, undefined é usado para indicar não terminação / não computabilidade (isto é, o espaço reservado para um ponto indefinido
x
de uma função parcialf
que é freqüentemente escritaf(x) = ⊥
).getNextCard
no entanto, parece ser capaz de calcular a próxima carta (se houver) e também ser capaz de calcular se não houver uma próxima carta. Em outras palavras, a função é total, pois termina para cada entrada.Dito isto, é necessária uma terminação de sinalização de valor especial sem resultado significativo (ou seja, "não há cartão que eu possa retornar para esta entrada") e isso para mim
null
não éundefined
.NOTAS:
Você pode ver algum suporte para esse argumento em algumas outras linguagens tipadas, bem como onde a terminação sem resultado significativo é expressa usando um tipo de opção (às vezes também referido como tipo anulável ). Um exemplo disso é Maybe in Haskell .
Por outro lado, é claro que não sabemos o que
undefined
em JavaScript realmente significa. Então, a analogia com indefinido é um pouco tênue. Além disso, como sempre queremos trabalhar com funções totais, isso equivale a dizer "nunca retorneundefined
de uma função". O que parece ser um pouco estrito, pois limitaria o uso deundefined
propriedades / variáveis que não foram definidas.No final, minha preferência pessoal é nunca mais voltar
undefined
aonde eu possa voltarnull
e eu também argumentaria que essa é a melhor convenção de codificação (porque, entre outras coisas,x !== null
é mais curta do quetypeof x !== 'undefined'
).fonte
Minha opinião pessoal de acordo com minha experiência é não use undefined e null se você não quiser travar seu código. Pelo menos eu o evitaria pessoalmente. Existem muitas funções em Javascript que retornam indefinidas e ok devemos usar para isso. Mas quando você projetar seu código, não o use. É importante sempre devolver algo,
"false"
pelo menos. Se você tem um array, por exemplo, e mapeia sobre ele. Não é bom voltar[undefined, undefined.....]
nem justoundefined
. É melhor se você mantiver o tipo do array original. Exemplo:const mapper:Map <string[],boolean[]> ['i', 'dont', 'use', 'null or undefined'] -> [false, true, false, true, false] or ['', dont, '', '', use] or al the stuff above and then filter(v => v) that will keep all undefined and null out
Essa é a ideia. Eu tento o tempo todo evitar isso. Porque um
null
ouundefined
pode facilmente travar seu códigofonte