Як я можу перевірити, чи var - рядок у JavaScript?


Відповіді:


381

Ви були поруч:

if (typeof a_string === 'string') {
    // this is a string
}

Відповідна примітка: вищевказана перевірка не працюватиме, якщо натомість буде створено рядок з new String('hello')типом Object. Для цього є складні рішення, але краще просто уникати створення рядків таким чином.


1
Хлопці, я б дійсно дав схвальну відповідь обом, але я не можу, все, що я можу зробити, це +1 обом, ніж давати прийняту відповідь на те, хто ближче до моєї конкретної проблеми, що я не повністю пояснено.
vitto

це працювало для менеif(typeof(str) === typeof(String()))
Скотт Мерфі

78

typeofОператор не інфіксне (так LHS вашого прикладу не має сенсу).

Використовувати його потрібно так ...

if (typeof a_string == 'string') {
    // This is a string.
}

Пам'ятайте, typeofце оператор, а не функція. Незважаючи на це, ви побачите, typeof(var)що його багато використовують у дикій природі. Це має стільки ж сенсу, скільки var a = 4 + (1).

Крім того, ви можете також використовувати ==(оператор порівняння рівності), оскільки обидва операнди Strings ( 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';.

Подальше читання .


1
@ Box9 Не хвилюйся, я все-таки обмежений: P
alex

@alex Я зараз теж: o (ще 10 хвилин!)
Девід Тан

3
Обмежений показник @RobG - це коли ви отримали максимальну кількість представників протягом 24 годин. Після цього оновлення не враховуються до вашої репутації.
alex

Чи не можливо перевірити, чи є змінною рядок простим тестуванням на наявність члена, який має лише рядки? Наприклад: if(myVar.toUpperCase) alert('I am a string');? Дивіться: jsfiddle.net/tb3t4nsx
інгредієнт_15939

1
@ інгредієнт_15939 це не дуже хороший спосіб ... через{ toUpperCase: '' }
alex

14

Поєднання попередніх відповідей забезпечує такі рішення:

if (typeof str == 'string' || str instanceof String)

або

Object.prototype.toString.call(str) == '[object String]'

4

Наступний вираз повертає істину :

'qwe'.constructor === String

Наступний вираз повертає істину :

typeof 'qwe' === 'string'

Наступний вираз повертає false (sic!):

typeof new String('qwe') === 'string'

Наступний вираз повертає істину :

typeof new String('qwe').valueOf() === 'string'

Найкращий і правильний спосіб ( imho ):

if (someVariable.constructor === String) {
   ...
}

1

Зараз я вважаю, що краще використовувати форму функції typeof (), тому ...

if(filename === undefined || typeof(filename) !== "string" || filename === "") {
   console.log("no filename aborted.");
   return;
}

немає функції функції typeof, ви просто контролюєте порядок операцій з цими дужками. Деяким людям може бути зрозуміліше за певних обставин.
Jon z

@Jonz Що ви мали на увазі під "контролем порядку операцій"? Дякую.
a20

Я думаю, що пізніше я зрозумів, що ви можете перевірити конструктор і віддати перевагу тому, як це теоретично, я думав, що це буде швидше, але це не швидше? Приклад номер-тут показує використання круглих дужок developer.mozilla.org/en-US/docs/Web/JavaScript/Reference / ... це безперечно більш чіткими і менш для компілятора розбору , щоб розглянути. Моя здогадка про "замовлення" - це, можливо, проблема швидкості або пов'язана з тим, як компілятор завантажує стек аргументів, я не впевнений.
Майстер Джеймс

1
Порядок операцій @ a20 описує порядок виконання операцій для операторів, що містять кілька операцій. Див. Розробник.mozilla.org /en-US/docs/Web/JavaScript/Reference/… - круглі дужки (операційна групування) мають найвищий пріоритет оператора і тому оцінюються спочатку. У цьому випадку дужки навколо filenameгрупують лише одне твердження, тому є марними та сторонніми. Добре, що ця відповідь має бал 0, тому що вона неправильна, оманлива і не корисна; було б краще, якби вона мала негативний бал.
Jon z

Дуже інформативне спасибі за посилання. Отже, дужки перевіряються та виконуються спочатку? так що слід запуститись відразу, не перевіряючи наступних способів виклику ака без дужок, які будуть кроками пізніше і повільніше? немає? що я не розумію щодо компілятора часу виконання.
Майстер Джеймс

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достатньо. Вибачте за некропостинг
Іван Фролов

-3

Мій особистий підхід, який, здається, працює у всіх випадках, - це тестування на присутність членів, які будуть присутні лише для рядків.

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/

Я хотів би знати, чи є у цього методу недоліки, але він мені добре допомагає роками.


2
Це легко обдурити будь-який старий об'єкт, який має ці методи.
алекс

8
Це називається типом качок - наприклад, якщо він ходить як струна і говорить як струна, це може бути і струною. Ви трохи божевільні, якщо думаєте, що це найкращий спосіб перевірити рядок, але Javascript - це Громоверка, ви це робите.
Jon z
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.