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 shallowCopy(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. objectClone.push(object[i]);
  20. }
  21. } else if (objectType == "Object") {
  22. var objectClone = {};
  23. for(key in object) {
  24. objectClone[key] = object[key];
  25. }
  26. } else if (objectType == "Date") {
  27. var objectClone = new Date(object.getTime());
  28. }
  29.  
  30. return objectClone;
  31. }
  32.  
  33. /**
  34.  * Функция определяет тип переменной
  35.  *
  36.  * @param value - Переменная, тип которой определяется
  37.  * @return {string} - Одна из строк:
  38.  * 'undefined',
  39.  * 'boolean' (для true/false),
  40.  * 'null', !object
  41.  * 'number',
  42.  * 'string',
  43.  * 'function',
  44.  * 'Array', object
  45.  * 'array-like', !object
  46.  * 'Arguments'
  47.  * 'Object',
  48.  * 'Date'
  49.  * @throw {Error}
  50.  */
  51. function getTypeOf(value) {
  52. if (arguments.length != 1) {
  53. throw new Error("Require 1 argument, given: " + arguments.length);
  54. }
  55.  
  56. var type = typeof(value);
  57.  
  58. if (type == "object") {
  59. // Определение null
  60. if ( value === null) {
  61. return "null";
  62. }
  63. // Определение всего остального: arguments, object, date
  64. return {}.toString.call(value).slice(8, -1); // Отрезает первую часть выражения [object ...]
  65. } else {
  66. return type;
  67. }
  68. }
  69.  
  70. var a = { x: 1, y: 2, z: [1, 2, 3] };
  71. var b = shallowCopy(a); // b — это отдельный объект
  72. b.diff = "this is it";
  73. console.log("a = ", a);
  74. console.log("b = ", b);
  75.  
  76. b.x = 10;
  77. console.log("b.x = ", b.x);
  78. console.log("a.x = ", a.x);
  79. // Но a.z и b.z указывают на один и тот же массив:
  80. b.z.push(4);
  81. console.log("b.z.push(4), b.z = ", b.z); // [1, 2, 3, 4]
  82. console.log("a.z = ", a.z); // [1, 2, 3, 4]
  83.  
  84. var a = [1, 2, 3]
  85. var b = shallowCopy(a); // b — это отдельный объект
  86. console.log("a is Array, a = ", a);
  87. console.log("b is Array too, b = ", b);
  88.  
  89. var a = new Date(2011, 0, 1, 2, 3, 4, 567);
  90. var b = shallowCopy(a); // b — это отдельный объект
  91. console.log("a = ", a);
  92. console.log("b is Date too, b = ", b);
Success #stdin #stdout 0.06s 28568KB
stdin
Standard input is empty
stdout
a =  { x: 1, y: 2, z: [ 1, 2, 3 ] }
b =  { x: 1, y: 2, z: [ 1, 2, 3 ], diff: 'this is it' }
b.x =  10
a.x =  1
b.z.push(4), b.z =  [ 1, 2, 3, 4 ]
a.z =  [ 1, 2, 3, 4 ]
a is Array, a =  [ 1, 2, 3 ]
b is Array too, b =  [ 1, 2, 3 ]
a =  Sat Jan 01 2011 02:03:04 GMT+0000 (UTC)
b is Date too, b =  Sat Jan 01 2011 02:03:04 GMT+0000 (UTC)