Как преобразовать объект в строку javascript
Перейти к содержимому

Как преобразовать объект в строку javascript

  • автор:

Object.prototype.toString()

Метод toString() возвращает строку, представляющую объект.

Интерактивный пример

Синтаксис

obj.toString()

Возвращаемое значение

Строка, представляющая объект.

Описание

Каждый объект имеет метод toString() , автоматически вызывающийся, когда объект должен быть представлен в виде текстового значения или когда объект участвует в выражении, где ожидается строка. По умолчанию, метод toString() наследуется каждым объектом, произошедшим от объекта Object . Если этот метод не переопределён в пользовательском объекте, toString() возвращает строку вида «[object тип]», где тип — это тип объекта. Это иллюстрирует следующий код:

var o = new Object(); o.toString(); // вернёт [object Object] 

Примечание: начиная с JavaScript 1.8.5, метод toString() , вызванный на null , возвращает строку [object Null] , а вызванный для undefined , возвращает строку [object Undefined] , как определено в 5-м издании ECMAScript и последующих исправлениях. Смотрите пример использование метода toString() для определения типа объекта.

Примеры

Пример: переопределение метода toString по умолчанию

Вы можете создать функцию, которая будет вызываться вместо метода toString() по умолчанию. Метод toString() не принимает аргументов и должен возвращать строку. Создаваемый вами метод toString() может возвращать любую строку, какую вы захотите, но он будет наиболее полезным, если будет возвращать информацию об объекте.

Следующий код определяет объект Dog и создаёт theDog , объект типа Dog :

function Dog(name, breed, color, sex)  this.name = name; this.breed = breed; this.color = color; this.sex = sex; > theDog = new Dog("Болтушка", "лабрадор", "шоколадный", "девочка"); 

Если вы вызовете метод toString() на этом пользовательском объекте, он вернёт значение по умолчанию, унаследованное от Object :

.toString(); // вернёт [object Object] 

Следующий код создаёт и присваивает метод dogToString() , переопределяющий метод toString() по умолчанию. Эта функция генерирует строку, содержащую кличку, породу, цвет и пол объекта, в форме » свойство = значение; «.

Dog.prototype.toString = function dogToString()  var ret = "Собачка " + this.name + " - " + this.sex + ", " + this.color + " " + this.breed; return ret; >; 
Dog.prototype.toString = function dogToString()  return `Dog $this.name> is a $this.sex> $this.color> $this.breed>`; >; 

После объявления этого метода, при любом использовании переменной theDog в строковом контексте, JavaScript будет автоматически вызывать функцию dogToString() , возвращающую следующую строку:

Собачка Болтушка - девочка, шоколадный лабрадор

Пример: использование метода toString для определения типа объекта

Метод toString() можно использовать с любым объектом для получения его класса. Для использования метода Object.prototype.toString() с любым объектом, вам необходимо вызвать на нём функции Function.prototype.call() или Function.prototype.apply() , передав объект, который вы хотите исследовать, первым параметром thisArg .

var toString = Object.prototype.toString; toString.call(new Date()); // [object Date] toString.call(new String()); // [object String] toString.call(Math); // [object Math] // Начиная с JavaScript 1.8.5 toString.call(undefined); // [object Undefined] toString.call(null); // [object Null] 

Спецификации

Specification
ECMAScript Language Specification
# sec-object.prototype.tostring

Совместимость с браузерами

BCD tables only load in the browser

Смотрите также

  • Object.prototype.toSource()
  • Object.prototype.valueOf()
  • Number.prototype.toString()
  • Symbol.toPrimitive

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.

JSON.stringify()

Обычно JSON используется для обмена данными с сервером.

При отправке на сервер данные всегда передаются в виде строки.

Чтобы преобразовать объект JavaScript в строку, используется функция JSON.stringify().

Преобразование объекта JavaScript в строку

