第一题
var a =0;
b=0;
function A(a){
A = function(b){
alert(a + b++);
}
alert(a++);
}
A(1);
A(2);
哈哈哈 你是不是输出的答案 是不是 1 和 4 呢,如果是的话恭喜你 答错了, 需要注意的是: alert() 输出的是 字符串类型 准确的答案是: 1 和 4
第二题
用原生js 实现一个深克隆的方法如下:
function deepClone(obj) {
// 过滤特殊情况:
if (obj === null) return
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()
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = deepClone(obj[key])
}
}
return newObj
}
var obj1 = {
a: '吃饭',
b: '睡觉',
c: '打豆豆~'
}
let obj3 = deepClone(obj1)
console.log(obj1 === obj3) false
console.log(obj1.b === obj3.b) 不知道为什么是 true
第三题:
function Foo() {
getName = function() {
console.log(1);
};
return this;
// 这里的this是window
// 执行的时候相当于是 window.getName() 这个执行了
//相当与把 getName=1 修改成全局的
}
Foo.getName = function() {
console.log(2);
};
var p1 = (Foo.prototype.getName = function() {
console.log(3);
});
console.log(p1, "打印你了吗?");
var getName = function() {
console.log(4);
};
function getName() {
console.log(5);
}
Foo.getName(); //2
getName(); //4
Foo().getName(); //1
getName(); //1
new Foo.getName();
// 先执行Foo.getName() 得到2,
//在new它相当于普通函数执行
// js的运算符的优先级
new Foo().getName();
//new Foo() 创建实例
// 再让创建的实例 执行
new new Foo().getName();
//1. new Foo() 创建实例
//2. xxx.getName() 原型上的方法 ->3
//3. new func -> 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");
// 解析: js 先执行 同步-> 异步(宏任务和微任务); 先执行宏任务,在执行微任务
// 同步: 1. script start 2. async1 start 3.async2 4.script end
// 5.promise1 6.script end 7.async1 end 8.promise2
```