(key, holder)
| 323 | }) + '"' : '"' + string + '"'; |
| 324 | } |
| 325 | function str(key, holder) { |
| 326 | var i, k, v, length, mind = gap, |
| 327 | partial, value = holder[key]; |
| 328 | if (value && typeof value === 'object' && typeof value.toJSON === 'function') value = value.toJSON(key); |
| 329 | if (typeof rep === 'function') value = rep.call(holder, key, value); |
| 330 | switch (typeof value) { |
| 331 | case 'string': |
| 332 | return quote(value); |
| 333 | case 'number': |
| 334 | return isFinite(value) ? String(value) : 'null'; |
| 335 | case 'boolean': |
| 336 | case 'null': |
| 337 | return String(value); |
| 338 | case 'object': |
| 339 | if (!value) return 'null'; |
| 340 | gap += indent; |
| 341 | partial = []; |
| 342 | if (Object.prototype.toString.apply(value) === '[object Array]') { |
| 343 | length = value.length; |
| 344 | for (i = 0; i < length; i += 1) partial[i] = str(i, value) || 'null'; |
| 345 | v = partial.length === 0 ? '[]' : gap ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : '[' + partial.join(',') + ']'; |
| 346 | gap = mind; |
| 347 | return v; |
| 348 | } |
| 349 | if (rep && typeof rep === 'object') { |
| 350 | length = rep.length; |
| 351 | for (i = 0; i < length; i += 1) { |
| 352 | k = rep[i]; |
| 353 | if (typeof k === 'string') { |
| 354 | v = str(k, value); |
| 355 | if (v) partial.push(quote(k) + (gap ? ': ' : ':') + v); |
| 356 | } |
| 357 | } |
| 358 | } else |
| 359 | for (k in value) if (Object.hasOwnProperty.call(value, k)) { |
| 360 | v = str(k, value); |
| 361 | if (v) partial.push(quote(k) + (gap ? ': ' : ':') + v); |
| 362 | } |
| 363 | v = partial.length === 0 ? '{}' : gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : '{' + partial.join(',') + '}'; |
| 364 | gap = mind; |
| 365 | return v; |
| 366 | } |
| 367 | } |
| 368 | if (typeof JSON.stringify !== 'function') JSON.stringify = function (value, replacer, space) { |
| 369 | var i; |
| 370 | gap = ''; |
no test coverage detected