¿Cómo y por qué funciona 'a' ['toUpperCase'] () en JavaScript?


5 Answers

foo.bar y foo['bar'] son iguales, por lo que el código que publica es el mismo que

alert('a'.toUpperCase())

Cuando se usa foo[bar] (nótese la falta de comillas), no se usa la bar nombre literal bar sino el valor que contenga la bar variable. Entonces usando la notación foo[] lugar de foo. le permite usar un nombre de propiedad dinámico.

Echemos un vistazo a callMethod :

En primer lugar, devuelve una función que toma obj como argumento. Cuando se ejecuta esa función llamará al method en ese objeto. Entonces el método dado solo necesita existir ya sea en obj o en algún lugar de su cadena de prototipos.

En el caso de toUpperCase ese método proviene de String.prototype.toUpperCase - sería bastante estúpido tener una copia separada del método para cada cadena que exista.

Question

JavaScript sigue sorprendiéndome y esta es otra instancia. Me encontré con un código que no entendí al principio. Así que lo depuré y llegué a este hallazgo:

alert('a'['toUpperCase']());  //alerts 'A'

Ahora esto debe ser obvio si toUpperCase() se define como un miembro del tipo de cadena, pero inicialmente no tenía sentido para mí.

De todas formas,

  • funciona esto porque toUpperCase es miembro de 'a'? ¿O hay algo más detrás de escena?
  • el code que estaba leyendo tiene una función de la siguiente manera:

    function callMethod(method) {
        return function (obj) {
            return obj[method](); //**how can I be sure method will always be a member of obj**
        }
    }
    
    var caps2 = map(['a', 'b', 'c'], callMethod('toUpperCase')); // ['A','B','C'] 
    // ignoring details of map() function which essentially calls methods on every 
    // element of the array and forms another array of result and returns it
    

    Es una función genérica llamar a CUALQUIER método en CUALQUIER objeto. ¿Pero significa eso que el método especificado ya será un miembro implícito del objeto especificado?

Estoy seguro de que me falta cierta comprensión seria del concepto básico de las funciones de JavaScript. Por favor, ayúdame a entender esto.




Entonces en Javascript, los objects son objects . Eso es, son de esta naturaleza {} . Las propiedades del objeto se pueden establecer usando cualquiera de estos: a.greeting = 'hello'; o a['greeting'] = 'hello'; . Ambas formas funcionan.

La recuperación funciona de la misma manera. a.greeting (sin comillas) es 'hello' , a['greeting'] es 'hello' . Excepción: si la propiedad es un número, solo funciona el método de corchete. El método de puntos no.

Entonces 'a' es un objeto con propiedad 'toUpperCase' que en realidad es una función. Puede recuperar la función y llamarla posteriormente de cualquier manera: 'a'.toUpperCase() o 'a'['toUpperCase']() .

Pero la mejor forma de escribir la función de mapa sería como

var caps = ['a','b','c'].map( function(char) { return char.toUpperCase(); } )

¿Quién necesita la función callMethod entonces?




Casi todo en javascript se puede tratar como un objeto. En su caso, el alfabeto en sí actúa como un objeto de cadena y toUpperCase se puede invocar como su método. Los corchetes son solo una forma alternativa de acceder a las propiedades del objeto y dado que toUpperCase es un método, por lo tanto, se necesita el simplebracket () junto a ['toUpperCase'] formando ['toUpperCase']() .

'a'['toUpperCase']() es equivalente a 'a'.toUpperCase()

'a'['toUpperCase']() // returns A
'a'.toUpperCase() // returns A



Si preguntas cómo funciona realmente, así es como lo leo. Ok esta es una función matemática simple. Para entenderlo, debes mirar la tabla ascii. Que asigna un valor numérico a cada letra. Para encubrirlo, el competidor simplemente usa una declaración lógica para encubrir, por ejemplo, If (ChcrValue> 80 && charValue <106) // Este es el conjunto de letras minúsculas y luego charValue = charValue - 38; // la distancia entre el conjunto inferior y el superior

es así de simple, en realidad no me molesté en buscar los valores correctos, pero esto básicamente está cambiando todas las letras minúsculas a mayúsculas.




Básicamente javascript trata todo como un Objeto, o más bien cada objeto puede ser visto como un diccionario / matriz asociativa. Y las funciones / métodos se definen de la misma manera para el objeto, como una entrada en esta matriz asociativa.

Entonces, esencialmente, está haciendo referencia / llamando (observe la propiedad ' () ') de 'toUpperCase', del objeto 'a' (que es un tipo de cadena, en este caso).

Aquí hay un código de la parte superior de mi cabeza:

function myObject(){
    this.msg = "hey there! ;-)";
    this.woop = function(){
        alert(this.msg); //do whatever with member data
    }
}

var obj = new myObject();
alert( obj.msg );
alert( obj['msg'] );
obj['woop']();



toUpperCase es un método estándar de JavaScript: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/toUpperCase

La razón por la que funciona como 'a'['toUpperCase']() es que la función toUpperCase es una propiedad del objeto de cadena 'a' . Puede hacer referencia a las propiedades de un objeto utilizando object[property] u object.property . La sintaxis 'a''toUpperCase' indica que está haciendo referencia a la propiedad 'toUppercase' del objeto de cadena 'a', y luego lo llama ().




Related