2013-04-14 12 views
16

1-ty części:Co to jest {} + {} w JavaScript?

bo gdy dodajesz dwie tablice, wszystko działa zgodnie z oczekiwaniami:

[] + []  //output:'' 

Dodawanie tablicę i obiekt jest zgodny również z naszymi oczekiwaniami:

[] + {} 
output:'[object Object]' 

{} + {} w języku JavaScript to NaN?
i jest to nieoczekiwany wynik, więc jaki jest tego powód?

2-ty część:

W porównaniu strun bez prefiksu 0, 3 jest większy niż 12:

"3" > "12" 
: true 

z wyściółką, wszystko działa poprawnie:

"03" > "12" 
: false 

Czy prefiksu 0 obowiązkowe dla porównania ciągów znaków Jaki jest powód dodania prefiksu 0?

+9

'[] + [] ==" "oczekuje się od Ciebie? Jaka jest Twoja logika? –

+3

@SergioTulentsev: Reprezentacja ciągu tablicowego jest ciągiem znaków jego elementów połączonych przecinkami. Jeśli jest to pusta tablica, jej reprezentacja łańcuchowa będzie pusta, a jeśli połączymy dwa puste łańcuchy, otrzymamy pusty łańcuch. – icktoofay

+3

Powinieneś zadać jedno pytanie na pytanie. –

Odpowiedz

12

pierwsza część

1-

po dodaniu dwóch tablic wziąć pierwotną wartość dla każdego i tablice mogą być przekształcone w ciągi jak następujących [1,2,3,4].toString() //=> 1,2,3,4 więc dwóch tablicach Emty generuje puste ciągi, a połączenie między nimi generuje pusty łańcuch.

2- gdy dla drugiego po dodaniu pusty łańcuch z obiektu konwertowania obiekt na sznurkiem i jak przedstawiono wartość ciągu przedmiotu jest [object Object]

3-

podczas dodawania dwa obiekty, w sposób pokazany dopiero przekształcania obiektu do liczby przez czeku + ten question

Part Two

String porównanie jest litera po literze, od lewej do prawej i tak szybko, jak jest szacunek zwracana wartość jest określana ignorując długości ciąg jak poniżej

"3" > "12" 

„3” w ASCII jest większa niż „1 "więc powrót jest TRUE

"03" > "12" 

"0" w kodzie ASCII jest mniejszy niż "1", więc powrót jest false

14
  1. {} + {} jest interpretowane jako pusty blok {} następnie ekspresji + {}. {} nie ma wartości liczbowej, więc daje NaN. Jeśli zmusisz go do oceny jako wyrażenie takie jak ({} + {}), otrzymasz [object Object][object Object].

  2. To struny, więc zostaną porównane leksykograficznie. Jeśli chcesz porównać je jako liczby, najpierw przeanalizuj je, używając parseInt lub parseFloat.

0

próbowałem następujących w najnowszy Firefox, Safari i Chrome: a = [ ]; b = {}; console.log (a + a); console.log (a + b); console.log (b + b);

Firefox

(an empty string) 
[object Object] 
[object Object][object Object] 

Chrome

[object Object] 
[object Object][object Object] 
undefined 

Safari

[object Object] 
[object Object][object Object] 

Ciąg "3" jest większa, leksykograficznie, niż napisu "12". Jeśli naprawdę chcesz, aby łańcuchy były porównywane jako liczby, musisz powiedzieć JavaScriptowi, w jaki sposób chcesz to zrobić.

parseInt("3") > parseInt("12");