2016-01-05 10 views
5

Devo menzionare: conosco un po 'JavaScript ma non ci sto molto a fondo.Rilevamento proprietà: utilizzo di "in" rispetto al tentativo di accesso alla proprietà

considerato sempre questo il modo corretto per verificare se una proprietà è disponibile su un oggetto:

if (window.console) { 
    // doSomething 
} 

Ieri ho visto il codice in cui è stata utilizzata questa tecnica:

if ('console' in window) { 
    // doSomething 
} 

Sono entrambi tecniche equivalenti? Oppure distinguono?

+1

Provare a fare un 'window.console = false;' e quindi eseguire entrambi i costrutti. Vedi cosa succede - https://jsfiddle.net/abhitalks/xmohL5wr/ – Abhitalks

risposta

4

No. Hanno una differenza.

Prima si controlla se il valore di window.console è Verità e il secondo si verifica la proprietà console in window.

Diciamo che si crea una variabile come questa.

window.myName = ""; 

Ora, if (window.MyName) non riuscirà a soddisfare la condizione, come stringhe vuote sono Falsy in JavaScript.

console.log(Boolean(window.myName)); // false 

Ma if ("myName" in window) in grado di soddisfare la condizione, come myName è una struttura di window oggetto.

console.log(Boolean("myName" in window)); // true 

Nota:in operatore tornerà true anche se la proprietà in fase di sperimentazione è da qualche parte nella gerarchia prototipo. Ad esempio,

console.log("toString" in {}); // true 

Restituisce true perché l'oggetto {} eredita il metodo toString.

Se si vuole fare in modo che la proprietà esiste sull'oggetto stesso, quindi si dovrebbe utilizzare Object.prototype.hasOwnProperty, come questo

console.log({}.hasOwnProperty("toString")); // false 
+1

Ok. Nel caso del primo: Se la console non esiste restituisce un valore == falsy indefinito. Quindi non entra nel if-block. Quindi l'uso di "in" sarebbe più pulito? – bo256

+0

@ bo256 Se si vuole veramente verificare se esiste una proprietà o no, allora si dovrebbe usare l'operatore 'in'. – thefourtheye

4

No. Loro hanno una differenza.

Quando si utilizza l'operatore in, si controlla se la proprietà è specificata nell'oggetto specificato e non il suo valore. Per esempio:

var obj = { foo: undefined } 
obj.foo !== undefined; // false 
'foo' in obj;   // true 

speriamo vi sia utile

1

Nel tuo caso è equivalente. Quando si utilizza nell'operatore, sembra che la proprietà esista nell'oggetto. E quando usi se (window.console) sembra che window.console sia un valore di verità.

1

Quando si dice window.console si verificherà la proprietà console nell'oggetto window.Non considero il tempo la proprietà console proprietà di oggetto finestra o è ereditata dal genitore.

D'altra parte nel console in window, il in farà in modo di proprietà si esiste come proprietà dell'oggetto finestra e non ereditato dal genitore.

+0

Vedere @thefourtheye answer –

Problemi correlati