Javascript-确定对象中是否有任何作用域引用

Javascript - Determine if any scoped references in object

本文关键字:任何 作用域 引用 是否 对象 Javascript-      更新时间:2023-09-26

我执行一些函数并获得一个返回值。这个值可以是任何值(字符串、数组、对象、引用、函数)。然后我使用JSON.stringify传递这个结果。

现在,函数和引用在它们被传递到的范围内对我没有多大好处,所以整个"to string,eval"方法用处不大。我将把它们存储在一个本地数组中,然后传递一个ID,以便稍后引用它们。但是,我确实继续发送字符串数据、数组和对象(在javascript对象的"关联数组"意义上),因为这些都可以很好地与JSON.stringify配合使用。

我已经在使用try... JSON.stringify() catch来处理递归对象(JSON.stringify在其中出错),但这并不能解释上面提到的任何其他内容。

检查值是否包含函数的最有效方法是什么?

而不是

typeof foo === "function"

因为退货可能是

["foo", "bar", ["foo", "bar"], function(){...something}]

我也不想挑剔每一个单独部分的类型,只想从整体上返回是否有任何函数/对象无法安全地字符串化。我可能会想出如何循环和检查每个单独的值,但如果有人能想到一种快捷方式或更有效的方法,我很想听听

谢谢!

欢迎并感谢精制!

//your favorite object length checking function could go here
$.objectLength = (function(){
    //ie<9
    if (typeof Object.keys === "undefined" ){
        return function(o){
            var count = 0, i;
            for (i in o) {
                if (o.hasOwnProperty(i)) {
                    count++;
                }
            }
            return count;
        };
        //everyone else
    } else {
        return function(o){
            return Object.keys(o).length;
        }
    }
})();
//comparing our two objects
$.checkMatch = function(a, b){
    //if they're not the same length, we're done here. (functions exist, etc)
    if (typeof a !== typeof b || typeof a === "object" && typeof b === "object" && a && b && $.objectLength(a) !== $.objectLength(b)){
        return false;
    //if they are the same length, they may contain deeper objects we need to check.
    } else {
        var key;
        for (key in a){
            //make sure it's not prototyped key
            if (a.hasOwnProperty(key)){
                //if it doesn't exist on the other object
                if (!b.hasOwnProperty(key)){
                    return false;
                //if this an object as well
                } else if (typeof a[key] === "object"){
                    //check for a match
                    if (!$.checkMatch(a[key], b[key])){
                        return false;
                    }
                //then check if they're not equal (simple values)
                } else if (a[key] !== b[key]){
                    return false
                }
            }
        }
        return true;
    }
};
//...stuff
//catch recursive objects in parameters
var good = true, sendObject = {"ourobject", "values"}, finalSendObject;
//try to stringify, which rejects infinitely recursive objects
try {
    finalSendObject = JSON.stringify(sendObject);
} catch(e){
    good = false;
}
//if that passes, try matching the original against the parsed JSON string
if (good && sendObject !== JSON.parse(finalSendObject)){
    good = $.checkMatch(sendObject, JSON.parse(finalSendObject));
}

这将不起作用

但我会把它留给任何想尝试的人。工作解决方案很快就会到来。

30秒后,我自己想明白了。

字符串,解析它。如果有任何变化,它就不会等于它自己。

var checkParse = function(obj){
    return obj === JSON.parse(JSON.strigify(obj));
}