Как проверить наличие пустого объекта JavaScript?


3116

После AJAX-запроса мое приложение иногда может возвращать пустой объект, например:

var a = {};

Как я могу проверить, так ли это?


7
Вы используете скрипт JSON.js? Или любая другая библиотека JSON. Затем вы можете использовать функцию JSON.encode () для преобразования var в строку, а затем протестировать ее.
Thevs

if( Object.entries(a).length > 0){ //do }
Мухаммед Шахзад

Ответы:


5431

ECMA 5+ :

// because Object.keys(new Date()).length === 0;
// we have to do some additional check
Object.keys(obj).length === 0 && obj.constructor === Object

Обратите внимание, что это создает ненужный массив (возвращаемое значение keys ).

Pre-ECMA 5:

function isEmpty(obj) {
  for(var prop in obj) {
    if(obj.hasOwnProperty(prop)) {
      return false;
    }
  }

  return JSON.stringify(obj) === JSON.stringify({});
}

JQuery :

jQuery.isEmptyObject({}); // true

Лодаш :

_.isEmpty({}); // true

Подчеркнуть :

_.isEmpty({}); // true

Хук

Hoek.deepEqual({}, {}); // true

ExtJS

Ext.Object.isEmpty({}); // true

AngularJS (версия 1)

angular.equals({}, {}); // true

Ramda

R.isEmpty({}); // true

22
Вот тест производительности между jQuery и подчеркиванием jsperf.com/isempty-vs-isemptyobject/6
Михаил

20
Object.keys(new Date()).length === 0; поэтому этот ответ может вводить в заблуждение.
cjbarth

6
Вместо того , чтобы stringifying вещи , которые вы также можете воспользоваться этим фактом: (new Date()).constructor === Dateили , наоборот, ({}).constructor === Object.
Джон Нельсон

2
angular.equals ({}, {});
Джереми А. Уэст

11
Object.keys()не проверяет не перечисляемые свойства или символы. Вам нужно использовать Object.getOwnPropertyNames()и Object.getOwnPropertySymbols()вместо. Кроме того, Object.getPrototypeOf()это правильный способ получить прототип объекта. obj.constructorможет быть легко подделан. Пример: function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true.
Джесси

863

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

function isEmpty(obj) {
    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            return false;
    }

    return true;
}

Если доступна поддержка ECMAScript 5 , вы можете использовать Object.keys()вместо:

function isEmpty(obj) {
    return Object.keys(obj).length === 0;
}

56
Это работает нормально или проще: function isEmpty (object) {for (var i in object) {return true; } вернуть ложь; }
Николас Крейдберг

36
Разве в этой функции нельзя изменить истину и ложь?
Намтакс

25
@namtax: нет - функция названа isEmpty(), поэтому она должна вернуться, falseесли у нее есть свойство
Кристоф

6
пустой объект расширит класс объекта по умолчанию, но если прототип объекта будет изменен, ваша упрощенная функция не будет выполнена, учтите: Object.prototype.a = 'hi'; var obj = {}; оповещения (obj.a); // выводит "hi" isEmpty (obj) // возвращает false
venimus

29
Вы не должны использовать второй пример, поскольку это O (n) сложность времени и O (n) сложность пространства, тогда как первый - O (1).
Брайан

572

Для тех из вас, кто имеет ту же проблему, но использует jQuery, вы можете использовать jQuery.isEmptyObject .


43
ПРИВЕТ! Я просто потратил несколько часов на отладку проблем IE 8 и обнаружил, что проблема была в jQuery.isEmptyObject. Возвращает true, если объект пуст.
MFD3000

162
Почему вы публикуете ответ, включая jQuery, если вопрос вообще не касается jQuery?
Эру

47
Я знаю, что это старый комментарий, но мне интересно ваш вопрос @ MFD3000, потому что в документе написано: возвращает истину, если объект пуст (как следует из названия)
Александр Фишер

21
включение jQuery для такой основной задачи - это не то, что я бы назвал правильным ответом. Это правда, что в настоящее время jQuery почти повсеместен, но все же мы не должны забывать, что он построен на очень способном языке.
Пабло Мешер

