Как я могу проверить, является ли var строкой в JavaScript?
Я пробовал это, и это не работает ...
var a_string = "Hello, I'm a string.";
if (a_string typeof 'string') {
// this is a string
}
Как я могу проверить, является ли var строкой в JavaScript?
Я пробовал это, и это не работает ...
var a_string = "Hello, I'm a string.";
if (a_string typeof 'string') {
// this is a string
}
Ответы:
Вы были близки
if (typeof a_string === 'string') {
// this is a string
}
В связи с этим: вышеуказанная проверка не сработает, если будет создана строка с new String('hello')
типом Object
. Есть сложные решения, чтобы обойти это, но лучше просто избегать создания строк таким образом.
if(typeof(str) === typeof(String()))
typeof
Оператор не инфиксный (так LHS вашего примера не имеет смысла).
Вы должны использовать это так ...
if (typeof a_string == 'string') {
// This is a string.
}
Помните, typeof
это оператор, а не функция. Несмотря на это, вы увидите, typeof(var)
что вас часто используют в дикой природе. Это имеет такой же смысл, как var a = 4 + (1)
.
Кроме того, вы также можете использовать ==
(оператор сравнения на равенство), поскольку оба операнда являются String
s ( typeof
всегда возвращает a String
), JavaScript определен для выполнения тех же шагов, которые я использовал ===
(оператор строгого сравнения).
Как упоминает Box9 , это не обнаружит экземпляр String
объекта.
Вы можете обнаружить это с ....
var isString = str instanceof String;
jsFiddle .
...или...
var isString = str.constructor == String;
jsFiddle .
Но это не будет работать в мульти- window
среде (думаю, iframe
с).
Вы можете обойти это с ...
var isString = Object.prototype.toString.call(str) == '[object String]';
jsFiddle .
Но опять же (как упоминает Box9 ), вам лучше использовать буквальный String
формат, например var str = 'I am a string';
.
if(myVar.toUpperCase) alert('I am a string');
? См: jsfiddle.net/tb3t4nsx
{ toUpperCase: '' }
Следующее выражение возвращает true :
'qwe'.constructor === String
Следующее выражение возвращает true :
typeof 'qwe' === 'string'
Следующее выражение возвращает false (sic!):
typeof new String('qwe') === 'string'
Следующее выражение возвращает true :
typeof new String('qwe').valueOf() === 'string'
Лучший и правильный путь ( имхо ):
if (someVariable.constructor === String) {
...
}
Сейчас я считаю, что предпочтительнее использовать функциональную форму typeof (), так что ...
if(filename === undefined || typeof(filename) !== "string" || filename === "") {
console.log("no filename aborted.");
return;
}
typeof
, вы просто контролируете порядок операций с этими скобками. Некоторые люди могут найти его более читабельным при определенных обстоятельствах.
filename
только группируют одно утверждение, и поэтому являются бесполезными и посторонними. Хорошо, что этот ответ имеет оценку 0, потому что он неправильный, вводящий в заблуждение и бесполезный; было бы лучше, если бы у него был отрицательный счет.
проверка на ноль или неопределенность во всех случаях a_string
if (a_string && typeof a_string === 'string') {
// this is a string and it is not null or undefined.
}
typeof null
и typeof undefined
никогда не вернется 'string'
, так typeof a_string
что достаточно. Извините за некропостинг
Мой личный подход, который, кажется, работает во всех случаях, - это тестирование на присутствие членов, которые будут присутствовать только для строк.
function isString(x) {
return (typeof x == 'string' || typeof x == 'object' && x.toUpperCase && x.substr && x.charAt && x.trim && x.replace ? true : false);
}
Смотрите: http://jsfiddle.net/x75uy0o6/
Я хотел бы знать, есть ли у этого метода недостатки, но он годился для меня хорошо.