Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Дэвид Флэнаган (https://javascript.ru/forum/offtopic/7281-dehvid-flehnagan.html)

Niar 31.01.2010 19:22

Гозар бред, это в любом случае выражение
{}-это отдельная инструкция для объедения других инструкций.

Gozar 31.01.2010 19:29

в таком случае это тоже что написать:
"x":5
, один фиг это тоже нарушение синтаксиса.

Niar 31.01.2010 19:31

Да блин {} тут не используется как инструкция объеденения. Это часть синтаксиса.

Gozar 31.01.2010 19:32

Цитата:

Сообщение от Niar (Сообщение 42995)
Да блин {} тут не используется как инструкция объеденения.

Именно так это здесь и используется
https://developer.mozilla.org/En/Cor...lock_Statement

Gozar 31.01.2010 19:57

кстати, раз область видимости одна, то и смысла писать "блочными конструкциями" в js нету. Это я так для тех у кого с английским плохо.

B@rmaley.e><e 31.01.2010 20:14

Gozar, смысл есть, если использовать let.

Kolyaj 31.01.2010 20:16

Цитата:

Сообщение от Gozar
кстати, раз область видимости одна, то и смысла писать "блочными конструкциями" в js нету.

Никто так и не пишет. Просто грамматика так проще с учётом того, что if, например, можно писать как со {}, так и без них, если оператор под условием один.

Niar 31.01.2010 20:24

Есть смысл, метки

Gozar 31.01.2010 20:29

Цитата:

Сообщение от Niar (Сообщение 43001)
Есть смысл, метки

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

Niar 31.01.2010 20:30

это ваше дело

Gozar 31.01.2010 20:43

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 42999)
Gozar, смысл есть, если использовать let.

let поддерживается ie, opera, c каких версий?

Gozar 31.01.2010 20:51

Цитата:

Сообщение от Kolyaj (Сообщение 43000)
Никто так и не пишет. Просто грамматика так проще с учётом того, что if, например, можно писать как со {}, так и без них, если оператор под условием один.

я не совсем понял утверждение.
var x = 5;  
var y = 1;  
if((x==5)&&(y==1)) x+=7,y=2,z=18;
alert([x,y,z]);

Kolyaj 31.01.2010 21:52

Цитата:

Сообщение от Gozar
я не совсем понял утверждение.

Конечно же не оператор, а statement.

x-yuri 01.02.2010 00:47

ну вы тут и понаобсуждали

Цитата:

Сообщение от Niar
Запутался почему тогда
if( new String('') ) true

внимание, отвечает Дэвид Флэнаган
Цитата:

Сообщение от Дэвид Флэнаган
Прежде всего следует заметить, что попытка преобразования непустых объектов в логическое значение дает в результате значение true. Это справедливо для любых объектов (включая массивы и функции), даже для объектов оберток, которые представляют элементарные типы, при другом способе преобразования дающие значение false.



Цитата:

Сообщение от Niar
if (new String('')==false) alert('равно')
Ну а тут false то почему

а это имеет значение? Правила такие. У меня пока не было надобности это выяснить. Но если уж такое случиться - есть стандарт

p.s. конечно, интересно, почему создатели языка сделали именно такую грамматику. Но только это уже скорее не из области программирования, а из области написания компиляторов/интерпретаторов ;)

Dmitry A. Soshnikov 01.02.2010 00:58

Да, как уже было отмечено (Kolyaj), в данном случае получается блок, а не инициализатор объекта (кстати, {} и [] правильно называются инициализатор объекта (object initializer) и инициализатор массива (array initializer) соответственно, а не литерал объекта, литерал массива).

Цитата:

Сообщение от Niar
Ты не понял {l:"l"} нету ошибки
Ошибка когда значение свойства-функция или когда имя свойства-строка

Здесь получается блок, в котором находится метка (label) и дальше выражения (statements).

{x: 10}


Равносильно:

{ // блок
  x: // метка
    10; // выражение
}


Результатом вычисления этого блока будет вычисление выражения, т.е. 10.

В случае:

{"x": 10}


опять имеем блок, но с неправильной меткой - ошибка синтаксиса.

В случае:

{x: funciton () {}}


имеем блок с правильной меткой, но с ошибочным statement-ом. Это равносильно простой записи:

funciton () {} // Syntax Error


которая будет являться FunctionDeclaration (FD) без имени, что ошибка. Поэтому:

{x: funciton a() {}} // OK


