Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Основы JS по Флэнэгану; (https://javascript.ru/forum/misc/13989-osnovy-js-po-flehnehganu%3B.html)

Kolyaj 24.12.2010 17:49

Да.

x-yuri 24.12.2010 23:32

прикольно :)

JSTalker 03.01.2011 06:50

Цитата:

Сообщение от Kolyaj (Сообщение 85091)
Отличия между var и без var:
<script type="text/javascript">
try {
    var a = 1;
    b = 1;
    delete a;
    delete b;
    alert(a);
    alert(b);
} catch (e) {
    alert('Error: ' + e.message);
}
</script>

хм..
получается б толком не удалилась?
как это соотносится с отличиями в создании переменной?
хм, ну теоретически я понял впрочем.:)

x-yuri 03.01.2011 09:37

как раз b удалилась
var a = 1;
b = 2;
alert([window['a'], window['b']]);

без var в window создается соответствующее свойство

JSTalker 03.01.2011 22:44

x-yuri,
а теперь понял. Т.е. с варом получается этакая независимая (от глобального объекта) переменная?

monolithed 04.01.2011 11:16

Цитата:

Сообщение от JSTalker
а теперь понял. Т.е. с варом получается этакая независимая (от глобального объекта) переменная?

ключевое слово var позволяет объявить переменную в текущей области видимости, без него - свойство глобального объекта window, которое можно удалить в отличии от объвленной переменной с var

Kepa 05.01.2011 10:16

Всем привет, всех с прошедшим! (:

Тоже недавно начал изучать Флэнагана, поэтому решил втиснуться с вопросами в эту темку, надеюсь автор топика не будет против. ;)

К сути:

Прочитал про разницу в работе с переменными "по значению" и "по ссылке" и возник вопрос по строкам - для "иллюстрации" передачи элементарных типов по значению Флэнаган применяет такой код:
var a = 3;
var b = a;
a = 4;
alert(b); // показывает 3

Но он говорит что строки в js неизменяемы и поэтому проверить как они передаются (по ссылке или по значению) невозможно, т.к. аналогичный код для строк не будет работать, хотя можно установить что сравниваются они по значению:
var s1 = "text";
var s2 = "tex" + "t";
alert(s1 == s2); // true

Но у меня возник вопрос, а что все-таки мешает сделать для строк такую проверку:
var str1 = "bunny";
var str2 = str1;
str1 = "rabbid";
alert(str2);// показывает bunny

По идее это показывает что строки копируются по значению, в чем тут тогда загвостка?

P.S. Кстати, почему во втором отрывке кода нет нумерации строк? Тот же тэг JS использовал...

P.P.S. Подумал, посидел, еще подумал, почитал немного дальше и пришла в голову такая мысль - получается что в описанном мною примере в str1 содержится не строка bunny, а ссылка на неё, а при "присваивании" ей новой строки "rabbid" мы создаем эту новую строку и в str1 записываем ссылку на неё, а в str2 у нас просто ссылка на первую строку, которая не удалилась, т.к. на неё еще есть "активная" ссылка. Что-то в этом роде?

Kolyaj 05.01.2011 11:38

Kepa,
все переменные в JS передаются по значению. Просто в случае объектов значением является ссылка на объект. Это сначала трудно осознать, но потом всё встаёт на свои места.

http://dmitrysoshnikov.com/ecmascrip...tion-strategy/

monolithed 05.01.2011 11:43

Числа и строки - элементарный тип данных и передаются они по значению.
А происходит это потому, что ссылочные типы данных не имеют фиксировнного размера и не могут храниться в выделенных 8 байтах памяти.
var a = '10', b = '10';
alert(a*b); //100 выполняем операцию умножения со строковыми операндами, результат которых будет преобразован в числовое значение.

var a = '10', b = '10';
alert(parseInt(a)+parseInt(b)); //20 выполняем операцию сложения со строковыми операндами, результат которых будет преобразован в числовое значение. Метод parseInt() преобразует значение в числовое, т.к. опрератор + может работать как со строками так и с числами



Цитата:

Сообщение от Kepa
P.S. Кстати, почему во втором отрывке кода нет нумерации строк? Тот же тэг JS использовал...

меньше 4 строк

Kolyaj 05.01.2011 11:45

Цитата:

Сообщение от monolithed
var a = '10', b = '10';
alert(a+b); //20 выполняем операцию сложения со строковыми операндами, результат которых будет преобразован в числовое значение.

var a = '10', b = '10';
alert(a+b); //20 выполняем операцию сложения со строковыми операндами, результат которых будет преобразован в числовое значение.


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