Допустим, что у нас есть следующий объект JavaScript:

 var obj = < "name":"John", "age":30, "city":"New York">; 

Воспользуемся JavaScript функцией JSON.stringify() и преобразуем его в строку:

 var myJSON = JSON.stringify(obj); 

В результате у нас будет строка, записанная по правилам JSON.

Теперь myJSON — готовая к отправке на сервер строка:

 var obj = < "name":"John", "age":30, "city":"New York">; var myJSON = JSON.stringify(obj); document.getElementById("demo").innerHTML = myJSON; 

Преобразование массива JavaScript в строку

Также, мы можем преобразовывать массивы JavaScript в JSON строки.

Допустим, что у нас есть следующий объект JavaScript:

 var arr = [ "John", "Peter", "Sally", "Jane" ]; 

Воспользуемся JavaScript функцией JSON.stringify() и преобразуем его в строку:

 var myJSON = JSON.stringify(arr); 

В результате у нас будет строка, записанная по правилам JSON.

Теперь myJSON — готовая к отправке на сервер строка:

 var arr = [ "John", "Peter", "Sally", "Jane" ]; var myJSON = JSON.stringify(arr); document.getElementById("demo").innerHTML = myJSON; 

Преобразование дат в строку

Объекты даты и времени (тип Date) нельзя использовать в JSON. Функция JSON.stringify() позволяет преобразовать любой объект даты в JSON строку.

 var obj = < "name":"John", "today":new Date(), "city":"New York">; var myJSON = JSON.stringify(obj); document.getElementById("demo").innerHTML = myJSON; 

При получении данных с сервера вы сможете преобразовать строку в объект даты обратно.

Преобразование функций в строку

Функции нельзя использовать в JSON.

Функция JSON.stringify() удалит любую функцию из объекта JavaScript, и ключ, и значение:

 var obj = < "name":"John", "age":function () , "city":"New York">; var myJSON = JSON.stringify(obj); document.getElementById("demo").innerHTML = myJSON; 

Этого можно избежать, если преобразовать функцию в строку до того, как использовать функцию JSON.stringify().

 var obj = < "name":"John", "age":function () , "city":"New York">; obj.age = obj.age.toString(); var myJSON = JSON.stringify(obj); document.getElementById("demo").innerHTML = myJSON; 

Внимание! Следует избегать использования функций в JSON, так как в этом случае теряется их область видимости, а для обратного преобразования приходится использовать функцию eval(), что нежелательно.

Поддержка браузерами

Функция JSON.stringify() включена во все основные браузеры и в последний стандарт ECMAScript (JavaScript).

Преобразование объекта в строку в JavaScript

Поскольку объекты JavaScript состоят из атрибутов в виде пар ключ-значение, заключенных в фигурные скобки, преобразование в строку должно быть корректным, особенно если нужна возможность обратного конвертирования. Преобразование может пригодиться, когда речь идет о хранении данных в локальном хранилище или базе данных.

Существуют различные способы преобразования объекта JavaScript в строку.

JSON.stringify()

Это мощная и часто используемая функция для преобразования объекта в строку JSON.

let object = < name: 'Иван', age: 45, friends: ['Петр', 'Олег'] >; JSON.stringify(object); // ''

Object.entries()

Object.entries() — это встроенная функция JavaScript, которая разбивает объект на массив из пар ключ-значение. Как следствие, мы можем перебрать такой массив и вручную преобразовать объект JavaScript в строку. С чем нужно определиться — какой разделитель будет между парами и элементами пар.

let object = < name: 'Иван', age: 45 >; let arrayOfArrays = Object.entries(object); // [['name', 'Иван'], ['age', 45]] let arrayOfStrings = arrayOfArrays.map( item => item.join(':')); // ['name:Иван', 'age:45'] let string = arrayOfStrings.join(','); // 'name:Иван,age:45' let searchParameters = '?' + Object.entries(object).map( item => item.join('=')).join('&'); // '?name=Иван&age=45'

