Gioca principalmente come guardia, adattabile come ala piccola, è un ottimo tiratore da 3 punti, in particolare nella pratica del catch and shoot.[1] È uno dei migliori della Lega per percentuale di triple realizzate.
Dopo quattro stagioni in NCAA con i Virginia Cavaliers (di cui l'ultima chiusa con oltre 12 punti di media a partita) venne scelto alla 33ª chiamata del Draft NBA 2014 dai Cleveland Cavaliers.[2] Nonostante la squadra partisse con basse aspettative, il ritorno a casa in estate della stella (nata ad Akron vicino a Cleveland) LeBron James fece sì che le prospettive della squadra cambiassero radicalmente. Harris non trovò molto spazio nelle rotazioni della squadra, venendo spedito spesso ai Canton Charge in D-League. In Gennaio Dion Waiters venne ceduto agli Oklahoma City Thunder in una trade a tre squadre che vide coinvolti anche i New York Knicks che spedirono ai Cavaliers due guardie: J.R. Smith e Iman Shumpert; questo diminuì ulteriormente lo spazio per Harris, anch'egli guardia. Dopo aver giocato 51 partite in regula season (di cui una da titolare), Harris giocò anche 6 partite (tutte da subentrante nei garbage-time) durante i play-off in cui i Cavs arrivarono alle NBA Finals che poi persero per 4-2 con i Golden State Warriors.
Nella stagione successiva, Harris trovò ancora meno spazio tanto da giocare solamente 5 partite prima di essere ceduto agli Orlando Magic il 12 gennaio che lo tagliarono subito.[3][4]
Il 20 luglio 2016 firmò un contratto biennale, con solo 1 anno garantito con i Brooklyn Nets.[5]
Joe Harris (destra) con la canotta dei Nets in azione contro l'ex compagno di squadra LeBron James
Dopo un primo anno dove disputò 52 partite con 8,2 punti di media, l'anno successivo trovò molto più spazio disputando 78 partite andando a 10,8 punti di media a partita.
Nella stagione 2018-19 diventò la guardia titolare della squadra. Il 20 ottobre 2018 nella vittoria per 107-105 contro i New York Knicks (in cui segnò 11 punti), e, a seguito della prima tripla segnata, diventò il decimo giocatore nella storia della franchigia per tiri da 3 messi a segno.[7] Il 26 dicembre 2018 segnò 27 punti nel successo 134-132 contro gli Charlotte Hornets.[8]
Il 16 febbraio 2019 vinse la gara del tiro da tre punti (a cui arrivò con una media di 41,9% da 3)[1] battendo uno specialista come Stephen Curry e diventando il primo giocatore dei Nets a vincere questa gara.[9][10]