1.请写出弹出值,并解释为什么
alert(a)
a();
var a=3;
function a(){
alert(10)
}
alert(a)
a=6;
a();
// 上题实际执行为
function a() {
alert(10)
}
var a;
alert(a); //==> //函数体
a(); //=》执行这个函数
a = 3;
alert(a); //=> a=3
a = 6;
a(); //a不是一个函数
//1.=======基本提升=====
// test();
// function test(){}
// test();
// if(false){
// var a = 1;
// }
// alert(a);
//2.======函数优先级别比变量高=======
//3.词法作用域名当函数名和变量 忽略变量名
2.请写出如下输出值,并写出把注释掉的代码取消注释的值
this.a = 20;
var test = {
a: 40,
init:()=> {
console.log(this.a);
function go() {
// this.a = 60;
console.log(this.a);
}
go.prototype.a = 50;
return go;
}
};
//var p = test.init();
//p(); new(test.init())();
this.a = 20;
p = {
a:30,
test: function() {
console.log(this.a)
}
};
p.test(); // 30
var s = p.test;
s() // 20
this.a = 20;
var p = {
a:30,
test: function() {
// console.log(this.a)
this.a = 40
function s() {
this.a = 60;
console.log(this.a)
}
return s;
}
};
(p.test())()
//1.谁调用函数 this就指向谁
//2.init没宿主环境 window
//3.=> 绑定她爹的运行环境
//4.在类上的this 先绑定构造函数里的this
3.写出输出值,并解释为什么
function test(m) {
m = {v:5}
}
var m = {k: 30};
test(m);
alert(m.v); // undefined 重写了 如果将m={v:5}改为m.v=5,则可以打出5
4. 用es5实现一个let
let a = 1;
try{
throw 1;
}catch(a){
console.log(a);
}
(function (){
var a = 1;
})();
{
let a = 1;
}
console.log(a);
5. 请写出代码执行结果
参见第8题
function yideng() {
console.log(1);
}
(function () {
if (false) {
function yideng() {
console.log(2);
}
}
yideng();
})();
6. 请用一句话遍历变量a
Array.prototype.map.call(a,function(e){console.log(e)})
// es6方法
Array.form("abc")
[..."abc"]
[Symbol.iterator]
Reflext.set // 反射
7. 写出如下代码执行结果
var length = 10;
function fn() {
console.log(this.length);
}
var yideng = {
length: 5,
method: function (fn) {
fn();
arguments[0]();
}
};
yideng.method(fn, 1); // 10 2
8. 请写出输出值
alert(a);
yideng();
var flag = true;
if(!flag){
var a = 1;
}
if (flag) {
function yideng() {
console.log("yideng1");
}
} else {
function yideng() {
console.log("yideng2");
}
}
// undefined
// yideng is not a function
function yideng() {
console.log(1);
}
(function () {
if (false) {
function yideng() {
console.log(2);
}
}
yideng(); // yideng not a function
})();
// 因为函数名被提出来了,真实运行效果如下,所以会报不是一个函数
function yideng() {
console.log(1);
}
(function () {
var yideng; // function yideng(){} 简化为var yideng;
if (false) {
function yideng() {
console.log(2);
}
}
yideng(); // yideng not a function
})();
9. 变量a会被GC回收么,为什么
function test(){
var a = "yideng";
return function(){
eval("");
}
}
test()();
10. 写出输出值
Object.prototype.a = 'a';
Function.prototype.a = 'a1';
function Person(){};
var yideng = new Person();
console.log('p.a: '+ yideng.a); // a
console.log(1..a); // a
console.log(1.a); // 报错
11. 请写出你了解的ES6元编程
12. 请按照下方要求作答
const timeout = ms =>
new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, ms);
});
const ajax1 = () =>
timeout(2000).then(() => {
console.log("1");
return 1;
});
const ajax2 = () =>
timeout(1000).then(() => {
console.log("2");
return 2;
});
const ajax3 = () =>
timeout(2000).then(() => {
console.log("3");
return 3;
});
const mergePromise = (ajaxArray) =>{
//1,2,3 done [1,2,3] //【代码书写处】
}
mergePromise([ajax1, ajax2, ajax3]).then(data => {
console.log("done");
console.log(data); // data 为 [1, 2, 3]
});
// 执行结果为: 1 2 3 done [1,2,3]
13. 请写出如下输出值,并解释为什么
var s = [];
var arr = s;
for (var i = 0; i < 3; i++) {
var pusher = {
value: "item"+i
},
tmp;
if (i !== 2) {
tmp = []
pusher.children = tmp
}
arr.push(pusher);
arr = tmp;
}
console.log(s[0]);
14. 变态题
function fun(n, o) {
console.log(o);
return {
fun: function(m) {
return fun(m, n)
}
}
}
var a = fun(0);
a.fun(1); a.fun(2);
var b = fun(0).fun(1).fun(2).fun(3);
var c = fun(0).fun(1);
c.fun(2); c.fun(3);
15. 手动实现一个bind函数
Function.prototype.myBind = function(thisArg) {
if (typeof this !== 'function') {
return
}
var _self = this
var args = Array.prototype.slice.call(arguments, 1)
var fnNop = function () {} // 定义一个空函数
var fnBound = function () {
var _this = this instanceof _self ? this : thisArg
return _self.apply(_this, args.concat(Array.prototype.slice.call(arguments)))
}
// 维护原型关系
if (this.prototype) {
fnNop.prototype = this.prototype;
}
fnBound.prototype = new fnNop();
return fnBound;
}
16. 手写promise
参考:http://www.cnblogs.com/huansky/p/6064402.html
17. 数组去重
- set
- 利用对象
- 建新数组,与相邻的比较
参考:https://www.jb51.net/article/121410.htm
18、 手写一个代理
参考:https://www.jianshu.com/p/73b7b8e2b2d2
19、array与[ ]区别
除了在需要实例化一个对象,或罕见的需要延时加载数据的情况外,你基本上不需要使用new关键字。在Javascript里分配大量的new变量地址是一项很慢的操作,为了效率起见,你应该始终使用对象符号。
很简单,Array()是一个对象,[]是一个数据原型。使用new Array()系统每次都会新生成一个对象(浏览器每生成一个对象都会耗费资源去构造他的属性和方法),他的子集是[];
个人推荐使用[],效率高。浏览器对于CPU很吃紧,所以很多时候要有技巧。比如数字转换成字符只要a=a+'';就可以了,比用String效率高了很多。但是如果乱用是会造成错误的。
20、退出死循环
while(true){
throw new console.error(123)
}
网友评论