2013-03-08 7 views
7

mi sto cercando di capire questa espressione:In che modo l'operatore '>' Javascript confronta i caratteri con uno spazio?

((ch = stream.getChar()) > ' ') 

Qui, getChar() ottiene un carattere. In che modo questo operatore più grande di quello di comparazione verifica se un carattere è maggiore di uno spazio vuoto?

È possibile?

+0

Bene, ora che le cose sono spiegate devi dirci un po 'di più sullo sfondo di tutto questo, sono curioso di sapere perché qualcuno dovrebbe controllare che – Sebas

risposta

11

Uno spazio vuoto ha un codice di carattere. Anche se non sembra molto, ha ancora un valore. Così fa il personaggio preso dal flusso. Confrontando i codici carattere di questi valori è ciò che produce l'output.

+0

quando si confrontano 2 stringhe questo è il loro codice di carattere che vengono confrontati? – Sebas

+0

Sì, quando si confrontano le stringhe viene confrontato il loro codice carattere. – christopher

+0

quindi 'file_2013_03_01.txt'> 'file_2013_02_01.txt' perché il codice char della prima stringa è superiore al secondo? Come viene calcolato anche ... – Sebas

1

[string] > [string] confronterà il carattere (s) dai loro valori rappresentativi (vedi ASCII Table)

+2

chieda dell'operatore>. – deadlock

+0

@dreadlock: grazie - hai ragione! mancato questo. Cambierò la mia risposta – simplyray

+0

Ho aggiornato la mia risposta precedente – simplyray

0

I caratteri sono memorizzati nella memoria del computer come numero (di solito un byte o due).

Ogni personaggio ha un numero identificativo univoco.

Controllando se un personaggio è più grande dello spazio, in realtà viene visualizzato in una tabella.

Vedere http://en.wikipedia.org/wiki/ASCII per ulteriori informazioni.

3

Nelle stringhe di Javascript vengono confrontati in ordine alfabetico. Queste espressioni sono vere:

'abacus' <= 'calculator' 
'abacus' < 'abate' 
+0

Tuttavia ''#b' <'~ a''. L'ordine alfabetico non lo copre. – jazzpi

2

Nella maggior parte dei linguaggi di programmazione (se non tutti), i caratteri sono rappresentati internamente da un numero. Quando esegui la verifica di uguaglianza/maggiore/minore di quella che controlli effettivamente è il numero sottostante.

quindi in JS:

alert('c' > 'b'); // alerts true 
alert('a' > 'b'); // alerts false 

Uno spazio ha anche una rappresentazione numerica, quindi il controllo è uno valido.

+0

Ma questo inizia a diventare strano quando entri nella terra di UTF-8 giusto? È possibile confrontare i caratteri alfabetici internazionali? – CMCDragonkai

9

Diamo un'occhiata al language specification (lo stesso algoritmo è descritto in here) (si noti che definisce <, ma l'operatore > ribaltato direttamente il valore risultante).

Che l'operatore non è cercare di convertire entrambi gli operandi di tipi primitivi, con una preferenza per i numeri:

2. a. Let py be the result of calling ToPrimitive(y, hint Number). 
2. b. Let px be the result of calling ToPrimitive(x, hint Number). 

Nel nostro caso, x === stream.getChar() e y === ' '.Dal momento che entrambi gli operandi sono stringhe primitivi già, che si traduce in valori originali (px = x, py = y), e noi passiamo a:

4. Else, both px and py are Strings 

Ora lo fa controlli per vedere se uno degli operandi sono prefissi degli altri, per esempio:

'abc' > 'abcd' // false 
'foo' > 'foobar' // false 

che è rilevante se getChar() risultati in uno spazio, dal momento che lo spazio è un prefisso di se stesso:

' ' > ' ' // false 

Ci muoviamo via, per trovare il primo carattere x e y che siamo sulla stessa posizione nelle stringhe, ma sono diversi personaggi:

sia K il più piccolo intero non negativo in modo tale che il personaggio in posizione k entro px è diverso dal personaggio in posizione k all'interno di py. (Ci deve essere tale ak, perché né String è un prefisso dell'altro.)

(ad esempio, 'efg' e 'efh', vogliamo g e h)

I personaggi che abbiamo trovato sono poi convertiti ai loro valori interi:

Let m be the integer that is the code unit value for the character at position k within px. 
Let n be the integer that is the code unit value for the character at position k within py. 

infine, viene fatto un confronto:

If m < n, return true. Otherwise, return false. 

Ed è così che è paragonato allo spazio.


tl; dr Converte entrambi gli argomenti a loro rappresentazioni interi codice-unità, e confronta questo.

Problemi correlati