[ID CS4-CS6] значение по умолчанию при вызове функции

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835

vbatushev

20 лет на форуме
Сообщения
2 242
Реакции
1 227
@bossrus, все просто:

JavaScript:
function someFunction(a, b, c) {
    // a is boolean, default is false
    var a = !!a;
    // other cases
    var b = b || 'значение по умолчанию';
    var c = c || 12;
    $.writeln('A: ' + a);
    $.writeln('B: ' + b);
    $.writeln('C: ' + c);
    $.writeln();
}

someFunction(undefined, 'test', 14);
someFunction(1, undefined, 17);
someFunction(true, 'значение');
Вывод:

Код:
A: false
B: test
C: 14

A: true
B: значение по умолчанию
C: 17

A: true
B: значение
C: 12
 
Последнее редактирование:

vbatushev

20 лет на форуме
Сообщения
2 242
Реакции
1 227
@bossrus, когда в следующий раз будешь обращаться к документации по Javascript, учитывай, что ExtendScript:
а) это диалект ECMAScript (подверсией которого является JS), следовательно, имеет собственные объекты, собственные реализации отдельных объектов, не имеет отдельных объектов из той версии ECMAScript, от которой он реализован.
б) это диалект ECMAScript 3, 1999 года рождения. Большинство современных учебников по JS описывают ECMAScript 6. Версии ECMAScripts: JavaScript Versions
 
Последнее редактирование:

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Чета, все совсем не то 'hmmm'
JavaScript:
someFunction(1, false, 17);
someFunction(true, 'значение',false);
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Или даже так
JavaScript:
someFunction(1, 0, 17);
someFunction(true, 'значение',0);
121036
 

vbatushev

20 лет на форуме
Сообщения
2 242
Реакции
1 227
Чета, все совсем не то 'hmmm'
Естественно, если ты включишь голову, а не очки.
b и c ожидают небулево значение, а ты им суешь булево "нет", в результате, при булевом выборе выбирается правое значение.
Так что всё то.

P. S. Как же бесит это харамное "че", когда есть красивое и халяльное "чо".
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835

vbatushev

20 лет на форуме
Сообщения
2 242
Реакции
1 227

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Молодец, быстро нагуглил методичку! А теперь обьясни сакральный смысл конструкции, переводящей параметры всех типов, булевский эквивалент которых ложен в дефолт???
 

vbatushev

20 лет на форуме
Сообщения
2 242
Реакции
1 227
Молодец, быстро нагуглил методичку! А теперь обьясни сакральный смысл конструкции, переводящей параметры всех типов, булевский эквивалент которых ложен в дефолт???
Сам-то понял, что сказал?
Если тебе нужно пояснить, что делается в таком выражении
JavaScript:
var b = b || 'значение по умолчанию';
то, смотри, мы пытаемся явно присвоить локальной переменной b значение параметра функции b (если такого не сделать, то присвоение будет неявным), однако в случае, если значение параметра не определено (undefined) происходит то, что в Java называется Excepion (исключение), в логике Javascript это возвращение булева значения false, мол, присвоение у нас не случилось. Получив false вместо значения иного типа, мы уже сможем его обработать и отдать его в логическую конструкцию ИЛИ (||).
Таким образом, var b = b || 'значение по умолчанию'; следует читать так: присвоить локальной переменной b значение параметра функции b, а если присвоение невозможно, присвоить локальной переменной b строковое значение "значение по умолчанию".
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Дичь какая то. Какой кашрут мешает присвоить локальной переменной b значение параметра равное 0 или false? Почему в данном случае ему присваивается левое дефолтное значение?
 
  • Спасибо
Реакции: Skvoznyak

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
сначала выполняется сравнение

b || 'значение по умолчанию'

а уже затем его результат присваивается. приоритет операций такой. легко проверить, добавив скобки

var b = (b || 'значение по умолчанию');

ничего не изменится


здесь, например, наглядно видно, что у оператора присваивания приоритет ниже, чем у логических операций
 
Последнее редактирование:

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
конструкцию тогда надо переписать уже в духе

var b = (b = b) || 'значение по умолчанию';

но опять-таки, при b == 0 получим в результате присвоение ненужного значения по умолчанию


поэтому правильно будет так

var b = b != undefined ? b : 'значение по умолчанию';

но в принципе, это изначально и предлагалось
 
Последнее редактирование:

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
в случае, если значение параметра не определено (undefined) происходит то, что в Java называется Excepion (исключение), в логике Javascript это возвращение булева значения false, мол, присвоение у нас не случилось.

это кстати тоже неверно

var b = (c = undefined);
b;

=> undefined

так как оператор '=' возвращает присвоенное значение