54
Типичный JS снобизм в этих комментариях. Всем известно, что огромная доля JavaScript в Интернете написана на jQuery, поэтому вполне приемлемо предоставить здесь решение для jQuery, если в нем уже есть встроенный метод для тестирования объектов. Вероятно, тысячи разработчиков, ищущих помощи, сочтут этот ответ полезным. Никто не сказал, что это единственный способ сделать это. Я замечаю, как никто не ведет себя так, как элитар, в отношении парня, который разместил решение для использования underscore.js...
BadHorsie

278

Это мое предпочтительное решение:

var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty

1
Проблема совместимости с IE9. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
doublejosh

3
@Jero Franzani: нет, это не так
nikoskip

Длина Object.keys ({}). В 10 раз медленнее, чем опция (for ... in ...) - я советую избегать ее в качестве способа проверки, является ли объект пустым.
Давидадас

10
Object.keys(new Date()).length === 0; поэтому этот ответ может вводить в заблуждение.
cjbarth

new Date()это не объект. nd = new Date(); nd.constructor === Object;результаты в false.
Pors

204

Ты можешь использовать Underscore.js .

_.isEmpty({}); // true

19
Или вы можете использовать lodash is empty ( lodash.com/docs#isEmpty ), но чем это отличается от использования решения jQuery - вам все равно нужно установить дополнительную библиотеку. Я думаю, что намерение - ванильное решение JavaScript.
tfmontague

10
Другое дело, если вы хотите использовать JS на сервере с Node.js. Мало кто захочет использовать jQuery (интерфейсную библиотеку, используемую в основном для манипуляций с DOM) на серверной части.
Нан

3
Подчеркивание @tfmontague очень распространено в нодовых приложениях, почти такое же вездесущее, как jQ на стороне клиента. У меня уже было необходимое подчеркивание, но я не осознавал, что у него есть эта функция
rw-nandemo

5
Подчеркивание заменяется на lodash. Используйте это вместо этого.
demisx

2
Только будьте осторожны с типами Дата, IsEmpty всегда возвращает истину для даты, см github.com/jashkenas/underscore/issues/445
Mentat

116
if(Object.getOwnPropertyNames(obj).length === 0){
  //is empty
}

см. http://bencollier.net/2011/04/javascript-is-an-object-empty/


5
Это включает в себя не перечислимые свойства, в случае, если вы заботитесь.

Длина Object.getOwnPropertyNames ({}). Длина в 10 раз медленнее, чем опция (for ... in ...) - я советую избегать ее в качестве способа проверки, является ли объект пустым.
Давидадас

4
Object.getOwnPropertyNames(new Date()).length === 0; поэтому этот ответ может вводить в заблуждение.
cjbarth

80

Как насчет использования JSON.stringify? Это почти доступно во всех современных браузерах.

function isEmptyObject(obj){
    return JSON.stringify(obj) === '{}';
}

23
return (JSON.stringify (obj) == '{}')
Вик

26
Это медленно и скорость имеет значение для такого рода утилит. Быстрый тест производительности здесь: jsperf.com/empty-object-test

1
Это очень медленный вариант - я предлагаю вместо этого использовать (для ... in)
davidhadas

2
И это не работает для объектов, которые содержат функции.
Феликс Клинг

1
Он также выдаст ошибку, если в объекте есть круговая ссылка. Так что это медленно, ненадежно и может генерировать ошибки и ломать все остальное. Нет причин использовать это когда-либо.
Бурак

62

Я просто столкнулся с подобной ситуацией. Я не хотел использовать JQuery, и хотел сделать это, используя чистый Javascript.

И то, что я сделал, использовало следующее условие, и оно сработало для меня.

var obj = {};
if(JSON.stringify(obj) === '{}') { //This will check if the object is empty
   //Code here..
}

Для не равно, используйте это: JSON.stringify(obj) !== '{}'

Проверьте это JSFiddle


4
Сбой для объектов с круговыми ссылками, поскольку JSON.stringify специально выдает исключение для них.
Педро Монтото Гарсия

1
@ PedroMontotoGarcía Хорошо, а как пустой объект будет иметь циклическую ссылку?
KthProg

8
Если объект не пустой (и он должен работать для них тоже).
Педро Монтото Гарсия

Кажется, это уже упоминалось @Ateszki и является одним из самых медленных способов проверить, не является ли объект пустым.
cwadding

Ах, да .. Я пропустил это. Я столкнулся с ситуацией, когда я хотел достичь этого javascript, и, подумав немного, я разобрался с этим. @Ateszki, даже я, хоть ты и сделал. :-) Кстати, было много ответов на этот вопрос, и поэтому я пропустил ваш ответ.
Аниш Наир

