Supondo que eu declaro
var ad = {};
Como posso verificar se este objeto contém propriedades definidas pelo usuário?
javascript
Ricky
fonte
fonte
Object.keys
seria o mais fácil:var a = [1,2,3];a.something=4;console.log(Object.keys(a))
como ele já faz parte do ECMA 5, é possível reduzi-lo com segurança: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Object.defineProperty(obj, 'foo', {enumerable:false, value:'foo'})
.Você pode usar o
Object.keys
método interno para obter uma lista de chaves em um objeto e testar seu comprimento.fonte
var str = "MyString"; Object.keys(str);
, o console gera 8 teclas, de 0 a 7, para cada caractere. Ou ainda não entendi a resposta.Que tal criar uma função simples?
A
hasOwnProperty
chamada de método diretamente noObject.prototype
é apenas para adicionar um pouco mais de segurança , imagine o seguinte usando umaobj.hasOwnProperty(...)
chamada normal :Nota: (para o futuro) O método acima baseia-se na
for...in
declaração, e esta itera apenas as propriedades enumeráveis , no ECMAScript Standard (3ª edição) atualmente mais implementado atualmente, o programador não tem como criar propriedades não enumeráveis .No entanto, isso mudou agora com o ECMAScript 5th Edition , e somos capazes de criar propriedades não enumeráveis, não graváveis ou não excluídas, para que o método acima possa falhar , por exemplo:
Uma solução ECMAScript 5 para esse problema seria:
O
Object.getOwnPropertyNames
método retorna eArray
contém os nomes de todas as propriedades próprias de um objeto, enumeráveis ou não ; esse método está sendo implementado agora pelos fornecedores de navegadores, já está no Chrome 5 Beta e nas últimas versões do WebKit Nightly Builds.Object.defineProperty
também está disponível nesses navegadores e nas versões mais recentes do Firefox 3.7 Alpha.fonte
hasOwnProperty
propriedade, a função pode falhar ... Eu sei que sou um pouco paranóica ... mas às vezes você não sabe em que tipo de ambiente seu código será usado, mas você sabe o método que deseja usar ...Object.prototype
, ela não será enumerada porfor...in
. EntãoisEmptyObject({toString:1})
vai falhar. Esta é uma das razões infelizes você não pode bastante usamObject
como um mapeamento de uso geral.Com o jQuery você pode usar:
A partir do jQuery 1.4, esse método verifica as propriedades no próprio objeto e as propriedades herdadas dos protótipos (na medida em que ele não usa hasOwnProperty).
Com o ECMAScript 5th Edition em navegadores modernos (IE9 +, FF4 +, Chrome5 +, Opera12 +, Safari5 +), você pode usar o método Object.keys incorporado :
Ou JavaScript antigo simples:
fonte
Os navegadores mais recentes (e node.js) suportam Object.keys (), que retorna uma matriz com todas as chaves no literal do seu objeto, para que você possa fazer o seguinte:
Suporte ao navegador: Firefox 4, Chrome 5, Internet Explorer 9, Opera 12, Safari 5
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
fonte
Se você estiver usando underscore.js, poderá usar a função _.isEmpty :
fonte
_.isEmpty([]) // true
Certifique-se de verificar primeiro: stackoverflow.com/a/22482737/1922747Se você estiver disposto a usar o lodash , poderá usar o
some
métodoVeja este pequeno exemplo de jsbin
fonte
_.some([1, 2]) // true
Certifique-se de verificar primeiro: stackoverflow.com/a/13356338/1922747Se você precisar estar seguro e verificar os protótipos de objetos (eles são adicionados por determinadas bibliotecas e não existem por padrão):
fonte
Membro significa propriedade de membro, variável de membro, como você quiser chamá-lo> _>
O código acima retornará TUDO, incluindo toString ... Se você quiser apenas ver se o protótipo do objeto foi estendido:
Nota A: Verificamos se o membro do objeto fictício tem o mesmo tipo que o membro do objeto de teste. Se for uma extensão, o tipo de membro do dummyobject deve ser "indefinido"
fonte
Simples, funciona em todos os navegadores e, embora tecnicamente seja um loop para todas as chaves do objeto, NÃO repassa todas elas ... ou há 0 e o loop não roda ou há algumas e quebra após a primeira um (porque tudo o que estamos verificando é se há QUALQUER ... então por que continuar?)
fonte
Resposta muito tardia, mas é assim que você pode lidar com isso com protótipos.
fonte
Quando a certeza de que o objeto é definido pelo usuário, a maneira mais fácil de determinar se o UDO está vazio é o seguinte código:
Embora esse método seja (por natureza) dedutivo, é o mais rápido e o mais rápido possível.
ps:! não o use em objetos definidos pelo navegador.
fonte
Resposta tardia, mas algumas estruturas manipulam objetos como enumeráveis. Portanto, o bob.js pode fazer o seguinte:
fonte
Você pode usar o seguinte:
Double bang !! pesquisa de propriedade
hasOwnProperty Isso é algo que eu costumava usar:
No entanto, o JavaScript decidiu não proteger o nome do método, para que pudesse ser adulterado.
prop em myObject
tipo de
No entanto, ele não verifica se há nulo.
Eu acho que esse é o melhor caminho.
no operador
resultado:
Aqui está um link que entra em mais detalhes sobre o operador in: Determinando se existe uma propriedade de objeto
fonte
Função ES6
Exemplos:
fonte
Que tal agora?
fonte