美文网首页
es5疑难解析

es5疑难解析

作者: zxhnext | 来源:发表于2019-03-20 12:00 被阅读0次

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. 数组去重

  1. set
  2. 利用对象
  3. 建新数组,与相邻的比较
    参考: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)
}

相关文章

网友评论

      本文标题:es5疑难解析

      本文链接:https://www.haomeiwen.com/subject/igxzmqtx.html