60

Старый вопрос, но только что был вопрос. Включение JQuery не очень хорошая идея, если ваша единственная цель - проверить, не является ли объект пустым. Вместо этого просто углубитесь в код JQuery , и вы получите ответ:

function isEmptyObject(obj) {
    var name;
    for (name in obj) {
        if (obj.hasOwnProperty(name)) {
            return false;
        }
    }
    return true;
}

5
Это полезно, только если какой-то другой процесс не добавил прототип к вашему базовому объекту. Чтобы это действительно работало, вам нужно протестировать obj.hasOwnProperty (name)
mpemburn

1
Это ничего не добавляет к ответу Кристофа от 2009 года.
Дан Даскалеску

39

Существует простой способ, если вы используете более новый браузер. Object.keys(obj).length == 0


1
Откуда берется keysсобственность?


1
Как вышеупомянутый комментарий может иметь 4 отзыва? Да, Object.keysэто стандартный метод, но у объектов нет свойства keys. Таким образом, этот код будет сообщать о любом объекте как о пустом, за исключением того, что случайно получено свойство, имя которого keyимеет значение, которое снова в качестве свойства, lengthкоторое не равно нулю. Ужасный!
scravy

Object.keys(new Date()).length === 0; поэтому этот ответ может вводить в заблуждение.
cjbarth

11
@scravy Object - это класс Object. У объекта есть статический метод с именем 'keys', который принимает объект в качестве аргумента. Этот метод возвращает массив строк, где строки являются именами свойств. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Sgnl

35

Представление

Сегодня 2020.01.17 я выполняю тесты на MacO HighSierra 10.13.6 на Chrome v79.0, Safari v13.0.4 и Firefox v72.0 для выбранных решений.

Выводы

  • решения на основе for-in(A, J, L, M) являются самыми быстрыми
  • решения на основе JSON.stringify(B, K) являются медленными
  • также неожиданно решение на основе Object(N) является медленным

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

подробности

Ниже во фрагменте представлены 15 решений. Если вы хотите запустить тест производительности на вашем компьютере, нажмите ЗДЕСЬ .

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


многое из этого не имеет смысла, потому что вы основываете все на возврате ложных и или истинных. Иногда программированию нужен оператор if или троичный оператор. просто к сведению
Кристиан Мэтью

1
Это лучший ответ, спасибо, первое решение работает как очарование
Карлос Хесус Аранчибия Таборга

33

Использование Object.keys (obj) .length (как предложено выше для ECMA 5+) в 10 раз медленнее для пустых объектов! сохранить с старой школы (для ... в) вариант.

Протестировано под Node, Chrome, Firefox и IE 9, становится очевидным, что для большинства случаев использования:

  • (для ... в ...) это самый быстрый вариант для использования!
  • Object.keys (obj) .length в 10 раз медленнее для пустых объектов
  • JSON.stringify (obj) .length всегда самый медленный (не удивительно)
  • Object.getOwnPropertyNames (obj) .length занимает больше времени, чем Object.keys (obj) .length может быть намного длиннее в некоторых системах.

В конечном итоге, используйте:

function isEmpty(obj) { 
   for (var x in obj) { return false; }
   return true;
}

или

function isEmpty(obj) {
   for (var x in obj) { if (obj.hasOwnProperty(x))  return false; }
   return true;
}

См. Подробные результаты тестирования и тестовый код на странице Пусто ли объект?


Object.keysмедленно, но меньше кода. На маленькой странице, где это называется ... может быть, в 10 раз ... Будет ли это все еще медленнее, учитывая дополнительное время разбора дополнительного кода?
Янки

