2013-05-13 12 views
17

Przeczytałem re-introduction to JavaScript on MDN i w sekcji Numery powiedział, że można przekonwertować ciąg na liczbę, po prostu dodając operatora plus przed nim.JavaScript dodając ciąg do numeru

Na przykład:

+ „42”, która otrzymując wyjście liczbę 42.

Ale dalej wzdłuż w sekcji o Operatorzy mówi, że dodając ciąg „coś” do dowolnego numer, który można przekonwertować na liczbę. Podają również następujący przykład, który mnie pomylił:

"3" + 4 + 5 prawdopodobnie dałoby na wyjściu ciąg 345, ponieważ liczby 4 i 5 również zostałyby zamienione na ciągi.

Czy jednak 3 + 4 + "5" nie dają liczby 12 zamiast ciągu 75, jak podano w ich przykładzie?

W tym drugim przykładzie w sekcji o operatorach operator + nie stoi przed ciągiem "5", nie przekształca tego ciągu w cyfrę 5, a następnie dodaje wszystko do 12?

+0

Przeczytaj to: [Co to = + _] (http: // stackoverflow.com/questions/15129137/what-does-mean-in-javascript) –

Odpowiedz

23

To, o czym mówisz, to jeden plus. Różni się on od znaku plus, który jest używany w przypadku łączenia lub dodawania ciągów.

Jeśli chcesz użyć opcji jednoargumentowej plus, aby ją przekonwertować i dodać ją do poprzedniej wartości, musisz podwoić ją.

> 3 + 4 + "5" 
"75" 
> 3 + 4 + +"5" 
12 

Edit:

Musisz dowiedzieć się o kolejności operacji:

+ i - mają ten sam priorytet i są związane z lewej strony:

> 4 - 3 + 5 
(4 - 3) + 5 
1 + 5 
6 

+ zrzeszającej do ponownie w lewo:

operatorzy
> 3 + 4 + "5" 
(3 + 4) + "5" 
7 + "5" 
75 

unarne zazwyczaj mają silniejszy priorytet niż operatorów binarnych:

> 3 + 4 + +"5" 
(3 + 4) + (+"5") 
7 + (+"5") 
7 + 5 
12 
+0

Czyli to oznacza, że ​​gdy ciąg jest łączony z innymi liczbami, konwertuje wszystkie inne liczby na łańcuchy, z wyjątkiem sytuacji, gdy konkretnie umieszczam przed sobą inny operator + (zasadniczo dwa operatory + (+ + "5")) i wtedy i tylko wtedy JavaScript zinterpretowałby, co jest w środku ciągu jako liczbę? – SineLaboreNihil

+0

@SineLaboreNihil W '(+ +" 5 "))' first jest dla 'add' second używany do typecase' "5" 'string do' 5' int ..read the link –

+0

@epascarello Dostaję kolejność operacji I został po prostu zdezorientowany następującym zdaniem na stronie MDN: "Jeśli dodajesz ciąg do liczby (lub innej wartości), wszystko jest najpierw przekształcane w ciąg znaków." Nie mówi nic o kolejności, w jakiej jest konwertowany. Dodatkowo do tego zamieszania dodano następujące zdanie: "Dodanie pustego łańcucha do czegoś jest użytecznym sposobem jego konwersji". Nie mówi, że konwertuje wszystko na ciąg znaków tylko wtedy, gdy zostanie wykryty jako ciąg znaków przez JavaScript i że wszystko przed nim pozostanie nienaruszone. W każdym razie, dzięki za pomoc. – SineLaboreNihil

3

Można również użyć parseInt() lub parseFloat(), tak:

> 1 + 2 + "3" 
"33" 
> 1 + 2 + parseInt(3) 
6 

Myślę, że to o wiele czystsze niż używając + "3", ale to tylko moja opinia.

1

W przykładzie 3 + 4 + "5" - parser Javascript zrobi (3 + 4) + "5", ponieważ 3 + 4 jest pierwszy - więc doda 3 + 4, ponieważ są to liczby , a następnie połącz ciąg "5".

+0

To mnie myli i wklejam tutaj, tak jak jest napisane na stronie MDN: "Jeśli dodasz ciąg do liczby (lub innej wartości), wszystko jest najpierw konwertowane na ciąg znaków". .. Najwyraźniej działa to tylko wtedy, gdy najpierw dodajesz ciąg przed liczbami. Jeśli dodasz go po liczbach, liczby zsumują się (zwykła matematyka), a potem połączą z nim ciąg znaków. Oznacza to, że w tym przypadku wszystko nie zostanie przekształcone na ciąg znaków. – SineLaboreNihil

+1

Nie technicznie poprawne, ponieważ mimo, że JavaScript nie jest wpisany, nadal zachowa typy, chyba że dokonasz konwersji, na przykład int-> string, string-> int. – Modul8

1

Po dodaniu liczby i łańcucha znaków w JavaScript wynik jest zawsze ciągiem.

Sprawdź eksperyment tutaj - http://jsfiddle.net/xuVur/1/

var a = "3" + 4 + 5; 
var b = 3 + 4 + "5"; 

$("#result1").html(a); // prints 345 
$("#result2").html(b); //prints 75 
+0

Twój drukuje "a" zawsze –

+1

Mój zły. Zmieniłem to teraz. – UnTechie

+1

jsfiddle jest nadal nieprawidłowy. Zaktualizowałem to –

4

Odpowiedź można znaleźć w sekcji Ecma262.pdf 11.6.1:

Jeśli Type (lprim) jest String lub Type (rprim) jest String, a następnie a. Zwróć łańcuch znaków , który jest wynikiem łączenia ToString (lprim) po przez ToString (rprim).

Tak, aby rozwiązać wszystkie operacje zgodnie z pierwszeństwem, tak aby po znalezieniu dowolnej liczby liczba była konwertowana na ciąg znaków.

4 + 3 + "5" 
"75" 
4 + 3 + "5" + 3 
"753" 

Aby przeczytać cały standard, należy przejść pod numer here.

1

Kiedy patrzysz w kroku 7 i "Note 2" w The Addition operator (+) (§11.6.1) w specyfikacji ES5,

mówi

Jeśli Type (lprim) jest String` lub Typ (rprim) jest String, następnie Zwraca ciąg, który jest wynikiem złączenie toString (lprim), a następnie toString (rprim)


UWAGA 2 Krok 7 różni się od kroku 3 algorytmu porównania dla operatorów relacyjnych (11.8.5), używając operacji logicznej lub operacji zamiast logicznej - i operacji.

sposób, jeśli albo 7 (3+4) lub"5" (|| nie &&) jest typeof "string"toString() stosuje się do obu argumentów.

Więc dodatek jest faktycznie stosowane do

"7" i "5" ->"7" + "5" //"75"

1

smple + operatora w JavaScript jest używany do konkatenacji i nie dodawać.

Klamra i operator + przed zmienną całkowitą formatu będą wykonywać zadanie za każdym razem.

To zawsze działa dobrze.

1 + (+"2") = 3 

Ponieważ umieszczenie znaku przed tekstem zamienia zmienną ciągu na liczbę.

skrzypce tutaj: http://jsfiddle.net/xuVur/2/