#### 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);
~~~