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.prototype
function 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 判断标准就是同值相等.同一个引用相等. 不同引用不相等
// 不进行隐式类型转换.