function toJson(obj, pretty) {
  if (isUndefined(obj)) return undefined;
  if (!isNumber(pretty)) {
    pretty = pretty ? 2 : null;
  }
  return JSON.stringify(obj, toJsonReplacer, pretty);
}
@ngdoc function
@name angular.toJson
@module ng
@kind function

@description
Serializes input into a JSON-formatted string. Properties with leading $$ characters will be
stripped since AngularJS uses this notation internally.

@param {Object|Array|Date|string|number|boolean} obj Input to be serialized into JSON.
@param {boolean|number} [pretty=2] If set to true, the JSON output will contain newlines and whitespace.
   If set to an integer, the JSON output will contain that many spaces per indentation.
@returns {string|undefined} JSON-ified string representing `obj`.
@knownIssue

The Safari browser throws a `RangeError` instead of returning `null` when it tries to stringify a `Date`
object with an invalid date value. The only reliable way to prevent this is to monkeypatch the
`Date.prototype.toJSON` method as follows:

```
var _DatetoJSON = Date.prototype.toJSON;
Date.prototype.toJSON = function() {
  try {
    return _DatetoJSON.call(this);
  } catch(e) {
    if (e instanceof RangeError) {
      return null;
    }
    throw e;
  }
};
```

See https://github.com/angular/angular.js/pull/14221 for more information.