2013-11-22 5 views
0

일부 함수를 실행하고 반환 값을 구합니다. 이 값은 무엇이든 될 수 있습니다 (문자열, 배열, 객체, 참조, 함수). 그런 다음이 결과를 JSON.stringify을 사용하여 전달합니다.Javascript - 객체의 범위가 지정된 참조가 있는지 확인합니다.

이제는 함수와 참조가 제공되는 범위에서 나에게 잘 맞지 않으므로 "문자열, 평가"메서드 전체가별로 유용하지 않습니다. 로컬 배열에 저장하고 나중에 참조 할 ID를 전달합니다. 하지만 나는 문자열 데이터, 배열, 객체 (자바 스크립트 객체의 "관련 배열"의미로)를 보내는데 모두 JSON.stringify과 매우 잘 맞습니다.

이미 재귀 개체 (JSON.stringify 오류가 있음)를 사용하여 try... JSON.stringify() catch을 사용하고 있습니다. 그러나 위에서 언급 한 내용은 고려하지 않았습니다.

값에 함수가 있는지 확인하는 가장 효율적인 방법은 무엇입니까?

그리고하지

typeof foo === "function" 

반환 난 그냥 어떤 기능/객체가 있는지 여부 전체에 돌아가려면 떨어져 각 조각의 형태를 선택하지 않으

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

될 수 있기 때문에 안전하게 성격을 바꿀 수는 없습니다. 아마 각각의 개별 값을 반복하고 검사하는 방법을 알아낼 수 있지만, 누군가가 생각할 수있는 지름길이나 더 효율적인 방법이 있다면, 나는 그것을 듣고 싶습니다.

감사합니다.

답변

0

정제를 환영합니다.

//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)); 
} 
-1

작동하지 않습니다하지만 난 그것을 시도의 생각하는 사람을 위해 그것을 떠날 것이다. 작업 솔루션 곧.

30 초 후에 나는 그것을 스스로 알아 낸다.

문자열을 구문 분석하십시오. 어떤 것이 바뀌면, 그 자체와 동등하지 않을 것입니다.

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

반환 값은 항상 '거짓'입니다. 'checkParse ({}); // false' –

+0

테스트 해보기. 어떻게 생각하니? 말은 ... 문자열이고, 문자열로 변환 한 다음 구문 분석하면 동일해야합니다. –

+0

동일한 내용, 다른 개체. –

관련 문제