概要
GAS で V8ランタイムが使えるようになった件について:(V8 Runtime Overview)
G Suite Services の FoobarApp 系オブジェクトは
Object.prototype.toString.call()
でタイプ名を取得すると
従来の Rhino では [object JavaObject]
が返ってきましたが・・・
V8ランタイムに切り替えると [object Object]
になります。
確認
function foo(){
var objects = {
calendar : CalendarApp.getDefaultCalendar(),
folder : DriveApp.getFolderById( 'root' ),
file : DriveApp.createFile( 'test', '' ),
document : DocumentApp.create( 'test' ),
spread : SpreadsheetApp.create( 'test' )
}
for ( item in objects ){
console.log( item + ' : '
+ Object.prototype.toString.call( objects[ item ] ) );
}
/*
--- Rhino ---
calendar : [object JavaObject]
folder : [object JavaObject]
file : [object JavaObject]
document : [object JavaObject]
spread : [object JavaObject]
--- V8 ---
calendar : [object Object]
folder : [object Object]
file : [object Object]
document : [object Object]
spread : [object Object]
*/
}
影響
[object Object]
になることで、従来使えなかったメソッドが使えたりします。
例えばプロパティ名の列挙に使う Object.getOwnPropertyNames()
:
function bar(){
var obj = CalendarApp.getDefaultCalendar();
console.log( Object.getOwnPropertyNames( obj ).length );
/*
--- Rhino ---
TypeError: オブジェクト型の引数が必要ですが、object 型が返されました。
↑ 何言ってんのお前
--- V8 ---
28.0
*/
}
注意
型名チェックに === '[object JavaObject]'
などとやっている場合は
挙動が変わるので修正が必要です。
その他
従来の Rhino から V8 へ切り替える為のポイントがまとめられていますが
この件についてはどこにも記載を見つけられませんでした。少なくとも今は。
Migrating scripts to the V8 runtime
(Qiita) GASがV8エンジンに対応したのでドキュメント読んだ
以上