1. var Test = function () {
    2. }
    3. var t = new Test();
    4. t.__proto__ === Test.prototype;
    5. // Function Object Boolean String Number
    6. // Object->Function -> Test -> t
    7. // t.__proto__ -> Test.prototype
    8. // Test.__proto__ -> Function.prototype;
    9. // Function.__proto__ -> Object.prototype;
    10. // Function Object 之间的关系
    11. // 共同点
    12. // 都是一个函数
    13. // 函数也是一个特殊的对象.
    14. // Function.__proto__ Object.__proto__
    15. // Function.prototype Object.prototype
    16. // Function 是所有函数的构造函数
    17. // Object.__proto__ ->Function.prototype
    18. function deepClone (target,origin) {
    19. var tar = origin || {},
    20. oStr = Object.prototype.toString,
    21. arrayStr = '[object Array]';
    22. for (var k in target) {
    23. if (!target.hasOwnProperty(k)) {
    24. return;
    25. }
    26. if (typeof target[k] === 'object' && target[k] !== null) {
    27. if (oStr.call(target[k]) !== arrayStr) {
    28. tar[k] = deepClone(target[k],{});
    29. } else {
    30. tar[k] = deepClone(target[k], []);
    31. }
    32. } else {
    33. tar[k] = target[k];
    34. }
    35. }
    36. return tar;
    37. }
    38. Object.defineProperty(Object, 'assigns', {
    39. value:function (tar) {
    40. if (tar == null || tar == undefined) {
    41. throw new TypeError('can not conver null or undefined to obect');
    42. }
    43. tar = Object(tar);
    44. for (var i = 1; i < arguments.length; i++) {
    45. for (var k in arguments[i]) {
    46. tar[k] = arguments[i][k];
    47. }
    48. }
    49. return tar;
    50. }
    51. })
    52. // ES6 版本 四种相等判断算法
    53. // 全等 三等 ===
    54. // 等于 ==
    55. // 零值相等 + 0 === -0
    56. // 同值相等 - 0 !== +0 NaN === NaN
    57. // 严格相等 === Strict Equality
    58. // 非严格相等 loose
    59. // Object.is(v1, v2); ES6 判断两个参数是否是同一个值
    60. // 严格相等
    61. // 不进行类型转换 类型相同 值也相同
    62. // 1 === '1' 1 === 2;
    63. // 引用值必须是同一个地址
    64. // var obj = {} obj=== obj {}==={}//false
    65. // 两个NaN 或者是NaN和其他值都不相等
    66. // NaN === NaN false NaN === undefined? false
    67. // +0 和 -0 是否相等
    68. // -0 === +0;
    69. // + Infinity与-Infinity 相等
    70. // +Infinity === -Infinity 不相等
    71. // 如何定义a
    72. // a !== a 成立 a = NaN;
    73. // 非严格相等 Abstract Equality 抽象相等
    74. // 等式两边 都有可能被转换
    75. // 转换以后还是用严格相等来比较
    76. // ToPrimitive(A)通过尝试调用 A 的A.toString() 和 A.valueOf() 方法,将参数 A 转换为原始值(Primitive)。
    77. // 任何对象 和 undefined 和 null 都不想等
    78. // 窄对象 narrow Object -> document.all('div');
    79. // IE 4 document.all typeof document.all === 'undefined' IE10 之前typeof document.all === 'object'
    80. // document.all == undefined // true
    81. // 全等对结果的预测是更加清晰明确的.
    82. // 全等在不隐式类型转换的前提下会更快.
    83. // falsy值 "" '' `` +0 -0 false 8nBigInt null undefined NaN
    84. // 同值相等 same-value
    85. // 零值相等 same-value-0 +0=== -0;
    86. // -0 !=== +0 // false => 同值相等
    87. // NaN === NaN // true => 同值相等
    88. // 同值相等的底层实现是用Object.is 来实现的.
    89. // Object.is 是ES6 抛出的方法 ES5 并未暴露同值相等的方法
    90. Object.defineProperty(obj, 'myZero', {
    91. value: -0,
    92. enumerable: false,
    93. configurable: false,
    94. writable:false
    95. })
    96. Object.defineProperty(obj, 'myZero', {
    97. value: -0,
    98. enumerable: false,
    99. configurable: false,
    100. writable:false
    101. })
    102. var obj = {};
    103. const res = Object.is(obj, obj);//true
    104. // Object.is 判断标准就是同值相等.同一个引用相等. 不同引用不相等
    105. // 不进行隐式类型转换.