Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Comportamentos distintos na construção do Date

Pessoal, tudo bem?

Estava lendo o seguinte tópico - https://cursos.alura.com.br/forum/topico-comportamento-do-spread-operator-29847

Trata-se de uma discussão sobre o cast automático no construtor do objeto Date a partir da utilização do método split. No referido tópico, a discussão foi encerrada com o entendimento que quem faz a conversão é a função map(), porem fiz alguns testes e identifiquei o seguinte comportamento:

Ex1 - Usando o split:

let data = new Date(..."2016-11-12".split('-'));
console.log(data); //Mon Dec 12 2016 00:00:00 GMT-0300 (Hora Padrão da Bahia)

Ex2 - Passando três parâmetros

let data = new Date("2016","11","12");
console.log(data); //Mon Dec 12 2016 00:00:00 GMT-0300 (Hora Padrão da Bahia)

Ex3 - Passando a data como uma unica string

let data = new Date("2016-11-12");
console.log(data); //Fri Nov 11 2016 21:00:00 GMT-0300 (Hora Padrão da Bahia)

Ou seja, temos a mesma saída em ambos os casos de parâmetros independentes e outra saída para a string unica. Pelo que esta me parecendo, o construtor que ao receber os atributos de forma independente realiza alguma operação com o atributo do mês que acaba realizando um cast automático por se tratar de um valor numérico.

Se temos um comportamento distinto, com base em uma "assinatura" diferente, seria uma sobrecarga no construtor? Mas no ES6 já temos conceito de sobrecarga? Fiquei confuso.... :D

Abraço a todos

6 respostas

No map é feita uma subtração que faz conversão explícita de String para Number.

E no constructor de Date há uma série de typeOf para saber como lidar com os parâmetros. Não há sobrecarga de função nem constructor em JavaScript.

Faça isso no seu console:

"10" - 2 // resultado é 8!

É dentro do map que isso é feito, quando usa a lógica de subtrair o índice.

let data = new Date(...this._inputData
            .value.split('-')
            .map(function(item, indice) {
               // o retorno sempre será um número 
                return item - indice % 2; 
            }));

Oi Flavio, eu entendi esse raciocínio do map() e concordo que ele executa a operação, mas conforme o exemplo 2 enviado no questionamento, não cheguei a utilizar o map() ou fazer qualquer operação, simplesmente criei o Date baseado em três atributos de String conforme repetido abaixo:

Ex2 - Passando três parâmetros

let data = new Date("2016","11","12");
console.log(data); //Mon Dec 12 2016 00:00:00 GMT-0300 (Hora Padrão da Bahia)

Neste caso, mesmo sem operação, observe que passo em parâmetro o mês como "11" mas é impresso no console como "Dec" (Dezembro) indicando que foi considerado o numeral 11, entendeu? Dai o entendimento que o construtor realiza alguma operação pra fazer esse cast..

Até mais

solução!

Olá Fábio, a documentação da Mozilla sobre o Date explica bem o funcionamento dos construtores. https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Date

Perfeito Rômullo.

Oi Romulo, realmente a documentação é muito boa! Conheço ela e sempre estudo com uma aba aberta nela inclusive! :D

Depois de olhar com mais cuidado a documentação do Date percebi que os argumentos "soltos" realmente são recebidos como números. Destaco o trecho na documentação encaminhada:

year
Um valor inteiro que representa o ano. Valores de 0 a 99 correspondem aos anos de 1900 a 1999. Veja o exemplo abaixo.

month
Um valor inteiro que representa o mês, começando com 0 para Janeiro até 11 para Dezembro.

day
Um valor inteiro que representa o dia do mês.

hour
Um valor inteiro que representa a hora do dia.

minute
Um valor inteiro que representa o segmento de um minuto de tempo.

second
Um valor inteiro que representa o segmento de segundo do tempo.

millisecond
Um valor inteiro que representa o segmento de milisegundo do tempo.

Entendendo que não há sobrecarga e, como o Flavio explicou, trata-se de validações com base no uso do typeOf, compreendi melhor a definição no construtor.

Obrigado pela atenção e espero que esse topico possa ajudar outras pessoas quanto a esse entendimento.

Até mais