1. ホーム
  2. javascript

[解決済み] javascriptでの一意なオブジェクト識別子

2022-05-08 22:38:27

質問

ある実験をする必要があるのですが、javascriptのオブジェクトのユニークな識別子のようなものを知る必要があります。等号演算子は使いたくないので、pythonのid()関数のようなものが必要です。

このようなものは存在するのでしょうか?

解決方法は?

更新情報 この回答は6年前に書いたもので、時代と私の理解に合ったスタイルです。 コメント欄での会話に応えて、より現代的なアプローチを以下に示します。

    (function() {
        if ( typeof Object.id == "undefined" ) {
            var id = 0;

            Object.id = function(o) {
                if ( typeof o.__uniqueid == "undefined" ) {
                    Object.defineProperty(o, "__uniqueid", {
                        value: ++id,
                        enumerable: false,
                        // This could go either way, depending on your 
                        // interpretation of what an "id" is
                        writable: false
                    });
                }

                return o.__uniqueid;
            };
        }
    })();
    
    var obj = { a: 1, b: 1 };
    
    console.log(Object.id(obj));
    console.log(Object.id([]));
    console.log(Object.id({}));
    console.log(Object.id(/./));
    console.log(Object.id(function() {}));

    for (var k in obj) {
        if (obj.hasOwnProperty(k)) {
            console.log(k);
        }
    }
    // Logged keys are `a` and `b`

古風なブラウザの要件がある場合。 ここをチェック のブラウザ互換性については、こちらをご覧ください。 Object.defineProperty .

元の回答は、比較が貴重だと思うので、(変更履歴だけでなく)下に残してあります。


以下を試してみてください。 これは、オブジェクトのIDをコンストラクタなどで明示的に設定するオプションも与えてくれます。

    (function() {
        if ( typeof Object.prototype.uniqueId == "undefined" ) {
            var id = 0;
            Object.prototype.uniqueId = function() {
                if ( typeof this.__uniqueid == "undefined" ) {
                    this.__uniqueid = ++id;
                }
                return this.__uniqueid;
            };
        }
    })();
    
    var obj1 = {};
    var obj2 = new Object();
    
    console.log(obj1.uniqueId());
    console.log(obj2.uniqueId());
    console.log([].uniqueId());
    console.log({}.uniqueId());
    console.log(/./.uniqueId());
    console.log((function() {}).uniqueId());

ユニークIDを内部的に保存するために使用するどのメンバーも、自動的に作成される他のメンバー名と衝突しないように注意してください。