Javascript-форум (https://javascript.ru/forum/)
-   Учебные материалы (https://javascript.ru/forum/study/)
-   -   Javascript quiz - поразмять мозг (https://javascript.ru/forum/study/21112-javascript-quiz-porazmyat-mozg.html)

ваый 29.08.2011 16:44

Javascript quiz - поразмять мозг
 
Наткнулся на любопытный тестик. Как сказано в предисловии проверяются следующие знания:
Цитата:

Quiz mainly focuses on knowledge of scoping, function expressions (and how they differ from function declarations), references, process of variable and function declaration, order of evaluation, and a couple more things...
Заставляет напрячься :)

Kolyaj 29.08.2011 16:54

Вот на русском есть http://anotherfelix.com/jsquiz/jsquiz.html

melky 29.08.2011 17:49

Kolyaj, почему так? несколько вопросов, которые ломают голову. ответьте пожалуйста :)

var a = [1, 2], b = [1, 2];

a['3'] = 3;   
b['3b'] = 3;  // каг бэ в "b" добавляем

console.log(a.length + ' ' + b.length);

B@rmaley.e><e 29.08.2011 17:59

Цитата:

Сообщение от melky
каг бэ в "b" добавляем

length никак не связано с количеством "элементов" (которые на самом деле всего-лишь свойства объекта). length, по определению, число, большее любого индекса, приводимого к числу.
var a = [];
a['9999'] = 5;
alert(a.length)

Snipe 29.08.2011 18:01

Цитата:

Сообщение от melky (Сообщение 123315)
Kolyaj, почему так? несколько вопросов, которые ломают голову. ответьте пожалуйста :)

var a = [1, 2], b = [1, 2];

a['3'] = 3;   
b['3b'] = 3;  // каг бэ в "b" добавляем

console.log(a.length + ' ' + b.length);

a['3'] приводится к числу и заполняет четвертый элемент, начиная с нуля.
b['3b'] к числу не приводится, видимо, поэтому элемент не присваивается...

B@rmaley.e><e 29.08.2011 18:04

Snipe,
var a = [];
a['3b'] = 'Hi!';
alert(a['3b'])

melky 29.08.2011 18:12

Цитата:

Сообщение от Snipe (Сообщение 123318)
a['3'] приводится к числу и заполняет четвертый элемент, начиная с нуля.

опечатка?

мне было в новинку это приведение к числу. я думал : "как будет строкой, так и останется".. но тогда будет путаница между свойством и элементом массива.

ясно, спасибо за ответы :)

вот вывод консоли, на всякий
Код:

> a = [1,2]
> a[ '3' ] = 3;
> a;
[1, 2, undefined, 3]


Цитата:

Сообщение от Snipe (Сообщение 123318)
b['3b'] к числу не приводится, видимо, поэтому элемент не присваивается...

это уже считается как свойство объекта. как ассоциативный массив, видимо

Snipe 29.08.2011 18:17

Цитата:

Сообщение от melky (Сообщение 123321)
опечатка?

нет
a[0], a[1], a[2], a[3] - 4 элемента
Длина массива считается по последнему элементу.

Kolyaj 29.08.2011 18:20

Подробней http://alljs.ru/articles/array/whatis

Цитата:

Сообщение от melky
мне было в новинку это приведение к числу. я думал : "как будет строкой, так и останется".. но тогда будет путаница между свойством и элементом массива.

Массив -- это объект, ключ объекта всегда строка, так что приведения к числу нет. Наоборот, в случае a[2] 2 приводится к строке.
Подробней http://javascript.ru/ecma/part15#a-15.4

Kolyaj 29.08.2011 18:21

Цитата:

Сообщение от Snipe
Длина массива считается по последнему элементу.

var arr = new Array(10);
arr.length == 10, но ни одного элемента в массиве нет.

ваый 29.08.2011 18:25

И тут кстати заметна разница в работе for:
var a = [1, 2];
a['hello'] = 3;

for (var i in a) {
    console.log(i, a[i])
}
// 0 1
// 1 2
// hello 3

for (var i = 0; i < a.length; i++) {
    console.log(i, a[i]);
}
// 0 1
// 1 2

float 29.08.2011 22:10

alert(100['toString']['length']);

не догоняю что здесь что...

B@rmaley.e><e 29.08.2011 22:12

100['toString'] — метод toString, свойство length для функции равно количеству принимаемых аргументов.
Метод toString для чисел принимает один аргумент — основание системы счисления, в которой нужно вернуть число.

float 29.08.2011 22:30

Цитата:

для функции равно количеству принимаемых аргументов
некогда на практике не пользовался, хотя вспомнил: пару раз видел в мануалах, видать подзабыл. сенкс:)
{неплюсуеть пока}


Часовой пояс GMT +3, время: 20:41.