32

Вы можете проверить количество ключей объекта:

if (Object.keys(a).length > 0) {
    // not empty
}

8
Зачем вам добавлять комментарий к ответу, который уже был дан, и давать худший ответ? stackoverflow.com/a/32108184/4229159 и это первый ответ от апреля
Алехандро

Как, если у меня есть очень большой объект, и я делаю это в каждом цикле, чтобы посмотреть, был ли объект пуст?
StefansArya

27
  1. Просто обходной путь. Может ли ваш сервер генерировать какое-то специальное свойство в случае отсутствия данных?

    Например:

    var a = {empty:true};

    Тогда вы можете легко проверить это в своем коде обратного вызова AJAX.

  2. Еще один способ проверить это:

    if (a.toSource() === "({})")  // then 'a' is empty

РЕДАКТИРОВАТЬ : Если вы используете любую библиотеку JSON (например, JSON.js), то вы можете попробовать функцию JSON.encode () и проверить результат по пустой строке значения.


6
toSource()не является стандартным и не работает в IE или Opera (и, возможно, в других браузерах, которые я не проверял)
Christoph

4
@Thevs: возможно, у вас другая копия текущей версии ECMA-262, но у меня нет toSourceсвойства в разделе 15.2.4; согласно MDC, он был представлен в JS1.3 (т.е. Netscape Navigator 4.06), но его нет в ECMA-262, 3-е издание!
Кристоф

4
@Thevs: ну, по крайней мере, 2 крупных производителя браузеров не внедрили его, так что это вряд ли де-факто-стандарт, и, поскольку он не в ECMA-262, он тоже не настоящий ...
Кристоф

4
Даже когда это работает, toSource()это ужасный способ сделать это (как есть JSON.encode()). Нужно создать строку, представляющую весь ваш объект, чтобы просто проверить, пустой ли он. Преобразование вещей в строки сопряжено с дополнительными затратами, но, кроме того, потребуется преобразовать миллион вещей, если у вашего объекта есть миллион свойств, а если вы просто посмотрите на одно, вы узнаете, что он не пустой.
Джаспер

4
@Thevs накладные расходы больше, даже если они могут быть (я не уверен, что это при всех обстоятельствах) в том же порядке. Тем не менее, этот ответ включает в себя возвращение ложного, как только будет найдено другое свойство, что делает историю все вместе ...
Джаспер

25

Я создал полную функцию, чтобы определить, является ли объект пустым.

Оно использует Object.keys из ECMAScript 5 (ES5) функциональности , если это возможно , чтобы достичь максимальной производительности (см таблицу совместимости ) и резервные объявления к наиболее совместимый подход для более старых двигателей (браузеры).

Решение

/**
 * Returns true if specified object has no properties,
 * false otherwise.
 *
 * @param {object} object
 * @returns {boolean}
 */
function isObjectEmpty(object)
{
    if ('object' !== typeof object) {
        throw new Error('Object must be specified.');
    }

    if (null === object) {
        return true;
    }

    if ('undefined' !== Object.keys) {
        // Using ECMAScript 5 feature.
        return (0 === Object.keys(object).length);
    } else {
        // Using legacy compatibility mode.
        for (var key in object) {
            if (object.hasOwnProperty(key)) {
                return false;
            }
        }
        return true;
    }
}

Вот суть этого кода.

А вот и JSFiddle с демонстрацией и простым тестом.

Надеюсь, это кому-нибудь поможет. Ура!


3
Это не подходит для nullобъекта.

Привет @torazaburo! Спасибо, что обратили внимание! Я обновил все источники с правильной реализацией.
Слава Фомин II

1
Длина Object.keys ({}). В 10 раз медленнее, чем опция (for ... in ...) - я советую избегать ее в качестве способа проверки, является ли объект пустым.
Давидадас

1
Object.keys(new Date()).length === 0; поэтому этот ответ может вводить в заблуждение.
cjbarth

19

Я использую это.

function isObjectEmpty(object) {
  var isEmpty = true;
  for (keys in object) {
     isEmpty = false;
     break; // exiting since we found that the object is not empty
  }
  return isEmpty;
}

Например:

var myObject = {}; // Object is empty
var isEmpty  = isObjectEmpty(myObject); // will return true;

// populating the object
myObject = {"name":"John Smith","Address":"Kochi, Kerala"}; 

// check if the object is empty
isEmpty  = isObjectEmpty(myObject); // will return false;

отсюда

Обновить

ИЛИ

Вы можете использовать реализацию jQuery isEmptyObject

function isEmptyObject(obj) {
  var name;
  for (name in obj) {
    return false;
  }
  return true;
}

Привет. когда вы проверяете эту функцию с числом или логическим значением true или false, возвращайте значение true, и это неверный результат. isObjectEmpty (правда). isObjectEmpty (ложь). isObjectEmpty (1)
иман

2
Мы проверяем, является ли объект пустым, а не является ли тип данных объектом. В вашем случае, чтобы проверить, является ли это объектом, нам нужно что-то вроде if (typeof a === "object") {...}
kiranvj

15

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

Скрипт работает на ES6.

const isEmpty = (obj) => {
    if (obj === null ||
        obj === undefined ||
        Array.isArray(obj) ||
        typeof obj !== 'object'
    ) {
        return true;
    }
    return Object.getOwnPropertyNames(obj).length === 0;
};
console.clear();
console.log('-----');
console.log(isEmpty(''));           // true
console.log(isEmpty(33));           // true
console.log(isEmpty([]));           // true
console.log(isEmpty({}));           // true
console.log(isEmpty({ length: 0, custom_property: [] })); // false
console.log('-----');
console.log(isEmpty('Hello'));      // true
console.log(isEmpty([1, 2, 3]));    // true
console.log(isEmpty({ test: 1 }));  // false
console.log(isEmpty({ length: 3, custom_property: [1, 2, 3] })); // false
console.log('-----');
console.log(isEmpty(new Date()));   // true
console.log(isEmpty(Infinity));     // true
console.log(isEmpty(null));         // true
console.log(isEmpty(undefined));    // true


15

Согласно ES2017 спецификации на Object.entries () , проверка просто с помощью любого современного browser--

Object.entries({}).length === 0

3
Есть ли польза от использования этого Object.keysили Object.values?
faintsignal

@faintsignal, используя те, прекрасно. Я просто добавил записи, так как не нашел его в комментариях.
Викрант

13
function isEmpty(obj) {
  for(var i in obj) { return false; }
  return true;
}

4
Это также сообщит об истинности, когда, например, библиотека JavaScript расширяется Objectс помощью метода через цепочку прототипов, потому что это перечислимо, и for inоператор проходит через перечисляемые свойства.
viam0Zah

12

jQuery имеет специальную функцию isEmptyObject()для этого случая:

jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: "bar" }) // false

Узнайте больше на http://api.jquery.com/jQuery.isEmptyObject/


12

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

typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])

1
Что делать, если первый ключ возвращает falseзначение? результат будет falseневерным.
Джимми Обонио Абор

Я проверял это. Можете привести рабочий пример?
Тудор Морар,

1
это коротко и кратко, но приведет к ошибке во время выполнения, если объект не определен
Мринмой

11

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

for(key in obj){
   //your work here.
 break;
}

Разработанный в ES5 , проще говоря, вы можете проверить длину ключей объекта, используя Object.Keysметод, который принимает ваш объект в качестве параметра:

if(Object.keys(obj).length > 0){
 //do your work here
}

Или, если вы используете Lodash (вы должны быть) тогда.

 _.isEmpty(obj) //==true or false

Хотя это правильно, как нечетный способ сделать оператор if - это, вероятно, запутает кого-то, кто будет поддерживать код после вас.
Сорен

10


Вы можете использовать этот простой код, который не использовал jQuery или другие библиотеки

var a=({});

//check is an empty object
if(JSON.stringify(a)=='{}') {
    alert('it is empty');
} else {
    alert('it is not empty');
}

Класс JSON и его функции ( синтаксический анализ и stringify ) очень полезны, но есть некоторые проблемы с IE7, которые вы можете исправить с помощью этого простого кода http://www.json.org/js.html .

