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

Javascript-确定对象中是否存在任何作用域引用,javascript,json,object-type,Javascript,Json,Object Type,我执行一些函数并得到一个返回值。此值可以是任何内容(字符串、数组、对象、引用、函数)。然后我使用JSON.stringify传递这个结果 现在,函数和引用在它们被交付到的范围内没有多大用处,所以整个“to string,eval”方法没有多大用处。我将把它们存储在一个本地数组中,然后传递一个ID以供以后引用。但是,我确实继续发送字符串数据、数组和对象(在javascript对象的“关联数组”意义上),因为它们都能很好地处理JSON.stringify 我已经在使用尝试。。。JSON.string

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

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

我已经在使用
尝试。。。JSON.stringify()catch
可以对递归对象执行此操作(其中
JSON.stringify
错误处于启用状态),但这并不能解释上面提到的任何其他内容

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

而不是

typeof foo === "function"
因为回报可能是

["foo", "bar", ["foo", "bar"], function(){...something}]
我也不想区分每一个单独的片段的类型,只是返回整体,看看是否有任何函数/对象不能安全地字符串化。我可能会想出如何循环和检查每个单独的值,但如果有人能想到一个快捷方式或更有效的方法,我想听听


谢谢

这不起作用

但我会留给任何想尝试的人。工作方案即将出台

30秒后,我自己想出来了

字符串,解析它。如果有什么改变,它就不等于它自己

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

欢迎光临

//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));
}
//您最喜欢的对象长度检查函数可以在这里使用
$.objectLength=(函数(){

//e返回值将始终为
false
checkParse({})//false
现在测试它。你怎么想?如果它是说…一个字符串,我将它字符串化然后解析,它应该是相同的。相同的内容,不同的对象。这怎么会导致比较失败?它不是在寻找同一个对象,而是在寻找一个相同的对象。也许我误解了。你是在原语或对象上调用它还是在b上调用它在
字符串上调用oth,它会起作用。在对象上它不会起作用。对于对象,正如我上面所说的,相同的内容,不同的对象。不同的对象意味着不相等。