Help us understand the problem. What is going on with this article?

GASのV8では [JavaObject] が [Object] になる

概要

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エンジンに対応したのでドキュメント読んだ

以上

Suketta
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした