строка instanceof не ведет себя так, как ожидалось в скрипте Google Apps

Я хотел проверить, является ли переменная в скрипте приложений строкой, но обнаружил, что instanceof не возвращает true, когда переменная на самом деле является строкой. Следующий тест:

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');
}

журналы эти два сообщения:

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

документы не ясны для подмножества ECMAScript, которое поддерживается, хотя, по-видимому, instanceof является допустимым оператором, а String-допустимым типом, судя по тому, что код, выполняемый без исключение.

каков подходящий способ проверить тип переменной?

1 ответов


Это стандартный EcmaScript 3.

ваш код делает то, что ожидает JavaScript: смотрите здесь для эквивалентный JavaScript работает в вашем браузере.

Instanceof проверяет наличие соответствующего конструктора в цепочке прототипов. Это хорошо для объектов, созданных с помощью "new", но не очень полезно для строк. То, что вы действительно хотите для String, - это typeof, как показано в этот пример в браузере или эквивалентный скрипт приложений код:

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');
}