2017-10-26 3 views
2

Kann jemand diese JavaScript-Eigenart erklären?Warum If-Anweisung undefiniert für HashTable?

Ein Beispiel:

function func(hashTable) { 
    if (hashTable['foo']) 
    return true; 
} 

var hash = {}; 
hash['foo'] = 0; 
func(hash); 

ich undefined statt true.

+0

'(Hashtable [ 'foo'])' das Ergebnis falsch, wenn sein Wert 0 so 'return true' übersprungen. Dann wird undefined zurückgegeben. – marekful

+0

@KaisinLi, für welche Bedingung soll der if-Block ausgeführt werden? –

+0

@RohitAgrawal ursprünglich versuchte ich zu überprüfen, ob hashTable den Schlüssel 'foo' hat. Aber wie Sie vorgeschlagen haben, ist hasOwnProperty ein besserer Weg zu gehen. –

Antwort

5

Das ist, weil Sie returned die Funktion für eine einzige Situation abgedeckt (wenn hastTable['foo'] ist wahr).

hashTable['foo'] ist 0 und if(0) als false interpretiert und Sie haben nicht Wert für diesen Fall zurückgeführt.

In JavaScript, und nicht nur JavaScript, haben wir so falsyWerte genannt. Diese sind jeweils: 0, null, undefined, false, "", NaN.

+0

Ah ich sehe, mir fehlte das "wenn (0) als falscher Teil interpretiert wird". Vielen Dank! –

2

hashTable['foo'] hat den Wert 0, der zu boolean false ausgewertet wird. Daher wird if Block nie ausgeführt.

Wenn Sie mit dem if-Block ausführen soll, wenn hashTable eine Eigenschaft hat foo (oder jede andere Eigenschaft) unabhängig von dessen Wert können Sie es auf diese Weise tun:

function func (hashTable) { 
    return hashTable.hasOwnProperty("foo"); 
} 

var hash = {} 
hash['foo'] = 0; 
console.log(func (hash)); 
+0

Diese Antwort fehlt einige wichtige Dinge. Sie könnten 'return hashTable.hasOwnProperty (" foo ");', es gibt keine Notwendigkeit für eine if-Anweisung –

+0

Vielen Dank @Jonasw. Hab das nur vergessen. Aktualisiert meine Antwort –

-1

Becz Rückkehr geschehen nur, wenn Hash-Tabelle ['foo'] ist wahr;

hashTable ['foo'] ist falsch, da Sie 0 zugewiesen haben;

so ... Funktion func (Hash-Tabelle) { if (Hashtable [ 'foo']) { return true } else { return false } }

1

Vielleicht kürzer & besser:

const hash = Object.create(null); 
:
const func = table => "foo" in table; 

Und Hashtables sollte so konstruiert sein,


Und da ES 6 Theres eine bessere für solche Dinge konstruieren:

const hash = new Map(); 
//to check 
hash.has("foo") 
+0

Das Problem mit Map ist, wenn 'foo' den Wert 0 hat, würde ['foo'] undefined –

+0

@kaisin zurückgeben, weil sein 'hash.get (" foo ")' –

0

Um zu überprüfen, ob ein Objekt eine bestimmte Eigenschaft enthält, in oder .hasOwnProperty() verwenden.

in erzeugt einen true Wert, wenn die Eigenschaft auf dem Objekt oder irgendwo in seiner Prototypkette vorhanden ist.

.hasOwnProperty() gibt true zurück, wenn die Eigenschaft auf dem Objekt selbst vorhanden ist (Prototyp ist nicht aktiviert).

function Student(name) { 
 
    this.name = name; 
 
} 
 
    
 
Student.prototype.occupation = 'student'; 
 

 
var john = new Student('John'); 
 

 
// in 
 
console.log('name' in john);  // true 
 
console.log('occupation' in john); // true 
 
console.log('age' in john);   // false 
 

 
// .hasOwnProperty() 
 
console.log(john.hasOwnProperty('name'));  // true 
 
console.log(john.hasOwnProperty('occupation')); // false 
 
console.log(john.hasOwnProperty('age'));  // false