Ответ 1
UPD (из моего комментария): Конечно, не очень хорошая практика выбрать какое-то магическое число, чтобы указать отсутствие значения, если вы не можете быть полностью уверены, что это волшебное число не появится в результате некоторые арифметики (что в целом верно). Поэтому лучше всего использовать более широкий тип, чем int
(например, Number
), или передать некоторый флаг (Boolean
значение), а также int
, чтобы указать отсутствие фактического значения. Выбор должен зависеть от того, хотите ли вы подчеркнуть важность факта, что прошедшее значение является интегральным.
Если вам удобнее расширять тип аргумента, вы должны использовать NaN
и сделать это:
function setMyValue (myVar : Number = NaN) : void
{
if ( isNaN(myVar) )
{
/* Generate a value for myVar */
}
else
{
/* Use the supplied value for myVar */
}
}
Это более технически точная и более стабильная. Он также позволит вам строго печатать во время компиляции и не будет вызывать странные ошибки, как в случае использования Object
.
Обратите внимание, что это не будет работать с int
, как предлагает один из ответов. int
имеет только числовые значения, а NaN
будет принудительно равняться 0. Вам нужно будет использовать тип Number
.
Если вы беспокоитесь о производительности - не надо. Использование Number
вместо int
или uint
обычно в порядке.
UPD: Если вы хотите явно отметить, что этот аргумент должен быть целым, используйте только дополнительный флаг и точный тип - это будет намного яснее.
function setMyValue (isIntValueSupplied : Boolean = false, intValue : int = 0) : void
{
if ( isIntValueSupplied )
{
/* Generate or use a default value of intValue */
}
else
{
/* Use the supplied value for intValue */
}
}
Другой вариант - определить свой собственный тип с дополнительным значением, например. MaybeInt
, который содержит целочисленное значение и флаг (независимо от того, был ли он фактически инициализирован или нет). Таким образом, вы должны четко указывать, что значение должно быть целым или нецензурным. Однако этот подход может быть немного громоздким.