Object.keys()

Object.keys() возвращает массив, содержащий все ключи объекта. После мы можем перебрать их с помощью цикла и сформировать строчную версию объекта.

let object = < name: 'Иван', age: 45 >; let arrayOfKeys = Object.keys(object); // ['name', 'age'] let string = ''; for (key of arrayOfKeys) < string += `$:$,`; >; console.log(string); // => 'name:Иван,age:45,'

Преобразование объектов: toString и valueOf

Материал на этой странице устарел, поэтому скрыт из оглавления сайта.

Более новая информация по этой теме находится на странице https://learn.javascript.ru/object-toprimitive.

Ранее, в главе Преобразование типов для примитивов мы рассматривали преобразование типов для примитивов. Теперь добавим в нашу картину мира объекты.

Бывают операции, при которых объект должен быть преобразован в примитив.

  • Строковое преобразование – если объект выводится через alert(obj) .
  • Численное преобразование – при арифметических операциях, сравнении с примитивом.
  • Логическое преобразование – при if(obj) и других логических операциях.

Рассмотрим эти преобразования по очереди.

Логическое преобразование

Проще всего – с логическим преобразованием.

Любой объект в логическом контексте – true , даже если это пустой массив [] или объект <> .

Строковое преобразование

Строковое преобразование проще всего увидеть, если вывести объект при помощи alert :

var user = < firstName: 'Василий' >; alert( user ); // [object Object]

Как видно, содержимое объекта не вывелось. Это потому, что стандартным строковым представлением пользовательского объекта является строка «[object Object]» .

Такой вывод объекта не содержит интересной информации. Поэтому имеет смысл его поменять на что-то более полезное.

Если в объекте присутствует метод toString , который возвращает примитив, то он используется для преобразования.

var user = < firstName: 'Василий', toString: function() < return 'Пользователь ' + this.firstName; >>; alert( user ); // Пользователь Василий

Результатом toString может быть любой примитив

Метод toString не обязан возвращать именно строку.

Его результат может быть любого примитивного типа. Например, это может быть число, как в примере ниже:

var obj = < toString: function() < return 123; >>; alert( obj ); // 123

Поэтому мы и называем его здесь «строковое преобразование», а не «преобразование к строке».

Все объекты, включая встроенные, имеют свои реализации метода toString , например:

alert( [1, 2] ); // toString для массивов выводит список элементов "1,2" alert( new Date ); // toString для дат выводит дату в виде строки alert( function() <> ); // toString для функции выводит её код

Численное преобразование

Для численного преобразования объекта используется метод valueOf , а если его нет – то toString :

var room = < number: 777, valueOf: function() < return this.number; >, toString: function() < return this.number; >>; alert( +room ); // 777, вызвался valueOf delete room.valueOf; // valueOf удалён alert( +room ); // 777, вызвался toString

Метод valueOf обязан возвращать примитивное значение, иначе его результат будет проигнорирован. При этом – не обязательно числовое.

У большинства объектов нет valueOf

У большинства встроенных объектов такого valueOf нет, поэтому численное и строковое преобразования для них работают одинаково.

Исключением является объект Date , который поддерживает оба типа преобразований:

alert( new Date() ); // toString: Дата в виде читаемой строки alert( +new Date() ); // valueOf: кол-во миллисекунд, прошедших с 01.01.1970

Детали спецификации

Если посмотреть в стандарт, то в пункте 15.2.4.4 говорится о том, что valueOf есть у любых объектов. Но он ничего не делает, просто возвращает сам объект (непримитивное значение!), а потому игнорируется.

Две стадии преобразования

Итак, объект преобразован в примитив при помощи toString или valueOf .

Но на этом преобразования не обязательно заканчиваются. Вполне возможно, что в процессе вычислений этот примитив будет преобразован во что-то другое.

Например, рассмотрим применение к объекту операции == :

var obj = < valueOf: function() < return 1; >>; alert( obj == true ); // true

