<body> 姓名:<span id="spanName"></span> <br> <input type="text" id="inpName"> <script> let a = {}, b = ‘0‘, c = 0 ; a[b] = ‘lord‘; a[c] = ‘suan‘; console.log(a[b]); //‘suan‘ let a = {}, b = Symbol(‘1‘), c = Symbol(‘1‘); a[b] = ‘lord‘; a[c] = ‘suan‘; console.log(a[b]); //‘lord‘ let a = {}, b = { n : ‘1‘ }, c = { m : ‘2‘ }; a[b] = ‘lord‘; a[c] = ‘suan‘; console.log(a[b]); //‘suan‘ var test = (function(i){ return function() { alert(i *= 2) } })(2); test(5); //‘4‘ var a = 0, b = 0; function A(a){ A = function (b) { alert(a + b++); }; alert(a++); } A(1); //‘1‘ A(2); //‘4‘ let obj = { a: 100, b :[10,20,30], c: { x:10 }, d : /^\d+$/ }; 浅克隆1 弊端:obj2数据更改之后 obj也更改了 let obj2 = {}; for(let key in obj) { //hasOwnProperty过滤私有的 if(!obj.hasOwnProperty(key)) break; obj2[key] = obj[key]; } 浅克隆1 let obj2 = {...obj}; 深克隆 一般使用深克隆 JSON.stringify(obj) 的时候,弊端:函数 时间 正则都会出现问题 let obj2 = JSON.parse(JSON.stringify(obj)); console.log(obj,obj2); 深克隆de弊端怎么办 function deepClone(obj) { //过滤特殊情况 if(obj === null) return null; if(typeod obj !== "object") return obj; if(obj instanceof RegExp) { //正则 return new RegExp(obj); } if(obj instanceof Date) { //时间 return new Date(obj); } // 函数的办法 递归 // 不直接创建对象目的,克隆的结果和之前保持相同的所属类 let newObj = new obj.constructor; for (let key in obj) { if(obj.hasOwnProperty(key)){ newObj[key] = deepClone(obj[key]); } } return newObj; } let obj2 = deepClone(obj); console.log(obj,obj2); console.log(obj === obj2); console.log(obj.c === obj2.c); 面向对象 function Foo() { getName = function () { console.log(1); }; return this; } Foo.getName = function () { console.log(2); } Foo.prototype.getName = function() { console.log(3); } var getName = function() { console.log(4); } function getName () { console.log(5); } Foo.getName(); //2 getName(); //4 Foo().getName(); // 1 getName(); //1 new Foo.getName(); //2 new Foo().getName(); //3 new new Foo().getName();//3 同步异步 async function async1() { console.log(‘async1 start‘); await async2(); console.log(‘async1 end‘); } async function async2() { console.log(‘async2‘); } console.log(‘script start‘); setTimeout(function () { console.log(‘setTimeout‘); },0) async1(); new Promise(function (resolve) { console.log(‘promise1‘); resolve(); }).then(function() { console.log(‘promise2‘); }); console.log(‘script end‘); script start async1 start async2 promise1 script end async1 end promise2 setTimeout 闭包 vue双向数据绑定原理 2.0 let obj = { name:‘‘ }; let newObj = JSON.parse(JSON.stringify(obj)); Object.defineProperty(obj,‘name‘,{ get() { return newObj.name; }, set(val) { if(val === newObj.name) return; newObj.name = val; observer(); } }); function observer() { spanName.innerHTML = obj.name; inpName.value = obj.name; } setTimeout(()=>{ obj.name = ‘lord‘; },1000) inpName.oninput = function () { obj.name = this.value } 2.0问题 需要深克隆 3.0 let obj = {}; obj = new Proxy(obj,{ get (target,prop) { //target指 obj prop指obj里的属性 value指值 return target[prop]; }, set(target,prop,value) { target[prop] = value; observer() } }) function observer() { spanName.innerHTML = obj.name; inpName.value = obj.name; } setTimeout(()=>{ obj.name = ‘lord‘; },1000) inpName.oninput = function () { obj.name = this.value } </script> </body>
原文:https://www.cnblogs.com/isuansuan/p/12837628.html