はしくれエンジニアもどきのメモ

情報系技術・哲学・デザインなどの勉強メモ・備忘録です。

GoogleBot上で動作するJavascriptメモ

GoogleBot上で動作するJavaScriptメモ

※2017年10月時点での実行結果.

2014年ごろから,GoogleJavascript実行後の結果も見ているらしい.

www.suzukikenichi.com

ということで,GoogleBot上で動作するJavascriptの関数・演算子のメモ.

動作確認

こちらのページ

var.blog.jp

を参考に,各関数・演算子が動作するか確認. やっていることは, GoogleBotではJavascriptのエラーが出た時点で処理止まるので, 実行したいコードを文字列化,try-catch内で評価となる.

(function(){
    function add(title, contents, addToNode){
        var h4 = document.createElement("h4")
        h4.innerHTML = title;
        var sec = document.createElement("section");
        var pre = document.createElement("pre");
        pre.innerHTML = JSON.stringify(contents, null, "  ");

        sec.appendChild(h4);
        sec.appendChild(pre);
        addToNode.appendChild(sec);
    }

    function tryAndPrint(title, code_str, addToNode){
        try{
            add(title, eval(code_str), addToNode)
        }catch(e){
            add(title, "Error\n" + e.message + "\nstack" + e.stack + "\n", addToNode);
        }
    }

    // 動作
    var addToNode=document.getElementById("success");
    // for
    tryAndPrint("for of", "for(var i of [0]) i", addToNode);
    // Array系
    tryAndPrint("Array.prototype.forEach", "Array.prototype.forEach.toString()", addToNode);
    tryAndPrint("Array.prototype.map", "Array.prototype.map.toString()", addToNode);
    tryAndPrint("Array.prototype.reduce", "Array.prototype.reduce.toString()", addToNode);
    tryAndPrint("Array.prototype.filter", "Array.prototype.filter.toString()", addToNode);
    tryAndPrint("Array.prototype.some", "Array.prototype.some.toString()", addToNode);
    tryAndPrint("Map", "Map.toString()", addToNode);
    tryAndPrint("Set", "Set.toString()", addToNode);
    // Promise・fetch系
    tryAndPrint("fetch", "fetch.toString()", addToNode);
    tryAndPrint("Promise", "Promise.toString()", addToNode);
    // 変数宣言
    tryAndPrint("const", "const c = 'const'", addToNode);
    tryAndPrint("typeof symbol", "typeof Symbol()", addToNode);
    tryAndPrint("template literal", "String.raw `a\nb`", addToNode);
    // 関数
    tryAndPrint("generator", "(function* gen(){})", addToNode);

    // 未動作
    var addToNode=document.getElementById("fail");
    tryAndPrint("Array.prototype.find", "Array.prototype.find.toString()", addToNode);
    tryAndPrint("Array.prototype.findIndex", "Array.prototype.findIndex.toString()", addToNode);
    tryAndPrint("Array.from", "Array.from.toString()", addToNode);
    // 変数宣言
    tryAndPrint("let", "let l = 'let'", addToNode);
    // operator
    tryAndPrint("arrow function", "(e => 1)", addToNode);
    tryAndPrint("... operator", "[...[1]]", addToNode);
    tryAndPrint("expo operator", "2 ** 0", addToNode);
    // 同期非同期
    tryAndPrint("async function", "(async function f(){})", addToNode);
    tryAndPrint("default param", "(function(a = 1){})", addToNode);
    tryAndPrint("method definition", "({method(){}})", addToNode);
    tryAndPrint("object initializer", "var oi = 100;({oi});", addToNode);
    tryAndPrint("object key expression", "({['a' + 'b']: 1})", addToNode);
})();

動作済み

未動作

(↓以下の関数・演算子は最新のChromeなどでは動作する.)

Fetch As Google での確認

このページをFetch As Googleの"FETCH AND RENDER"にかけてJavaScript実行後の結果を見る.

GoogleBotでのRender結果(completed)1
GoogleBotでのRender結果(completed)2
GoogleBotでのRender結果(completed)3

GoogleBotでのRender結果(incompleted)1
GoogleBotでのRender結果(incompleted)2

まとめ

2017年10月時点では,基本的にES6のようなモダンな書き方ではエラーになる.

  • ES6以前からあったArray.prototype.map, reduceは使えるが,ES6からの'find, findIndex'はできない.
  • ...operatorはできない.
  • const宣言はできるが,let宣言はできない(エラー内容をみる限り,strictmodeならいける?).
  • 非同期処理・通信Promise, fetchはできるが,非同期関数宣言asyncはできない(そのため同期処理のwaitもできない).