fork download
  1. process.stdin.resume();
  2. process.stdin.setEncoding('utf8');
  3.  
  4.  
  5. /**
  6.  * Функция глубокого копирования объектов
  7.  * элементы внутри копируемого объекта то же копируются
  8.  *
  9.  * @param {(Object|Array|Date)} object - Копируемый объект
  10.  * @return {(Object|Array|Date)} objectClone - Копия объекта
  11.  */
  12. function deepCopy(object) {
  13.  
  14. var objectType = getTypeOf(object);
  15.  
  16. if (objectType == "Array") {
  17. var objectClone = [];
  18. for(var i = 0; i < object.length; i++) {
  19. var itemType = getTypeOf(object[i]);
  20. if (
  21. itemType == "Object" ||
  22. itemType == "Array" ||
  23. itemType == "Date"
  24. ) {
  25. objectClone.push(deepCopy(object[i]));
  26. } else {
  27. objectClone.push(object[i]);
  28. }
  29. };
  30. } else if (objectType == "Object") {
  31. var objectClone = {};
  32. for(key in object) {
  33. var itemType = getTypeOf(object[key]);
  34. if (
  35. itemType == "Object" ||
  36. itemType == "Array" ||
  37. itemType == "Date"
  38. ) {
  39. objectClone[key] = deepCopy(object[key]);
  40. } else {
  41. objectClone[key] = object[key];
  42. }
  43. };
  44. } else if (objectType == "Date") {
  45. return new Date(object.getTime());
  46. }
  47.  
  48. return objectClone;
  49. }
  50.  
  51. /**
  52.  * Функция определяет тип переменной
  53.  *
  54.  * @param value - Переменная, тип которой определяется
  55.  * @return {string} - Одна из строк:
  56.  * 'undefined',
  57.  * 'boolean' (для true/false),
  58.  * 'null', !object
  59.  * 'number',
  60.  * 'string',
  61.  * 'function',
  62.  * 'Array', object
  63.  * 'array-like', !object
  64.  * 'Arguments'
  65.  * 'Object',
  66.  * 'Date'
  67.  * @throw {Error}
  68.  */
  69. function getTypeOf(value) {
  70. if (arguments.length != 1) {
  71. throw new Error("Require 1 argument, given: " + arguments.length);
  72. }
  73.  
  74. var type = typeof(value);
  75.  
  76. if (type == "object") {
  77. // Определение null
  78. if ( value === null) {
  79. return "null";
  80. }
  81. // Определение всего остального: arguments, object, date
  82. return {}.toString.call(value).slice(8, -1); // Отрезает первую часть выражения [object ...]
  83. } else {
  84. return type;
  85. }
  86. }
  87.  
  88. var a = { x: 1, y: 2, z: [1, 2, 3], w: new Date(2014, 1, 1, 12, 0, 0) };
  89. var b = deepCopy(a); // b — это отдельный объект
  90. b.x = 10;
  91. console.log(a.x); // 1
  92.  
  93. // a.z и b.z указывают на разные массивы:
  94. b.z.push(4);
  95. console.log(a.z); // [1, 2, 3]
  96.  
  97. // a.w и b.w независимы друг от друга
  98. b.w.setFullYear(2015);
  99. console.log(a.w.getFullYear()); // 2014
  100.  
Success #stdin #stdout 0.06s 28568KB
stdin
Standard input is empty
stdout
1
[ 1, 2, 3 ]
2014