💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
#### 2. BAT笔试题中几道关于堆栈内存和闭包作用域的题 ~~~ //example 1 let a={}, b='0', c=0; a[b]='珠峰'; a[c]='培训'; console.log(a[b]); // 培训 ​堆:存储引用类型的空间 栈:存储基本类性值和执行代码的环境 对象和数组的区别,数组可以看成是以数字为索引的对象 --------------------- //example 2 let a={}, b=Symbol('1'), c=Symbol('1'); a[b]='珠峰'; a[c]='培训'; console.log(a[b]); //珠峰 ~~~ ![](https://img.kancloud.cn/58/12/5812eb087ef77d8a17b619c429a831b7_719x502.png) 对象的属性名可以是字符串,sym,bol,布尔值,null,undefined,也就是基本类型值和symbol,但是如果数字和字符串一样的话,属于同一个属性。 ``` //example 3 let a={}, b={n:'1'}, c={m:'2'}; a[b]='珠峰'; a[c]='培训'; console.log(a[b]); // 培训 ``` valueof 和toString的区别 ![](https://img.kancloud.cn/38/9d/389de9f7a7e7d2bd1a647edc3cbc97ad_333x471.png) ~~~ //=>遇到会的题不要“慌”:你以为你以为的就是你以为的 // var test = (function (i) { // return function () { // alert(i *= 2); // } // })(2); // test(5); "4" // alert弹出来的都要toString ~~~ 赋值,1:创建变量,2:准备值,3:关联 ![](https://img.kancloud.cn/d0/eb/d0ebe62ad79ab1f01ae5196de42651f6_1056x482.png) ~~~ var a = 0, b = 0; function A(a) { A = function (b) { alert(a + b++); }; //A不是私有的 alert(a++); } A(1); A(2); ~~~ ![](https://img.kancloud.cn/8c/81/8c81f1b4398951c27586948ad9ed9fb5_1172x635.png) 深克隆浅克隆 ~~~ let obj = { a: 100, b: [10, 20, 30], c: { x: 10 }, d: /^\d+$/ }; // let obj2 = { // ...obj //浅克隆 // }; // let obj2 = {}; // for (let key in obj) { // if (!obj.hasOwnProperty(key)) break; // obj2[key] = obj[key]; //浅克隆 // } // let obj2 = JSON.parse(JSON.stringify(obj)); //=>弊端? ~~~ 正则,函数,对象,日期有弊端 => 不是正则了 ![](https://img.kancloud.cn/e3/cd/e3cd5cfc27678a5f034c002014b4ed1c_571x106.png) ![](https://img.kancloud.cn/7d/58/7d587ea2315ec8f20b98856d6822066c_568x274.png) ~~~ // console.log(obj, obj2); function deepClone(obj) { //=>过滤特殊情况 if (obj === null) return null; if (typeof 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; //或者 let newObj = new Object(); 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); ~~~ ![](https://img.kancloud.cn/6a/91/6a919624ed878ca03624582c27b78c19_722x413.png) ~~~ 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(); getName(); Foo().getName(); getName(); new Foo.getName(); new Foo().getName(); //new Foo()找prototype上的,实例找原型上的 new new Foo().getName(); ~~~ ![](https://img.kancloud.cn/b2/aa/b2aa84ccdd26d348a5d7fcde30cb8c69_1488x637.png) ~~~ 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'); ~~~ 定时器,时间绑定 ajax ----宏任务 promise async await ---微任务 ![](https://img.kancloud.cn/dd/80/dd80e6e3feccd6a194c299346ef057d0_1496x616.png) #### 课后作业 **第一题:写出下面代码输出的结果** ~~~javascript function A(){ alert(1); } function Func() { A=function(){ alert(2); }; return this; } Func.A=A; Func.prototype={ A:()=>{ alert(3); //箭头函数不能被new,因为没有原型链prototype,就没有constructor } }; A(); Func.A(); Func().A(); new Func.A(); new Func().A(); new new Func().A(); //会报错 ~~~ **第二题:写出下面代码输出的结果** ~~~javascript var x=2; var y={ x:3, z:(function(x){ this.x*=x; x+=2; return function(n){ this.x*=n; x+=3; console.log(x); } })(x) }; var m=y.z; m(4); y.z(5); console.log(x, y.x); ~~~ **第三题:写出下面代码输出的结果** ~~~javascript var a = ?; if (a == 1 && a == 2 && a == 3) { console.log(1); } ~~~ **第四题:写出下面代码输出的结果** ~~~javascript var x=0, y=1; function fn(){ x+=2; fn=function(y){ console.log(y + (--x)); }; console.log(x, y); } fn(3); fn(4); console.log(x, y); ~~~ **第五题:写出下面代码输出的结果** ~~~javascript setTimeout(() => { console.log(1); }, 20); console.log(2); setTimeout(() => { console.log(3); }, 10); console.log(4); console.time('AA'); for (let i = 0; i < 90000000; i++) { // do soming } console.timeEnd('AA'); //=>AA: 79ms 左右 console.log(5); setTimeout(() => { console.log(6); }, 8); console.log(7); setTimeout(() => { console.log(8); }, 15); console.log(9); ~~~