2016-12-12 2 views
0

Ich benötige Hilfe bei der Fehlersuche bei JavaScript in einer Rails (4.2.6) -Anwendung mit Chartjs. Ich bekomme unerwartetes Verhalten, wenn ich versuche, einige Variablen mithilfe des ternären (if) -Operators festzulegen.JavaScript-Code wird als wahr ausgewertet, wenn die bedingte Anweisung falsch ist && true

// f = female, m = male; first = first measurement of year; last = last measurement of year 
var sex_female = "<%= @member.sex == 'Female' %>"; 
var sex_male = "<%= @member.sex == 'Male' %>"; 
var normal_body_fat_first_f; 
var normal_body_fat_last_f; 
var normal_body_fat_first_m; 
var normal_body_fat_last_m; 

normal_body_fat_first_f = sex_female && body_fat_year_first <= 24.0 ? body_fat_year_first : 24.0; 
normal_body_fat_last_f = sex_female && body_fat_year_last <= 24.0 ? body_fat_year_last : 24.0; 

normal_body_fat_first_m = sex_male && body_fat_year_first <= 17.0 ? body_fat_year_first : 17.0; 
normal_body_fat_last_m = sex_male && body_fat_year_last <= 17.0 ? body_fat_year_last : 17.0; 

Zu Testzwecken angemeldet ich in einem männlichen Benutzer mit den Fettdaten folgenden Körper:

body_fat_year_first = 15.2 
body_fat_year_last = 21.9 

Hier sind Ergebnisse aus der Firefox-Konsole:

> sex_female 
"false" 
> sex_male 
"true" 

> normal_body_fat_first_f 
"15.2" 
> normal_body_fat_last_f 
"21.9" 

normal_body_fat_first_m 
"15.2" 
normal_body_fat_last_m 
"17" 

> body_fat_year_first <=24 
true 
> body_fat_year_first <= 17.0 
true 

> sex_female && body_fat_year_first <= 24.0 
true 
> sex_female && body_fat_year_last <= 24.0 
true 

> sex_male && body_fat_year_first <= 17.0 
true 
> sex_male && body_fat_year_last <= 17.0 
false 

Wenn sex_female ausgewertet werden "false" & & body_fat_year_first < = 24 wird als wahr ausgewertet, warum ist das nicht falsch & & wahre Aussage, die zu falsch auswertet?

Mein erster Gedanke war, dass sex_female eine Zeichenkette ist, weshalb die Aussage wahr ist. Um dies zu testen, habe ich versucht, die Saiten zu Boolesche Werten wie diese Umwandlung:

var sex_female = "<%= @member.sex == 'Female'%>" == "true"; 
var sex_male = "<%= @member.sex == 'Male'%>" == "true"; 

Allerdings hat diese Änderung nicht das Problem lösen: die ‚sex_male‘ Aussagen nie ausgewertet.

Was mache ich falsch? Wenn ein Mann eingeloggt ist, warum ist der & & Operator nicht "kurzgeschlossen", wenn er den "sex_female" -Teil trifft und den gesamten Ausdruck als falsch bewertet?

Ich würde mich über jede Hilfe und Ratschläge darüber freuen, warum dies geschieht und wie ich das Problem am besten beheben kann. Vielen Dank!

+0

@Homa Wo gibt es eine if-Anweisung in der Frage? – Timo

Antwort

3

Da

"false" != false 

In anderen Worten ist "false" eine nicht leere Zeichenfolge, die truthy in JavaScript, d.h. true ausgewertet.


Entfernen der Anführungszeichen um die Zuordnung sollte dieses Problem lösen:

var sex_female = <%= @member.sex == 'Female' %>; 
+0

danke für die antwort. Versucht, die Anführungszeichen um die var-Zuweisung zu entfernen, aber das hat das Problem leider nicht gelöst. Es ignoriert immer noch die männlichen Aussagen. Es gibt weibliche Werte für einen eingeloggten Mann. Hmm. – codeinspired

Verwandte Themen