2012-07-20 11 views
6

Quería comprobar si una variable en una secuencia de comandos de aplicaciones era una cadena, pero descubrí que la instanciaof no devolvía la verdad cuando la variable era en realidad una cadena. La siguiente prueba:instanceof String no se comporta como se esperaba en Google Apps Script

function test_instanceof() { 
    var a = "a"; 
    Logger.log('"a" is ' + ((a instanceof String) ? '' : 'not ') + 'a String'); 
    var b = String("b"); 
    Logger.log('String("b") is ' + ((b instanceof String) ? '' : 'not ') + 'a String'); 
} 

registra estos dos mensajes:

"a" is not a String 
String("b") is not a String 

Los documentos no están claras en el subconjunto de ECMAScript que se apoya, aunque aparentemente es un operador instanceof válido y es una cadena válida escriba, a juzgar por el hecho de que el código se ejecutó sin excepción.

¿Cuál es la forma adecuada de verificar el tipo de variable?

Respuesta

7

Es EcmaScript estándar 3.

Su código está haciendo lo que espera JavaScript: ver aquí por la equivalent JavaScript running in your browser.

Instanceof cheques para un constructor coincidente en la cadena de prototipos. Eso es bueno para objetos creados a través de "nuevo" pero no muy útiles para cadenas. Lo que realmente quiere para String es typeof, como se muestra en this example in your browser o el código equivalente de Script de aplicaciones:

function test_instanceof() { 
    var a = "a"; 
    Logger.log('"a" is ' + ((typeof a == 'string') ? '' : 'not ') + 'a String'); 
    var b = String("b"); 
    Logger.log('String("b") is ' + ((typeof b == 'string') ? '' : 'not ') + 'a String'); 
} 
+0

Doh! Claramente, he pasado demasiado tiempo escribiendo Python últimamente y olvidé este detalle de JavaScript. Gracias por el refresco –

Cuestiones relacionadas