Todas las cosas de toString
parecen ser un intento de solucionar problemas con la mezcla de fotogramas cruzados de diferentes constructores String
incorporados. Eso es innecesario para verificar si algo es una cadena primitiva - typeof
es suficiente, por lo que no hay caso de uso para is_primitive_string
.
muy rara vez veo argumentos pasados como String
casos así que no puedo ver por qué yo tendría que comprobar si algo es un ejemplo String
cruz-marco en lugar de simplemente coaccionar a un valor medio de String
("" + s)
o String(s)
. La única vez que utilicé un valor de String
en el código de producción fue cuando necesitaba una cadena vacía que era cierta en algún highly optimized code.
Por lo que respecta a los demás, las instancias de la clase Boolean
no se comportan como cabría esperar en las condiciones.
if (new Boolean(false)) {
alert("WTF!");
} else {
alert("OK");
}
Boolean.prototype.not = function() { return !this; };
if (new Boolean(false).not()) {
alert("OK");
} else {
alert("Really, WTF!");
}
if (false.not()) { // Autoboxing
alert("OK");
} else {
alert("Cmon, WTF!");
}
!(false)
es true
, pero cuando se utiliza crear una instancia de la clase Boolean
, el operador !
se aplica al valor del objeto, y valores de los objetos son siempre Truthy.
creo EcmaScript 5 modo estricto está cambiando la forma this
se presenta de modo que el último ejemplo (false.not()
) se comportará como uno podría esperar ingenuamente cuando se añade "use strict";
a la parte superior de Boolean.prototype.not
en un intérprete ES5 válida.
Con Number
s, las comparaciones que utilizan <
son correctas y además los operadores de adición y otros tienden a funcionar como se esperaba. new Number(0)
y new Number(NaN)
tienen los mismos problemas que new Boolean(false)
alrededor de condiciones, y por supuesto
alert(NaN === NaN); // false
var NAN = new Number(NaN);
alert(NAN === NAN); // true
y ===
y !==
comparan por referencia para todos String
, Number
y Boolean
.
El hecho de que los valores encuadrados se "pasen por referencia" en comparación con los primitivos puede tener algunas consecuencias interesantes. – Raynos
@Raynos, ¿qué consecuencias? Las primitivas son inmutables, por lo que no debería haber diferencias observables entre el valor de paso y la referencia de paso para las primitivas. No creo que haya ningún programa que pueda escribir que pueda detectar si todos los 'verdaderos' se pasan como referencia a un objeto inmutable que reside en una sola ubicación de memoria (como en Rhino) y uno donde es una unión etiquetada que se copia como en la mayoría de los otros intérpretes. –