Объект obj был сначала преобразован в примитив, используя численное преобразование, получилось 1 == true .

Далее, так как значения всё ещё разных типов, применяются правила преобразования примитивов, результат: true .

То же самое – при сложении с объектом при помощи + :

var obj = < valueOf: function() < return 1; >>; alert( obj + "test" ); // 1test

Или вот, для разности объектов:

var a = < valueOf: function() < return "1"; >>; var b = < valueOf: function() < return "2"; >>; alert( a + b ); // "12" alert( a - b ); // "1" - "2" = -1

Исключение: Date

Объект Date по историческим причинам является исключением.

Бинарный оператор плюс + обычно использует численное преобразование и метод valueOf . Как мы уже знаем, если подходящего valueOf нет (а его нет у большинства объектов), то используется toString , так что в итоге преобразование происходит к строке. Но если есть valueOf , то используется valueOf . Выше в примере как раз a + b это демонстрируют.

У объектов Date есть и valueOf – возвращает количество миллисекунд, и toString – возвращает строку с датой.

…Но оператор + для Date использует именно toString (хотя должен бы valueOf ).

Это и есть исключение:

// бинарный плюс для даты toString, для остальных объектов valueOf alert( new Date + "" ); // "строка даты"

Других подобных исключений нет.

Как испугать Java-разработчика

В языке Java (это не JavaScript, другой язык, здесь приведён для примера) логические значения можно создавать, используя синтаксис new Boolean(true/false) , например new Boolean(true) .

В JavaScript тоже есть подобная возможность, которая возвращает «объектную обёртку» для логического значения.

Эта возможность давно существует лишь для совместимости, она и не используется на практике, поскольку приводит к странным результатам. Некоторые из них могут сильно удивить человека, не привыкшего к JavaScript, например:

var value = new Boolean(false); if (value) < alert( true ); // сработает! >

Почему запустился alert ? Ведь в if находится false … Проверим:

var value = new Boolean(false); alert( value ); // выводит false, все ок.. if (value) < alert( true ); // ..но тогда почему выполняется alert в if . >

Дело в том, что new Boolean – это не примитивное значение, а объект. Поэтому в логическом контексте он преобразуется к true , в результате работает первый пример.

А второй пример вызывает alert , который преобразует объект к строке, и он становится «false» .

В JavaScript вызовы new Boolean/String/Number не используются, а используются простые вызовы соответствующих функций, они преобразуют значение в примитив нужного типа, например Boolean(val) === !!val .

Итого

  • В логическом контексте объект – всегда true .
  • При строковом преобразовании объекта используется его метод toString . Он должен возвращать примитивное значение, причём не обязательно именно строку.
  • Для численного преобразования используется метод valueOf , который также может возвратить любое примитивное значение. У большинства объектов valueOf не работает (возвращает сам объект и потому игнорируется), при этом для численного преобразования используется toString .

Полный алгоритм преобразований есть в спецификации ECMAScript, смотрите пункты 11.8.5, 11.9.3, а также 9.1 и 9.3.

Заметим, для полноты картины, что некоторые тесты знаний в интернет предлагают вопросы типа:

<>[0] // чему равно? <> + <> // а так?

Если вы запустите эти выражения в консоли, то результат может показаться странным. Подвох здесь в том, что если фигурные скобки <. >идут не в выражении, а в основном потоке кода, то JavaScript считает, что это не объект, а «блок кода» (как if , for , но без оператора просто группировка команд вместе используется редко).

Вот блок кода с командой:

А если команду изъять, то будет пустой блок <> , который ничего не делает. Два примера выше как раз содержат пустой блок в начале, который ничего не делает. Иначе говоря:

<>[0] // то же что и: [0] <> + <> // то же что и: + <>

То есть, такие вопросы – не на преобразование типов, а на понимание, что если < . >находится вне выражений, то это не объект, а блок.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *