Annu Ranjan Ответов: 1

Пожалуйста, объясните мне этот код! (Яваскрипт)


У меня есть переменная под названием "Чат", определяемая следующим образом:
var chatRoom = {
	'all' : []
};

Здесь я предполагаю, что чат-это объект/массив JSON.

Теперь вот еще один фрагмент кода
if (chatRoom[to]) {
		chatRoom[to].push(newChatEl);
	} else
		chatRoom[to] = [ newChatEl ];

Здесь "to" содержит некоторое строковое значение.


Я новичок в программировании и немного разбираюсь в Java, но почти ничего не знаю о JavaScript. То, что я узнал в Java, заключается в том, что мы должны поместить оператор, который приводит к логическому значению в скобках после ключевого слова "if". Но вот в JavaScript "chatroom[to]" не выглядит как логическое значение true/false.

1. Как бы вы интерпретировали термин "чат [Гарри]" здесь? Хранится ли строка "Harry" в json-объекте chatRoom как chatRoom={'all':[Harry]}? Если нам нужно обратиться к Гарри, как мы это сделаем: chatRoom.all[0] или chatRoom[0]?

2.Что вы подразумеваете под чатом[Harry]. push(newChatEl)? Здесь чат-это не массив, а объект JSON. Мы добавляем новый узел в Гарри в чате, который содержит newChatEl? Для справки, newChatEl - это куча Html-кодов (некоторые див. и промежуток создаются элементы и их ссылка передается в newChatEl). Таким образом, newChatEl даже не является строковым объектом. А если "newChatEl" - это не строка, то как ее можно протолкнуть в чат [Гарри]?


3. В еще часть кода, создаем ли мы массив и передаем в него newChatEl в качестве его первого элемента?

Извините, если вопросы глупые, но мне нужно понять это полностью.
Спасибо!

Что я уже пробовал:

Нужно какое-то объяснение, уже объясненное в вопросе.

W∴ Balboos, GHB

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

Подумайте: каково содержание чата? Какую часть его следует использовать для вашего теста IF? Вы не уточнили.

Annu Ranjan

Спасибо за ответ Balboos! Я предполагаю, что он был закодирован здесь, чтобы определить, существует ли этот элемент или нет. Но опять же, разве мы не должны использовать его как "чат.all[Harry]" вместо "чат[Harry]"?

1 Ответов

Рейтинг:
7

Richard Deeming

Цитата:
var chatRoom = {
    'all' : []
};

Во-первых, несмотря на то, что некоторые люди могут вам сказать, формат JSON[^] всегда ссылается только на строку, содержащую сериализованный объект или массив. То, что у вас есть, - это объектный литерал.

Грамматика и типы-JavaScript | MDN[^]

Это объявляет новую переменную с именем chatRoom, который содержит объект с одним свойством, называемым all. Это свойство содержит пустой массив.


Теперь в Javascript есть два способа доступа к свойству объекта. Вы можете использовать стандартную точечную нотацию:
var foo = chatRoom.all;

Или вы можете использовать скобочную нотацию:
var bar = chatRoom['all'];

Второй вариант особенно полезен, если вы не знаете имени свойства при написании кода:
var to = 'all';
var baz = chatRoom[to];

Работа с объектами-JavaScript | MDN[^]


Одной из наиболее причудливых областей Javascript является концепция" истинных "и" ложных " значений. В принципе, почти ко всему можно относиться так, как если бы это был bool, с некоторыми стандартными правилами, чтобы определить, является ли это "истинным" или "ложным".
Правда и ложь: когда все не одинаково в JavaScript-SitePoint[^]

Значение несуществующего свойства undefined Согласно правилам, это значение является "фальшивым", так что:
if (chatRoom[to]) {
будет выполнять if блок, если свойство существует, и else заблокируйте, если это не так.


Итак, теперь вы можете видеть, что ваш код блокируется:
if (chatRoom[to]) {
    chatRoom[to].push(newChatEl);
} else {
    chatRoom[to] = [ newChatEl ];
}
определяет, является ли chatRoom содержит свойство с указанным именем. Если это так, то он добавляет newChatEl к этой собственности. Если это не так, он создает свойство и инициализирует его новым массивом, содержащим newChatEl.


1) Если переменная to содержит строку 'all', этот код не будет касаться all массив.

2) chatRoom[x].push(y) добавляет значение y в массиве хранится в свойстве имени в x. Значение свойства-это массив, а не chatRoom.

3) Да, [x] является ли синтаксис для литерал массива[^], содержащий одно значение.


Annu Ranjan

Спасибо, Мистер Ричард! Это было очень хорошее объяснение. Спасибо,что помогли мне. У меня есть еще один вопрос. Здесь, в этом запросе," to " является переменной. Предположим, что to= "harry"; Does then chatRoom[to] (что, предположим, дает истину) означает, что объект JSON "chatroom" имеет новое свойство по имени "harry", а чат выглядит следующим образом: chatRoom = {'all': [], 'harry': "некоторое значение"}
Кроме того, можем ли мы создать свойство в JSON без его значения, то есть у нас будет только ключ и нулевое значение? Спасибо!

Richard Deeming

1) Да, если to = 'harry', chatRoom[to] = someValue добавит или обновит свойство под названием harry В этом случае, поскольку вы используете литерал массива, объект будет выглядеть следующим образом:

chatRoom = { 'all': [], 'harry': [ 'some value' ] }


2) Вы можете установить свойство либо null или undefined Но помните, что оба эти значения являются "ложными", поэтому для вашего примера кода они будут рассматриваться так, как будто этого свойства не существует. Вам придется использовать что-то вроде hasOwnProperty[^] чтобы проверить, существует ли свойство независимо от его значения.
var chatRoom = {
    'all': [],
    'foo': null,
    'bar': undefined
};

if (chatRoom.foo) { alert('Foo'); } // Won't display
if (chatRoom.bar) { alert('Bar'); } // Won't display
if (chatRoom.baz) { alert('Baz'); } // Won't display

if (chatRoom.hasOwnProperty('foo')) { alert('Foo'); } // Displays
if (chatRoom.hasOwnProperty('bar')) { alert('Bar'); } // Displays
if (chatRoom.hasOwnProperty('baz')) { alert('Baz'); } // Won't display

Annu Ranjan

Спасибо, Мистер Ричард! :)