var Test = function () {}var t = new Test(); t.__proto__ === Test.prototype;// Function Object Boolean String Number// Object->Function -> Test -> t// t.__proto__ -> Test.prototype// Test.__proto__ -> Function.prototype;// Function.__proto__ -> Object.prototype;// Function Object 之间的关系// 共同点// 都是一个函数// 函数也是一个特殊的对象.// Function.__proto__ Object.__proto__// Function.prototype Object.prototype// Function 是所有函数的构造函数// Object.__proto__ ->Function.prototypefunction deepClone (target,origin) { var tar = origin || {}, oStr = Object.prototype.toString, arrayStr = '[object Array]'; for (var k in target) { if (!target.hasOwnProperty(k)) { return; } if (typeof target[k] === 'object' && target[k] !== null) { if (oStr.call(target[k]) !== arrayStr) { tar[k] = deepClone(target[k],{}); } else { tar[k] = deepClone(target[k], []); } } else { tar[k] = target[k]; } } return tar;}Object.defineProperty(Object, 'assigns', { value:function (tar) { if (tar == null || tar == undefined) { throw new TypeError('can not conver null or undefined to obect'); } tar = Object(tar); for (var i = 1; i < arguments.length; i++) { for (var k in arguments[i]) { tar[k] = arguments[i][k]; } } return tar; }})// ES6 版本 四种相等判断算法// 全等 三等 ===// 等于 ==// 零值相等 + 0 === -0// 同值相等 - 0 !== +0 NaN === NaN// 严格相等 === Strict Equality// 非严格相等 loose// Object.is(v1, v2); ES6 判断两个参数是否是同一个值// 严格相等// 不进行类型转换 类型相同 值也相同// 1 === '1' 1 === 2;// 引用值必须是同一个地址// var obj = {} obj=== obj {}==={}//false// 两个NaN 或者是NaN和其他值都不相等// NaN === NaN false NaN === undefined? false// +0 和 -0 是否相等// -0 === +0;// + Infinity与-Infinity 相等// +Infinity === -Infinity 不相等// 如何定义a// a !== a 成立 a = NaN;// 非严格相等 Abstract Equality 抽象相等// 等式两边 都有可能被转换// 转换以后还是用严格相等来比较// ToPrimitive(A)通过尝试调用 A 的A.toString() 和 A.valueOf() 方法,将参数 A 转换为原始值(Primitive)。// 任何对象 和 undefined 和 null 都不想等// 窄对象 narrow Object -> document.all('div');// IE 4 document.all typeof document.all === 'undefined' IE10 之前typeof document.all === 'object'// document.all == undefined // true// 全等对结果的预测是更加清晰明确的.// 全等在不隐式类型转换的前提下会更快.// falsy值 "" '' `` +0 -0 false 8nBigInt null undefined NaN// 同值相等 same-value// 零值相等 same-value-0 +0=== -0;// -0 !=== +0 // false => 同值相等// NaN === NaN // true => 同值相等// 同值相等的底层实现是用Object.is 来实现的.// Object.is 是ES6 抛出的方法 ES5 并未暴露同值相等的方法Object.defineProperty(obj, 'myZero', { value: -0, enumerable: false, configurable: false, writable:false})Object.defineProperty(obj, 'myZero', { value: -0, enumerable: false, configurable: false, writable:false})var obj = {};const res = Object.is(obj, obj);//true// Object.is 判断标准就是同值相等.同一个引用相等. 不同引用不相等// 不进行隐式类型转换.