Конструктор, оператор «new»
Обычный синтаксис <. >позволяет создать только один объект. Но зачастую нам нужно создать множество похожих, однотипных объектов, таких как пользователи, элементы меню и так далее.
Это можно сделать при помощи функции-конструктора и оператора «new» .
Функция-конструктор
Функции-конструкторы технически являются обычными функциями. Но есть два соглашения:
- Имя функции-конструктора должно начинаться с большой буквы.
- Функция-конструктор должна выполняться только с помощью оператора «new» .
function User(name) < this.name = name; this.isAdmin = false; >let user = new User("Jack"); alert(user.name); // Jack alert(user.isAdmin); // false
Когда функция вызывается как new User(. ) , происходит следующее:
- Создаётся новый пустой объект, и он присваивается this .
- Выполняется тело функции. Обычно оно модифицирует this , добавляя туда новые свойства.
- Возвращается значение this .
Другими словами, new User(. ) делает что-то вроде:
function User(name) < // this = <>; (неявно) // добавляет свойства к this this.name = name; this.isAdmin = false; // return this; (неявно) >
Таким образом, let user = new User(«Jack») возвращает тот же результат, что и:
let user = < name: "Jack", isAdmin: false >;
Теперь, если нам будет необходимо создать других пользователей, мы можем просто вызвать new User(«Ann») , new User(«Alice») и так далее. Данная конструкция гораздо удобнее и читабельнее, чем многократное создание литерала объекта.
Это и является основной целью конструкторов – реализовать код для многократного создания однотипных объектов.
Давайте ещё раз отметим – технически любая функция (кроме стрелочных функций, поскольку у них нет this ) может использоваться в качестве конструктора. Его можно запустить с помощью new , и он выполнит выше указанный алгоритм. Подобные функции должны начинаться с заглавной буквы – это общепринятое соглашение, чтобы было ясно, что функция должна вызываться с помощью «new».
new function() < … >
Если в нашем коде присутствует большое количество строк, создающих один сложный объект, то мы можем обернуть их в функцию-конструктор, которая будет немедленно вызвана, вот так:
// создаём функцию и сразу же вызываем её с помощью new let user = new function() < this.name = "John"; this.isAdmin = false; // . другой код для создания пользователя // возможна любая сложная логика и инструкции // локальные переменные и так далее >;
Такой конструктор не может быть вызван снова, так как он нигде не сохраняется, просто создаётся и тут же вызывается. Таким образом, этот трюк направлен на инкапсуляцию кода, который создаёт отдельный объект, без возможности повторного использования в будущем.
Проверка на вызов в режиме конструктора: new.target
Продвинутая возможность
Синтаксис из этого раздела используется крайне редко. Вы можете пропустить его, если не хотите углубляться в детали языка.
Используя специальное свойство new.target внутри функции, мы можем проверить, вызвана ли функция при помощи оператора new или без него.
В случае обычного вызова функции new.target будет undefined . Если же она была вызвана при помощи new , new.target будет равен самой функции.
function User() < alert(new.target); >// без "new": User(); // undefined // с "new": new User(); // function User
Это можно использовать внутри функции, чтобы узнать, была ли она вызвана при помощи new , «в режиме конструктора», или без него, «в обычном режиме».
Также мы можем сделать, чтобы вызовы с new и без него делали одно и то же:
function User(name) < if (!new.target) < // в случае, если вы вызвали меня без оператора new return new User(name); // . я добавлю new за вас >this.name = name; > let john = User("John"); // переадресовывает вызов на new User alert(john.name); // John
Такой подход иногда используется в библиотеках, чтобы сделать синтаксис более гибким. Чтобы люди могли вызывать функцию с new и без него, и она все ещё могла работать.
Впрочем, вероятно, это не очень хорошая практика использовать этот трюк везде, так как отсутствие new может ввести разработчика в заблуждение. С new мы точно знаем, что создаётся новый объект.
Возврат значения из конструктора, return
Обычно конструкторы не имеют оператора return . Их задача – записать все необходимое в this , и это автоматически становится результатом.
Но если return всё же есть, то применяется простое правило:
- При вызове return с объектом, вместо this вернётся объект.
- При вызове return с примитивным значением, оно проигнорируется.
Другими словами, return с объектом возвращает этот объект, во всех остальных случаях возвращается this .
К примеру, здесь return замещает this , возвращая объект:
function BigUser() < this.name = "John"; return < name: "Godzilla" >; // alert( new BigUser().name ); // Godzilla, получили этот объект
А вот пример с пустым return (или мы могли бы поставить примитив после return , неважно):
function SmallUser() < this.name = "John"; return; // alert( new SmallUser().name ); // John
Обычно у конструкторов отсутствует return . Здесь мы упомянули особое поведение с возвращаемыми объектами в основном для полноты картины.
Пропуск скобок
Кстати, мы можем не ставить круглые скобки после new :
let user = new User; //
Пропуск скобок считается плохой практикой, но просто чтобы вы знали, такой синтаксис разрешён спецификацией.
Создание методов в конструкторе
Использование конструкторов для создания объектов даёт большую гибкость. Функции-конструкторы могут иметь параметры, определяющие, как создавать объект и что в него записывать.
Конечно, мы можем добавить к this не только свойства, но и методы.
Например, new User(name) ниже создаёт объект с заданным name и методом sayHi :
function User(name) < this.name = name; this.sayHi = function() < alert( "Меня зовут: " + this.name ); >; > let john = new User("John"); john.sayHi(); // Меня зовут: John /* john = < name: "John", sayHi: function() < . >> */
Для создания сложных объектов есть и более продвинутый синтаксис – классы, который мы рассмотрим позже.
Итого
- Функции-конструкторы или просто конструкторы, являются обычными функциями, но существует общепринятое соглашение именовать их с заглавной буквы.
- Функции-конструкторы следует вызывать только с помощью new . Такой вызов подразумевает создание пустого this в начале и возврат заполненного в конце.
Мы можем использовать конструкторы для создания множества похожих объектов.
JavaScript предоставляет функции-конструкторы для множества встроенных объектов языка: таких как Date , Set , и других, которые нам ещё предстоит изучить.
Мы ещё вернёмся к объектам!
В этой главе мы рассмотрели только основы объектов и конструкторов. Данная информация необходима нам для дальнейшего изучения типов данных и функций в последующих главах.
Как только мы с ними разберёмся, мы вернёмся к объектам для более детального изучения в главах Прототипы, наследование и Классы.
Что вернет функция new string
Функция new string является одной из встроенных функций в различных языках программирования. Ее основной целью является создание нового объекта типа строка.
Конкретное значение, которое возвращает функция new string, зависит от языка программирования, в котором она вызывается. Например, в некоторых языках она возвращает пустую строку (т.е. строку без символов), а в других — строку с некоторым начальным значением.
Узнать, что именно возвращает функция new string в конкретном языке программирования можно из документации или справки по этому языку. В некоторых случаях возвращаемое значение может быть объектом типа строка, который можно использовать для выполнения различных операций со строками, таких как конкатенация, поиск подстроки и других.
Функция new string: что она возвращает?
Функция new string — это оператор, который создает новую строку, то есть некоторый набор символов.
На самом деле, когда мы используем оператор new string, то мы создаем новый объект типа String. Этот объект представляет собой последовательность символов.
Возвращаемое значение функции new string является объектом типа String.
Для наглядности можно сконструировать простой пример:
String str = new String("Пример строки");
System.out.println(str);
В данном примере мы создаем новый объект типа String с помощью оператора new string. В конструктор мы передаем строку «Пример строки». Затем мы выводим значение этой строки на консоль с помощью метода System.out.println().
Функция new string также может использоваться для создания пустой строки путем передачи ей пустого значения. Например:
String emptyStr = new String("");
System.out.println(emptyStr);
В этом случае, функция new string создаст новый объект типа String без каких-либо символов внутри.
Конечно, стоит отметить, что в большинстве случаев нет необходимости использовать оператор new string для создания объектов типа String. Большинство операций со строками можно выполнить с помощью литерала строк или методов класса String.
Например, следующий код создает и инициализирует объект типа String с помощью литерала строки:
String hello = "Привет";
System.out.println(hello);
Литерал строки является сокращенной формой записи и не требует использования оператора new string.
В заключение, функция new string возвращает объект типа String, который представляет собой последовательность символов. Однако в большинстве ситуаций нет необходимости использовать этот оператор, поскольку для работы со строками в Java предусмотрено множество других удобных методов и возможностей.
Простой ответ
Функция new string возвращает новый пустой строковый объект.
Возвращаемое значение
Функция new string возвращает новый объект типа строка. Этот объект является экземпляром класса String и представляет собой последовательность символов.
Новый объект типа строка может быть создан с помощью оператора new и вызова функции String с указанием строки в качестве аргумента, либо с помощью литерала строки, представленного в кавычках.
Примеры создания новых строк:
- var str1 = new String("Hello world!");
- var str2 = "Hello world!";
Обратите внимание, что хотя создание строки с помощью оператора new является допустимым, обычно литералы строки являются более удобным и предпочтительным способом создания строк.
Созданный объект типа строка имеет ряд методов, позволяющих работать со строкой: обрезать, объединять, находить подстроки, заменять символы и т. д.
Примеры использования методов строки:
- str1.length; // возвращает длину строки
- str1.toLowerCase(); // преобразует строку к нижнему регистру
- str1.indexOf("world"); // возвращает индекс первого вхождения подстроки "world"
Возвращаемый объект типа строка можно использовать в различных операциях: присваивание, сравнение, вывод на экран и т. д.
Примеры использования строки в операциях:
- var str3 = str1 + str2; // объединение строк
- if (str1 === str2) < // сравнение строк
- console.log(str1); // вывод строки на экран
Работа с объектами типа строка в JavaScript неразрывно связана с манипуляциями со строками и доступом к их различным свойствам и методам.
Пример использования
Ниже приведен пример использования функции new string :
let str = new String('Hello, world!');
console.log(str);
В данном примере создается новый объект строки с содержимым «Hello, world!». Затем этот объект выводится в консоль. Результатом выполнения данного кода будет:
Полученный объект строки содержит значение «Hello, world!» и имеет все методы и свойства, которые доступны для строк в JavaScript.
Вопрос-ответ
Какую информацию возвращает функция new string?
Функция new string возвращает новую пустую строку.
Что происходит при вызове функции new string?
При вызове функции new string создается и возвращается новая пустая строка.
Можно ли использовать функцию new string для создания строки с определенным значением?
Да, можно использовать функцию new string с аргументами, чтобы создать строку с определенным значением. Например, new string(‘a’, 5) создаст строку из пяти символов ‘a’: «aaaaa».
Создание новых строк в .NET
. NET позволяет создавать строки с помощью простой операции присваивания, а также перегружать конструктор класса для создания строк с помощью нескольких различных параметров. Кроме того, .NET предоставляет в классе System.String несколько методов для создания строковых объектов путем объединения строк, массивов строк или объектов.
Создание строк с помощью присваивания
Самый простой способ создать объект String — присвоить строковый литерал объекту String.
Создание строк с помощью конструктора класса
С помощью перегруженного конструктора класса String можно создавать строки из массивов символов. Кроме того, строки можно создавать путем копирования того или иного знака указанное количество раз.
Методы, возвращающие строки
В следующей таблице перечислено несколько полезных методов, которые возвращают строковые объекты.
| Имя метода | Использовать |
|---|---|
| String.Format | Создание форматированной строки из набора объектов ввода. |
| String.Concat | Создание строк из двух или более строк. |
| String.Join | Создание новой строки с помощью объединения массива строк. |
| String.Insert | Создание новой строки с помощью вставки строки в указанную позицию существующей строки. |
| String.CopyTo | Копирование указанных знаков в строке в указанную позицию в массиве символов. |
Формат
Метод String.Format позволяет создавать форматированные строки и сцеплять строки, представляющие несколько объектов. Этот метод автоматически преобразует в строку любой переданный объект. Например, если приложение должно предоставить пользователю значение Int32 и значение DateTime, с помощью метода Format вы можете соединить их в одну строку для отображения. Сведения о правилах форматирования, используемых в этом методе, см. в разделе Составное форматирование.
В следующем примере метод Format используется для создания строки, содержащей целочисленную переменную.
int numberOfFleas = 12; string miscInfo = String.Format("Your dog has fleas. " + "It is time to get a flea collar. " + "The current universal date is: .", numberOfFleas, DateTime.Now); Console.WriteLine(miscInfo); // The example displays the following output: // Your dog has 12 fleas. It is time to get a flea collar. // The current universal date is: 2008-03-28 13:31:40Z.
Dim numberOfFleas As Integer = 12 Dim miscInfo As String = String.Format("Your dog has fleas. " & _ "It is time to get a flea collar. " & _ "The current universal date is: .", _ numberOfFleas, Date.Now) Console.WriteLine(miscInfo) ' The example displays the following output: ' Your dog has 12 fleas. It is time to get a flea collar. ' The current universal date is: 2008-03-28 13:31:40Z.
В этом примере DateTime.Now выводит текущую дату и время с учетом языка и региональных параметров, связанных с текущим потоком.
Concat
Метод String.Concat позволяет легко создать новый строковый объект из двух или более существующих объектов. Он позволяет использовать независимый от языка способ сцепления строк. Этот метод принимает любой класс, производный от System.Object. В следующем примере создается строка из двух существующих объектов строки и символа разделителя.
string helloString1 = "Hello"; string helloString2 = "World!"; Console.WriteLine(String.Concat(helloString1, ' ', helloString2)); // The example displays the following output: // Hello World!
Dim helloString1 As String = "Hello" Dim helloString2 As String = "World!" Console.WriteLine(String.Concat(helloString1, " "c, helloString2)) ' The example displays the following output: ' Hello World!
Join
Метод String.Join создает строку из массива строк и разделительной строки. Этот метод полезен в случае необходимости сцепления нескольких строк и создания списка, отделенного, например, запятой.
В следующем примере используется пробел для привязки массива строк.
string[] words = ; Console.WriteLine(String.Join(" ", words)); // The example displays the following output: // Hello and welcome to my world!
Dim words() As String = Console.WriteLine(String.Join(" ", words)) ' The example displays the following output: ' Hello and welcome to my world!
Insert
Метод String.Insert создает новую строку, вставляя предоставленную строку в указанную позицию в другой строке. Этот метод использует отсчитываемый от нуля индекс. В следующем примере строка вставляется в пятую позицию индекса MyString , и создается новая строка с этим значением.
string sentence = "Once a time."; Console.WriteLine(sentence.Insert(4, " upon")); // The example displays the following output: // Once upon a time.
Dim sentence As String = "Once a time." Console.WriteLine(sentence.Insert(4, " upon")) ' The example displays the following output: ' Once upon a time.
CopyTo
Метод String.CopyTo копирует элементы строки в массив символов. Можно указать начальный индекс строки и число копируемых символов. Для копирования этому методу необходимы исходный индекс, массив знаков, индекс назначения и число символов. Все индексы отсчитываются от нуля.
В следующем примере мы используем метод CopyTo, чтобы скопировать символы слова Hello из строкового объекта в позицию первого индекса в массиве символов.
string greeting = "Hello World!"; char[] charArray = ; Console.WriteLine("The original character array: ", new string(charArray)); greeting.CopyTo(0, charArray,0 ,5); Console.WriteLine("The new character array: ", new string(charArray)); // The example displays the following output: // The original character array: Where // The new character array: Hello
Dim greeting As String = "Hello World!" Dim charArray() As Char = Console.WriteLine("The original character array: ", New String(charArray)) greeting.CopyTo(0, charArray, 0, 5) Console.WriteLine("The new character array: ", New String(charArray)) ' The example displays the following output: ' The original character array: Where ' The new character array: Hello
См. также
- Базовые операции со строками в .NET Framework
- Составное форматирование
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
The .NET documentation is open source. Provide feedback here.
Обратная связь
Отправить и просмотреть отзыв по
String
Объект String используется, чтобы представить и конструировать последовательность символов.
Синтаксис
Строковые литералы могут быть следующих форм:
'строка текста' "строка текста" "中文 español English हिन्दी العربية português বাংলা русский 日本語 ਪੰਜਾਬੀ 한국어 தமிழ்"
Кроме регулярных печатных символов можно использовать специальные символы, которые можно закодировать, используя нотацию escape-последовательностей:
| Код | Вывод |
|---|---|
| \0 | нулевой символ (символ NUL) |
| \' | одинарная кавычка |
| \" | двойная кавычка |
| \\ | обратный слеш |
| \n | новая строка |
| \r | возврат каретки |
| \v | вертикальная табуляция |
| \t | табуляция |
| \b | забой |
| \f | подача страницы |
| \uXXXX | Юникод-символ |
| \xXX | символ в кодировке Latin-1 |
Либо можно использовать глобальный объект String напрямую:
String(thing) new String(thing)
Параметры
Всё, что может быть преобразовано в строку.
Описание
Строки полезны для хранения данных, которые можно представить в текстовой форме. Некоторые из наиболее частых операций со строками — это проверка их длины, построение строки с помощью операций строковой конкатенации + и +=, проверка на существование или местоположение подстрок с помощью метода indexOf() , либо извлечение подстрок с помощью метода substring() .
Доступ к символам
Существует два способа добраться до конкретного символа в строке. В первом способе используется метод charAt() :
return "кот".charAt(1); // вернёт "о"
Другим способом (введённым в ECMAScript 5) является рассмотрение строки как массивоподобного объекта, в котором символы имеют соответствующие числовые индексы:
return "кот"[1]; // вернёт "о"
При доступе к символам посредством нотации с квадратными скобками, попытка удалить символ, или присвоить значение числовому свойству закончится неудачей, поскольку эти свойства являются незаписываемыми и ненастраиваемыми. Смотрите документацию по методу Object.defineProperty() для дополнительной информации.
Сравнение строк
Разработчики на C имеют для сравнения строк функцию strcmp() . В JavaScript вы просто используете операторы меньше и больше:
var a = "a"; var b = "b"; if (a b) // true print(a + " меньше чем " + b); > else if (a > b) print(a + " больше чем " + b); > else print(a + " и " + b + " равны."); >
Подобный результат также может быть достигнут путём использования метода localeCompare() , имеющегося у всех экземпляров String .
Разница между строковыми примитивами и объектами String
Обратите внимание, что JavaScript различает объекты String и значения строкового примитива (то же самое верно и для объектов Boolean и Number ).
Строковые литералы (обозначаемые двойными или одинарными кавычками) и строки, возвращённые вызовом String в неконструкторном контексте (то есть, без использования ключевого слова new ) являются строковыми примитивами. JavaScript автоматически преобразует примитивы в объекты String , так что на строковых примитивах возможно использовать методы объекта String . В контекстах, когда на примитивной строке вызывается метод или происходит поиск свойства, JavaScript автоматически оборачивает строковый примитив объектом и вызывает на нём метод или ищет в нём свойство.
var s_prim = "foo"; var s_obj = new String(s_prim); console.log(typeof s_prim); // выведет 'string' console.log(typeof s_obj); // выведет 'object'
Строковые примитивы и объекты String также дают разные результаты при использовании глобальной функции eval() . Примитивы, передаваемые в eval() , трактуются как исходный код; объекты же String трактуются так же, как и все остальные объекты, а именно: возвращается сам объект. Например:
var s1 = "2 + 2"; // создаёт строковый примитив var s2 = new String("2 + 2"); // создаёт объект String console.log(eval(s1)); // выведет число 4 console.log(eval(s2)); // выведет строку '2 + 2'
По этим причинам код может сломаться, если он получает объекты String , а ожидает строковые примитивы, хотя в общем случае вам не нужно беспокоиться о различиях между ними.
Объект String также всегда может быть преобразован в его примитивный аналог при помощи метода valueOf() .
.log(eval(s2.valueOf())); // выведет число 4
Свойства
Хранит длину строки. Только для чтения.
Методы
Возвращает строку, созданную из указанной последовательности значений Юникода.
Возвращает строку, созданную из указанной последовательности кодовых точек Юникода.
Возвращает строку, созданную из сырой шаблонной строки.
Общие методы объекта String
Методы экземпляров String также доступны в Firefox как часть JavaScript 1.6 (который не является частью стандарта ECMAScript) на объекте String , что позволяет применять эти методы к любому объекту:
var num = 15; console.log(String.replace(num, /5/, "2"));
Общие методы также доступны для объекта Array .
Следующая прослойка позволяет использовать их во всех браузерах:
/*globals define*/ // Предполагаем, что все требуемые методы экземпляров String уже присутствуют // (для них так же можно использовать полифилы, если их нет) (function () "use strict"; var i, // Мы могли построить массив методов следующим образом, однако метод // getOwnPropertyNames() нельзя реализовать на JavaScript: // Object.getOwnPropertyNames(String).filter(function(methodName) // return typeof String[methodName] === 'function'; // >); methods = [ "quote", "substring", "toLowerCase", "toUpperCase", "charAt", "charCodeAt", "indexOf", "lastIndexOf", "startsWith", "endsWith", "trim", "trimLeft", "trimRight", "toLocaleLowerCase", "toLocaleUpperCase", "localeCompare", "match", "search", "replace", "split", "substr", "concat", "slice", ], methodCount = methods.length, assignStringGeneric = function (methodName) var method = String.prototype[methodName]; String[methodName] = function (arg1) return method.apply(arg1, Array.prototype.slice.call(arguments, 1)); >; >; for (i = 0; i methodCount; i++) assignStringGeneric(methods[i]); > >)();
Примеры
Пример: преобразование в строку
Объект String можно использовать как «безопасную» альтернативу методу toString() , так как хотя он обычно и вызывает соответствующий метод toString() , он также работает и для значений null и undefined . Например:
var outputStrings = []; for (var i = 0, n = inputValues.length; i n; ++i) outputStrings.push(String(inputValues[i])); >
Спецификации
| Specification |
|---|
| ECMAScript Language Specification # sec-string-objects |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 7 авг. 2023 г. by MDN contributors.
Your blueprint for a better internet.
MDN
Support
- Product help
- Report an issue
Our communities
Developers
- Web Technologies
- Learn Web Development
- MDN Plus
- Hacks Blog
- Website Privacy Notice
- Cookies
- Legal
- Community Participation Guidelines
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998– 2023 by individual mozilla.org contributors. Content available under a Creative Commons license.