Но, за исключением того, что все браузеры, кроме Firefox трактуют эту функцию, как FD, которая будет создана ещё при входе в контекст (грубо говоря - доступна до объявления); Firefox же имеет своё расширение - FunctionStatement (FS), что означает, что функции в виде FD доступны в statement-ах и будут, правильно, созданы в рантайме (при интерпретации):

alert(a); // "a" is not defined - в FF, function - в остальных
{x: funciton a() {}}
alert(a); // function - везде (уже доступна для FF)


Можно к явному виду FunctionExpression (FE) привести, тогда функция будет создана в рантайме (кроме багов в IE и именованной FE):

{x: (funciton () {})} // OK
{x: (funciton a() {})} // OK, но в IE - будет FD+FE

Niar 01.02.2010 11:17

Спасибо

Niar 01.02.2010 16:34

А еще можно a=function(){}

Niar 01.02.2010 17:05

А я на сайте через winamp)

PeaceCoder 01.02.2010 19:33

А еще можно выучить синтаксис и не парить себе мозг почему так, а не так. ;)

Niar 02.02.2010 19:56

var o={};
Object.prototype.p=3.14;
alert(o.p);
for(sv in o){
alert(o[sv]);
}
alert(o.propertyIsEnumerable("p"));//false?!!

Почему false выходит? Ведь данный метод возвращает true если в объекте есть свойство и если оно перечисляется циклом for\in .

B@rmaley.e><e 02.02.2010 22:18

https://developer.mozilla.org/en/Cor...tyIsEnumerable
Цитата:

Every object has a propertyIsEnumerable method. This method can determine whether the specified property in an object can be enumerated by a for...in loop, with the exception of properties inherited through the prototype chain. If the object does not have the specified property, this method returns false.
По-русски из документации

Niar 03.02.2010 05:53

ясно

Niar 03.02.2010 11:05

var table = new Array(11); // В таблице 11 строк
for(var i = 0; i < table.length; i++)
table[i] = new Array(11); // В каждой строке 11 столбцов
for(var row = 0; row < table.length; row++) {
for(col = 0; col < table[row].length; col++) {
table[row][col] = row*col;
}
}

Скрипт таблицы умножения. Из книги Дэвида.
Когда менял скрипт заметил что если поставить
for(var i = 0; i <= table.length; i++)

Браузер намертво вис, почему просто не выдавал ошибку?

Kolyaj 03.02.2010 11:59

var table = new Array(11);
table[11] = 1;
alert(table.length);
table[12] = 1;
alert(table.length);
table.length в цикле увеличивается на 1, поэтому из цикла выйти невозможно.

Niar 03.02.2010 12:02

Как до меня сразу не дошло)
+ вам)

Niar 04.02.2010 11:31

Знает кто алгоритм работы Array.sort()? Он каждый элемент с каждым сравнивает или как.

Kolyaj 04.02.2010 11:47

Цитата:

Сообщение от Niar
алгоритм работы Array.sort()?

quicksort

Niar 04.02.2010 13:41

Это что?=)

Kolyaj 04.02.2010 13:44

Классический алгоритм сортировки. http://ru.wikipedia.org/wiki/Quicksort

Мараторий 04.02.2010 13:45

Цитата:

Сообщение от Niar (Сообщение 43532)
Это что?=)

Это ответ на ваш вопрос.

Niar 04.02.2010 13:49

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

Kolyaj 04.02.2010 13:50

Цитата:

Сообщение от Niar
на каком языке статья?

Из домена вроде ясно.

Niar 04.02.2010 13:56

Странно. Может с кодировкой что.
В мозиле норм. Спасибо за ссылку

Shaci 10.02.2010 17:57

Так вообще можно объекты инициализировать?

<script>
var test = {'0':[1,4]};

var test1 = {0:[4,7], 1:[6, 8]};
//При создании объекта таким образм имя свойства представляет собой
//строку?

//alert(test.0[0]);//error
//свойства объектов (в "варианте" object.property) представляет собой идентификатор
// => так получить к нему доступ нельзя, недопустимое имя идентификатора

//Можно только через object.['property']
alert(test['0'][1]);//4

//число в первом нолике сначала преобразуется в строку.
alert(test[0][0]);//1
</script>

x-yuri 10.02.2010 18:21

Цитата:

Сообщение от Shaci
//При создании объекта таким образм имя свойства представляет собой //строку?

ну test1 - это ж объект, а не массив


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