Другой простой способ (самый простой способ):
вы можете использовать этот способ без использования объекта jQuery или JSON .

var a=({});

function isEmptyObject(obj) {
    if(typeof obj!='object') {
        //it is not object, so is not empty
        return false;
    } else {
        var x,i=0;
        for(x in obj) {
            i++;
        }
        if(i>0) {
            //this object has some properties or methods
            return false;
        } else {
            //this object has not any property or method
            return true;
        }
    }
}

alert(isEmptyObject(a));    //true is alerted

JSON.stringifyРешение не может быть выполнено, если объект содержит не строковые свойства, такие как функции или «неопределенные», хотя это и является крайним случаем.

10

Лучший способ, который я нашел:

function isEmpty(obj)
{
    if (!obj)
    {
        return true;
    }

    if (!(typeof(obj) === 'number') && !Object.keys(obj).length)
    {
        return true;
    }

    return false;
}

Работает на:

    t1: {} -> true
    t2: {0:1} -: false
    t3: [] -> true
    t4: [2] -> false
    t5: null -> true
    t6: undefined -> true
    t7: "" -> true
    t8: "a" -> false
    t9: 0 -> true
    t10: 1 -> false

3
Я бы сказал, что 0 не пусто, так как на самом деле это число. все остальное выглядит хорошо, но исправить это легко. в первом операторе if добавьте это. if (!obj && obj !== 0),
mjwrazor

9

Мой дубль:

function isEmpty(obj) {
    return !Object.keys(obj).length > 0;
}

var a = {a:1, b:2}
var b = {}

console.log(isEmpty(a)); // false
console.log(isEmpty(b)); // true

Просто я не думаю, что все браузеры в Object.keys()настоящее время реализуют .


2
Object.keys(new Date()).length === 0; поэтому этот ответ может вводить в заблуждение.
cjbarth

3
Зависит от того, считаете ли вы дату всегда «полной», несмотря на то, что никогда не выставляете ключи. Но я согласен, что, если это ваш план, добавление некоторого дополнительного экземпляра проверки для конструктора Date является хорошим вариантом.
NiKo

9

Если jQuery и веб-браузер недоступны, в underscore.js также есть функция isEmpty.

_.isEmpty({}) // returns true

Кроме того, он не предполагает, что входной параметр является объектом. Для списка, или строки, или неопределенного, это также приведет к правильному ответу.



7

Предостережение! Остерегайтесь ограничений JSON.

javascript:
  obj={  f:function(){}  };
  alert( "Beware!! obj is NOT empty!\n\nobj = {  f:function(){}  }" + 
               "\n\nJSON.stringify( obj )\n\nreturns\n\n" +
                        JSON.stringify( obj ) );

дисплеи

    Осторожно !! объект НЕ пуст!

    obj = {f: function () {}}

    JSON.stringify (obj)

    возвращается

    {}

7

Правильный ответ:

const isEmptyObject = obj =>
  Object.getOwnPropertyNames(obj).length === 0 &&
  Object.getOwnPropertySymbols(obj).length === 0 &&
  Object.getPrototypeOf(obj) === Object.prototype;

Это проверяет, что:

  • Объект не имеет собственных свойств (независимо от перечисляемости).
  • У объекта нет собственных символов собственности.
  • Прототип объекта точно Object.prototype.

Другими словами, объект неотличим от объекта, созданного с помощью {}.


6

В дополнение к ответу Thevs:

var o = {};
alert($.toJSON(o)=='{}'); // true

var o = {a:1};
alert($.toJSON(o)=='{}'); // false

это jquery + jquery.json


Мне не нравится использовать JSON, потому что он не может работать с круговыми объектными структурами.
itdoesntwork

2
Если ваша страница загружает jQuery, тогда используйте $.isEmptyObject(), не тратьте циклы с неочевидными конверсиями.
skierpage

6

Sugar.JS предоставляет расширенные объекты для этой цели. Код прост и понятен:

Сделайте расширенный объект:

a = Object.extended({})

Проверьте его размер:

a.size()
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.