Объекты String
, как правило, создаются неявно с помощью строковых литералов.
// кавычки любые - без разницы
var str = "string literal"
В строковых литералах можно использовать escape-последовательности для представления особых знаков, которые нельзя напрямую использовать в строках, например символа перевода строки или знаков Юникода. При компиляции сценария каждая escape-последовательность в строковом литерале преобразуется в знаки, которые она представляет.
Можно указать юникодный символ явным образом, через его код.
var str = "\u1234"
Объекты String
, заданные через кавычки (и называемые "примитивными" строками), немного отличаются от объектов String
, созданных с помощью оператора new. Так, например, типом (typeof) данных объекта, созданного при помощи new
, является 'object'
, а не 'string'
. И такому объекту можно напрямую назначать дополнительные свойства и методы. В остальном - интерпретатор автоматически превращает примитивные строки в объекты.
"12345".length // 5
Доступ к символам
Доступ к символам осуществляется при помощи метода String#charAt
return 'cat'.charAt(1); // возвратит "a"
Также существует отсутствующий в стандарте ECMA-262 способ - обращение к строке как к массиву:
var str = 'cat'
return str[1] // "a"
В отличие от языков C/PHP/и т.п., однажды созданную строку нельзя изменить: символы можно только считывать, но не менять.
Для изменения строковой переменной применяется присваивание измененной строки:
str = "строка"
str = str.charAt(4) + str.charAt(5) + str.charAt(6) // "ока"
Сравнение строк
Для сравнения строк используются обычные операторы < >.
> Также существует отсутствующий в стандарте ECMA-262 способ - обращение к строке как к массиву
но он не везде работает
Илья, добавьте, пожалуйста, в статью, что нельзя изменить конкретный символ в строке, и что для этого, соответственно, нет встроенных функций. Долго искал об этом информацию, пока на форуме не подсказали. Пусть и другие не спотыкаются об это
С какого это перепугу "нельзя изменить конкретный символ в строке"? Как насчет, например, replace???
Да, действительно нельзя. Методы, в том числе
replace
создают новую строку а не меняют существующую.Не совсем понял, все-таки нельзя, или нет встроенных функций?
Содержимое строки в JavaScript нельзя изменять. Нельзя взять символ посередине и заменить его. Как только строка создана – она такая навсегда.
Можно лишь создать целиком новую строку и присвоить в переменную вместо старой
https://learn.javascript.ru/string
Будьте добры, проясните работу со строками в HTML коде, закодированными, как обычно, в UTF-8. Потому что, к примеру, сравнение document.title=="Искомая страница" НЕ сработает до тех пор, пока сам скрипт с этим сравнением не сохранен в формате UTF-8. Я нигде данных об этом не встречал, нашел решение по интуиции чисто.
последний пример не правильный:
"str.charAt(6)" там в строке нет.
Согласен с комментарием выше, в примере ошибка с индексами. Правильный вариант:
str = "строка"
str = str.charAt(3) + str.charAt(4) + str.charAt(5) // "ока"
'Е' > 'А' == true
'Ё' > 'А' == false
Всему виной неплотная кодировка русского алфавита где буква Ёё выходит из сравнения - так везде.
Счёт символов строки начинается с нуля, а не с единицы.
в ИЕ 'cat'[0] вернёт undefined
А есть какой-нибудь покороче способ для вставки символа несколько раз подряд?
Доброго времени суток, столкнулся с такой проблемой: Пытаюсь сравнить два элемента массива, на строке с .test выдает ошибку "Объект не поддерживает свойство или метод ".test"". Код js в теле .hta.
Пример (ругается на строку "if (re.test(str))"):
function testinput(re, str)
{
if (re.test(str))
midstring = " содержит ";
else
midstring = " не содержит ";
document.write (str + midstring + re.source);
}
var m1 = ["1", "2", "3"];
var m2 = ["1", "2", "3"];
testinput(m1[1], m2[1]);
из-за чего ошибка и как лечить. Заранее спасибо.
Метод test существует только у обьектов RegExp, т.е. регулярных выражений, в данном случае он вызывается у строки. В этом случае надо использовать метод search:
Уважаемый BiggestSmile , test() является методом класса RegExp.И если Вам необходимо проверить выражение именно на true/false ваша переменная "re" должна содержать регулярное выражение например
,а вы пытаетесь применить метод к строковому типу данных.И Тогда ваш код перестанет ругаться.
Всем привет!
Вопрос к знающим: имеются ли отличия в использовании строковых литералов, обрамленных " (кавычками) или ' (апострофами)?
Есть ли принципиальная разница между:
и
?
Насколько мне известно, разницы нет никакой...
Как сделать это корректно помогите пожалуйста?
Создайте форму 2-х полей, запрашивающую у пользователя имя и фамилию. Запишите и то, и другое в одну переменную, выведите ее на экран.
С помощью методов объекта String для работы с RegExp переставьте, местами фамилию и имя и разделив их запятой.
Выведите на экран результат.
Например, если пользователь ввел Вася Васечкин, то в итоге на экране должно получиться «Васечкин, Вася».
Это можно сделать например так...
сделать регулярное выражение по нахождению "пробела" str.search("ругулярное выражение")... если нашел он возвращает позицию первого совпадения, далее обрезаем slice() нашу переменную от позиции совпадения до конца строки . и записываем в массив. далее обрезаем от 0 до позиции совпадения и записываем в массив. Ну и остается вывести массив методом join() в виде аргумента указав ", "
Не очень эффективно, можно все зделать с помощью RegExp
Например самый простой варинат
"name lastname".replace(/(\S+)\s(\S+)/, "$2, $1") //"lastname, name"
можно использовать границу слов \d но это работает только для латинского алфавита.
В примере имя и фамилию надо тримать или усложнить regexp
Как вывести все свойства и методы - объекта Стринг? через for in не получилось.
с чем быстрее работает скрипт?
с массивом [a,b,c,d,e,f,g,h]
или со строкой "abcdefgh" через str[i] или метод .charAt(i)
Подскажите пожалуйста, правильно ли я понимаю:
String является примитивом, примитив не может иметь свои свойства и методы.
Для реализации такой обработки движки под капотом преобразуют примитивы в объекты, которые после обработки успешно удаляются.
Например:
Строка так и осталась строкой, мы применили лишь метод объекта-оболочки.
И если с методами - всё понятно, мы вызываем метод объекта и он что-то делает, то не совсем понятно в какой момент и как вычисляется свойство length?