Lo primero es por que como no son literales, no se compara su valor, se compara si es el mismo objeto (y no lo es).
Lo segundo, es por que la comparación estricta se da cuenta de que son tipos de datos distintos:
Código Javascript
:
Ver originalconsole.log(typeof 'foo');
console.log(typeof new String('foo'));
No deberías usar el constructor para definir strings.
Saludos