1

Тема: JS: Непонятный синтаксис.

Встретил в скрипте, такой вот кусок...


t = new Array();         
t["Date"] = Date;         
t["Object"] = Object;
t["Array"] = Array;

Не могу понять, что значат эти записи типа: t["Array"] = Array?
Если бы t был не Array, а Object, тогда t["Array"] можно интерпретировать как свойство с именем Array объекта t...
Но как понять значение этого свойства равное Array? Понятно, что это принадлежность к классу, т.е. что элемент массива t["Array"] это объект, соответствующий классу Array (ну и Object, т.к. массив это тоже объект). Непонятно как такое "присваивание" не вызывает ошибки. Если t массив, то в [] указывается индекс элемента...
Как индекс может быть "Array"? Переведите на более понятный язык, кто может.

2 (изменено: kalabuni, 2013-02-19 21:24:11)

Re: JS: Непонятный синтаксис.

Если объявляется var s = [];, то только тогда s - это индексный массив.

При объявлении var s = new Array (); массив s может быть как индексным, так и хеш-массивом (последний фактически ничем не отличается от Object)
Пример:

var s = new Array ();

s ['prop1'] = 123;
s ['prop2'] = 'abc';
s ['prop3'] = [4, 5, 6];

for (var j = 1; j < 4; j++) alert (s ['prop' + j]);

3 (изменено: Rumata, 2013-02-20 01:26:32)

Re: JS: Непонятный синтаксис.

Внесу немного путаницы, но без этого никак. JS - это язык, в котором абсолютно нет массивов. Есть объект Array, поведение которого можно интерпретировать как массивы. Объекты Array имеют свойство length, которое указывает на следующий доступный индекс для вставки. Вот пример, чтобы было понятно:


var x = []; // Это более короткая и удобная запись чем new Array()
x[0] = 0;
x[1] = 0;
alert(x.length); // выведет число 2, видимо это количество элементов
x[9] = 0;
alert(x.length); // выведет число 10, хотя в массив добавлено ТОЛЬКО 3 элемента!!!

А теперь к сути вопроса.
Запись вида переменная["слово"] - указатель на элемент ассоциативного массива, понятие которых которые очень распространено во многих ЯП (например, perl, python, JS). Они расширяют свойство массива, когда указателем на элемент массива может быть не только целое неотрицательное число, но любая строка. Нечисловой индекс - это имя свойства, простой литерал.

В JS все может быть объектом. Функции тоже. И любые объекты можно назначать любым переменным. Значением t['Date'] является функция Date, вызвав которую можно будет инициализировать объект, наследующий свойства Date.


var x = new t['Date'];
alert(x);

// а можно записать и так, потому что имя свойства допустимое и состоит только из букв
var x = new t.Date;
alert(x);
( 2 * b ) || ! ( 2 * b )

4

Re: JS: Непонятный синтаксис.

Rumata пишет:

var x = new t['Date'];                     
alert(x);

// а можно записать и так, потому что имя свойства допустимое и состоит только из букв
var x = new t.Date;
alert(x);

var x = new t['Date'];  var x = new t.Date; - эти строки вызывают ошибку: "Предполагается наличие объекта", даже если я заранее определил var t = new Array(). или var t = new Object().
Про ассоциативные массивы понятно, спасибо.
Осталась небольшая спутанность сознания по вопросу присвоения значений типа Date, Array, и т.п.
т.е. строка типа: var t = Date;  будет означать, что я в переменную t записал ссылку на функцию с именем Date(), без входных параметров, в которой может быть что угодно: хоть умножение 2*2 и эта моя Date() ни как не связана со встроенной в JS Date(), которая предназначена для работы с форматами даты/времени???

5 (изменено: Spy00000, 2013-02-20 15:04:00)

Re: JS: Непонятный синтаксис.

im2002 пишет:

var x = new t['Date'];  var x = new t.Date; - эти строки вызывают ошибку: "Предполагается наличие объекта", даже если я заранее определил var t = new Array(). или var t = new Object().

Я так понимаю, Rumata предполагал, что перед его примером будет идти Ваш пример полностью. Чтобы не было ошибки нужны строки:

t = new Array();         
t["Date"] = Date; 
im2002 пишет:

т.е. строка типа: var t = Date;  будет означать, что я в переменную t записал ссылку на функцию с именем Date(), без входных параметров, ... и эта моя Date() ни как не связана со встроенной в JS Date() ... ???

В переменную t запишется ссылка на функцию с именем Date, которую Вы можете вызвать с любым числом параметров.
Если у Вас уже будет описана Ваша функция Date, запишется ссылка на неё, если функция не будет описана - запишется ссылка на стандартную функцию Date, которую можно вызвать:

var t = [];         
t["Date"] = Date;         
t["Object"] = Object;
t["Array"] = Array;

var d = new t["Date"]( 2013, 0, 1);
WScript.Echo( d );

var d2 = new t.Date( 2014, 0, 1, 2, 3, 4);
WScript.Echo( d2 );

var a = new t['Array']( 2015, 0, 1, 2, 3, 4);
WScript.Echo( a.length );
WScript.Echo( a );

6

Re: JS: Непонятный синтаксис.

var x = new t['Date'];  var x = new t.Date; - эти строки вызывают ошибку: "Предполагается наличие объекта"

Видимо мне стоило написать полный пример, как правильно сказал Spy00000

Я так понимаю, Rumata предполагал, что перед его примером будет идти Ваш пример полностью.

т.е. строка типа: var t = Date;  будет означать, что я в переменную t записал ссылку на функцию с именем Date(), без входных параметров, в которой может быть что угодно: хоть умножение 2*2 и эта моя Date() ни как не связана со встроенной в JS Date(), которая предназначена для работы с форматами даты/времени???

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


var t = Date;   // создать ссылку на функцию Date
var t = Date(); // вызвать функцию Date
( 2 * b ) || ! ( 2 * b )

7

Re: JS: Непонятный синтаксис.

Разобрался, всем спасибо.