Fundamentos
Você pode não saber, mas, em JavaScript, sempre que interagimos com strings, números ou primitivos booleanos, entramos em um mundo oculto de sombras de objetos e coerção.
string, número, booleano, nulo, indefinido e símbolo.
Em JavaScript existem 7 tipos primitivos: undefined
, null
, boolean
, string
, number
, bigint
e symbol
. Tudo o mais é um objeto. Os tipos de primitivas boolean
, string
e number
pode ser enrolada por objeto os seus homólogos. Esses objetos são instâncias doBoolean
, String
e Number
construtores, respectivamente.
typeof true; //"boolean"
typeof new Boolean(true); //"object"
typeof "this is a string"; //"string"
typeof new String("this is a string"); //"object"
typeof 123; //"number"
typeof new Number(123); //"object"
Se os primitivos não têm propriedades, por que "this is a string".length
retorna um valor?
Porque JavaScript irá coagir prontamente entre primitivos e objetos. Neste caso, o valor da string é forçado a um objeto string para acessar o comprimento da propriedade. O objeto de corda é usado apenas por uma fração de segundo após o qual é sacrificado aos Deuses da coleta de lixo - mas no espírito dos programas de descoberta de TV, vamos prender a criatura evasiva e preservá-la para análise posterior ...
Para demonstrar isso, considere o exemplo a seguir, no qual estamos adicionando uma nova propriedade ao protótipo do construtor String.
String.prototype.sampleProperty = 5;
var str = "this is a string";
str.sampleProperty; // 5
Desta forma, as primitivas têm acesso a todas as propriedades (incluindo métodos) definidas por seus respectivos construtores de objetos.
Assim, vimos que os tipos primitivos irão forçar apropriadamente a sua contraparte do Objeto quando necessário.
Análise do toString()
método
Considere o seguinte código
var myObj = {lhs: 3, rhs: 2};
var myFunc = function(){}
var myString = "This is a sample String";
var myNumber = 4;
var myArray = [2, 3, 5];
myObj.toString(); // "[object Object]"
myFunc.toString(); // "function(){}"
myString.toString(); // "This is a sample String"
myNumber.toString(); // "4"
myArray.toString(); // "2,3,5"
Conforme discutido acima, o que realmente está acontecendo é que, quando chamamos o toString()
método em um tipo primitivo, ele precisa ser coagido em sua contraparte de objeto antes de poder invocar o método.
ou seja, myNumber.toString()
é equivalente aNumber.prototype.toString.call(myNumber)
e similar para outros tipos primitivos.
Mas e se em vez de o tipo primitivo ser passado para o toString()
método de sua contraparte de função de construtor de Object correspondente, forçarmos o tipo primitivo a ser passado como parâmetro para o toString()
método de construtor de função de Object ( Object.prototype.toString.call(x)
)?
Olhe mais de perto em Object.prototype.toString ()
De acordo com a documentação , quando o método toString é chamado, as seguintes etapas são executadas:
- Se o
this
valor for undefined
, retorne "[object Undefined]"
.
- Se o
this
valor for null
, retorne "[object Null]"
.
- Se este valor não for nenhum dos anteriores, Let
O
ser o resultado da chamada toObject
passando o this
valor como o argumento.
- Seja class o valor da
[[Class]]
propriedade interna de O
.
- Devolver o valor de cadeia que é o resultado da concatenação das três cordas
"[object "
, class
e "]"
.
Entenda isso com o exemplo a seguir
var myObj = {lhs: 3, rhs: 2};
var myFunc = function(){}
var myString = "This is a sample String";
var myNumber = 4;
var myArray = [2, 3, 5];
var myUndefined = undefined;
var myNull = null;
Object.prototype.toString.call(myObj); // "[object Object]"
Object.prototype.toString.call(myFunc); // "[object Function]"
Object.prototype.toString.call(myString); // "[object String]"
Object.prototype.toString.call(myNumber); // "[object Number]"
Object.prototype.toString.call(myArray); // "[object Array]"
Object.prototype.toString.call(myUndefined); // "[object Undefined]"
Object.prototype.toString.call(myNull); // "[object Null]"
Referências:
https://es5.github.io/x15.2.html#x15.2.4.2
https://es5.github.io/x9.html#x9.9
https://javascriptweblog.wordpress.com/ 27/09/2010 / the-secret-life-of-javascript-primitives /