[[pagelist(^JavaScript/2011년스터디)]] * [https://github.com/douglascrockford/JSON-js JSON-js] 코드 분석하기 == 지혜 == * 알아낸 것 * stringify의 return문에서 쓰는 fake root의 역할 * str함수 내에서 object, object array등을 처리할때 재귀적으로 들여쓰기를 처리해준다. 디테일이 살아있어 {{{ // 배열 처리 // 배열은 partial 배열에 처리하는듯 if (Object.prototype.toString.apply(value) === '[object Array]') { length = value.length; for (i = 0; i < length; i += 1) { partial[i] = str(i, value) || 'null'; // 시밤 재귀냐 } v = partial.length === 0 ? '[]' : gap ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : '[' + partial.join(',') + ']'; gap = mind; return v; } }}} * 자바스크립트의 strict모드 (http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/ 레식이 홈피참고) {{{ "use strict" }}} * 해결하지 못한 것 * cx가 무슨뜻이지? cx와 escapable의 정규표현식들의 값이 뭐지? * toJSON에서 key를 파라메터로 넘기는 이유(코드내에서 사용하지는 않는다) {{{ if (typeof Date.prototype.toJSON !== 'function') { Date.prototype.toJSON = function (key) { return isFinite(this.valueOf()) ? this.getUTCFullYear() + '-' + f(this.getUTCMonth() + 1) + '-' + f(this.getUTCDate()) + 'T' + f(this.getUTCHours()) + ':' + f(this.getUTCMinutes()) + ':' + f(this.getUTCSeconds()) + 'Z' : null; }; // String 객체 String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function (key) { // 왜 key를 넣는거지!! return this.valueOf(); }; } }}} * 중첩 ?:문의 우선순위? {{{ // 뭐가 먼저일까요? // 1. partial.length === 0 ? '{}' : gap, gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : '{' + partial.join(',') + '}' // 2. gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : '{' + partial.join(',') + '}', partial.length === 0 ? '{}' : gap v = partial.length === 0 ? '{}' : gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : '{' + partial.join(',') + '}'; }}} * parse함수를 못 봤다. 다음 시간에.. == 정근 == == 수경 == * 의문점 * line 177 : Date.prototype.toJSON = function (key) 에서 key는 왜 넘겨주는가? * line 195 : cx의 의미는 무엇인가? * line 237 : value는 왜 holder[key]로 가져오는가? * 더 알고 싶은 것 * Javascript의 strict mode