Detectar teléfono / tableta / cliente web usando javascript

Estoy intentando detectar si el usuario final está usando un teléfono, una tableta o una PC

He estado buscando en Google por un tiempo, aparentemente no hay una solución fácil.

Bueno, supongo que no debería usar la resolución, ya que hoy en día algunas tabletas tienen resoluciones sorprendentes.

No debo confiar en la orientación, ya que las computadoras portátiles con Windows8 pueden rotar como tabletas. (y el diseño receptivo es demasiado difícil para mi proyecto actual)

He intentado usar UserAgent (creo que también tiene sus inconvenientes), pero no puedo hacer que funcione, a continuación se presenta una conjunción de diferentes versiones en línea que estoy utilizando para distinguir el teléfono / tableta de las PC, simplemente no funcionan y no tengo ni idea de porqué

var agents = ['android', 'webos', 'iphone', 'ipad', 'blackberry','iemobile','phone','mobile'];
                for(i in agents) {
                    if(navigator.userAgent.toLowerCase().match('/'+agents[i]+'/i')) {
                        return true;
                    }
                }


if( /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) ) {
                return true;
            }

 if( navigator.userAgent.match(/Android/i)
                 || navigator.userAgent.match(/webOS/i)
                 || navigator.userAgent.match(/iPhone/i)
                 || navigator.userAgent.match(/iPad/i)
                 || navigator.userAgent.match(/iPod/i)
                 || navigator.userAgent.match(/BlackBerry/i)
                 || navigator.userAgent.match(/Windows Phone/i)
                 || navigator.userAgent.match(/bada/i)
                 || navigator.userAgent.match(/Bada/i)
                 ){
                return true;
            }

Respuestas a la pregunta(4)

Su respuesta a la pregunta