パラメーターが宣言されているメソッドの引数が省略された場合,そのパラメーター($1
など)は「未定義」となります。v16では,変数やフィールドに「未定義」を代入しようとすると,エラーが返されました。v17以降,「未定義」を変数やフィールドに代入してもエラーは返されません。これは仕様です。
オブジェクト型のプロパティは,変数やフィールドとは違い,型が決まっていません。値またはNull
が代入されていないプロパティは,省略されたパラメーターと同じように「未定義」です。
オブジェクト記法を使用すれば,プロパティのプロパティにアクセスするコードがずっとシンプルで直感的になるだけでなく,実行速度も大幅に向上させることができます。しかし,プロパティのプロパティにアクセスするコードが成立するためには,上位のプロパティが「未定義」でなければなりません。
深い階層のプロパティに1行でアクセスするために,ひとつずつプロパティをチェックしなければならないとすれば,それは本末転倒であり,オブジェクト記法を使用するメリットがありません。それで,v17以降,「未定義」の参照と代入に関する仕様が変更され,より柔軟に「未定義」を扱うことができるようになりました。オブジェクトのプロパティだけでなく,省略されたパラメーターにも影響が及びます。
https://blog.4d.com/object-notation-improvement-after-customer-feedback/
- オブジェクト記法で参照したプロパティが「未定義」
v16r4まで
エラーが返されました。
v17から
オブジェクト記法で参照したプロパティが「未定義」だった場合,式は「未定義」を返し,以降のコードは無視されます。つまり,途中のプロパティをすべてチェックする必要がなくなりました。
- プロジェクトメソッドに渡された引数が「未定義」
v16まで
パラメーター($1
など)は「未定義」でした。
v17から
パラメーター($1
など)には,型のデフォルト値(0
など)が代入されます。
注記: コマンドに「未定義」を渡すことはできません。引数が「未定義」になる可能性があるのであれば,String
Num
Date
Time
Bool
を使用することができます。v17以降,「未定義」は型のデフォルト値に変換されるからです。
- 条件文(
If
Case of
など)の式が「未定義」
v16まで
エラーが返されました。
v17から
False
条件として扱われます。
- 代入演算子(
:=
)の右オペランドが「未定義」
v16まで
値を返さないメソッド($0
なし)や未定義のプロパティ($o.undefined
)を変数やフィールドに代入するようなコードは何もしませんでした。つまり,値は元のままでした。
v17から
値を返さないメソッド($0
なし)や未定義のプロパティ($o.undefined
)を変数やフィールドに代入した場合,左オペランドには型のデフォルト値(0
など)が代入されます。