学习笔记-JS基础2

150 阅读3分钟

学习来源:JS基础知识(覆盖JS基础面试题)

3、作用域及闭包

3.1、变量提升

以下两种情况会进行提升:

  • 变量定义
  • 函数说明

3.2、this的几种不同的使用场景

  • 在构造函数中使用(构造函数本身)
  • 作为对象属性时使用(调用属性的对象)
  • 作为普通函数时使用(window)
  • call,apply,bind(执行的第一个参数)
var a={
    name: 'A',
    fun: function(){
        console.log(this.name);
    }
};
a.fun(); //this === a
a.fun.call({ name: 'B'}); //this === {name: 'B'}
fun1();

3.3、创建十个a标签,点击每个弹出对应序号

var i;
for (i = 0; i < 10; i++) {
  (function(i) {
    // 函数作用域
    var a = document.createElement('a');
    a.innerHTML = i + '<br>';
    a.addEventListener('click', function(e) {
      e.preventDefault();
      alert(i);
    });
    document.body.appendChild(a);
  })(i);
}

3.4、如何理解作用域

  • 自由变量

  • 作用域链,及自由变量的查找,找不到逐级向上找

  • 闭包的两个场景

    • 函数作为变量传递
    • 函数作为返回值

3.5、实际开发中闭包的应用

//判断一个数字是否出现
function idFirst(){
    var _list = [];
    return function(id){
        if(_list.indexOf(id) >= 0){
            return false;
        }else{
            _list.push(id);
            return true;
        }
    };
}
var first = isFirst();
first(10);
first(10);
first(30);

4、单线程和异步

4.1、同步和异步的区别,

列举一个同步和异步的例子

同步会堵塞代码,但异步不会,alert是同步,setTimeout是异步的

4.2、关于setTimeout的笔试题

console.log(1);
setTimeout(function(){
    consnsolg.log(2);
},0);
console.log(3);
setTimeout(function(){
    console.log(4);
},1000);
console.log(5);
//输出结果:13524

4.3、前端使用异步的场景

  • 定时任务:setTimeout,setInterval
  • 网络请求:ajax请求,动态img加载
  • 事件绑定

需要等待的情况下都需要异步,因为不会像同步那样堵塞

5、日期和Math

5.1、日期

console.log(Date now()); //获取当前毫秒数
var dt = new Date(); //获取当前时间
console.log(dt.getTime); //当前时间的毫秒数
console.log(dt.getFullYear());  //  年
console.log(dt.getMonth()+1); // 月(0-11)
console.log(dt.getDate());  // 日(0-31)
console.log(dt.getHours()); // 时(0-23)
console.log(dt.getMinutes()); // 分(0-59)
console.log(dt.getSeconds()); // 秒(0-59)

5.2、Math

  • Math.random() -返回0-1之间的随机数
  • Math.abs(x) -返回数的绝对值
  • Math.ceil(x) -向上取整
  • Math.floor-向下取整

5.3、常用数组api

  • forEach(遍历所有元素)
var arr = ['a','b','c','d'];
arr.forEach(function(item,index){
    console.log(item + ',' + index);
})
  • map(对数组进行重新组装,生成新的数组)
//map,生成新数组,不改变原来数组的格式
var arr = ['a','b','c','d'];
var result = arr.map(function(item,index){
    return index + '/' + item;
})
console.log(result);
  • sort(对数组进行排序)
//sort,会改变原来数组
var arr = [1,23,4,5];
var result = arr.sort(function(a,b){
    //从小到大排序
    return a - b;
    //从大到小排序
    return b - a;
})
console.log(result);
  • filter(过滤符合条件的元素)
var arr = [1,2,3,4];
var result = arr.filter(function(item,index){
    if(item < 3){
        return true;
    }
})
console.log(result);
  • every(判断所有元素是否都符合要求)
var arr = [1,2,3,4];
var result = arr.every(function(item,index){
    if(item < 3){
        return true;
    }
})
console.log(result); //false
  • some(判断是否至少有一个元素符合条件)
var arr = [1,2,3,4];
var result = arr.some(function(item,index){
    if(item < 3){
        return true;
    }
})
console.log(result); //true
  • join(根据条件对数组组合成字符串)
var arr = [1,2,3,4];
var result = arr.join(',');
console.log(result);
  • reverse(将数组反转)
var arr = [1,2,3,4];
var result = arr.renerse();
console.log(result);

5.4、常用的对象api

  • for in
  • hasOwnProperty(检查属性是不是对象自由的,排除从原型链找到的属性)
var obj = {
    x: 10,
    y: 20,
    z: 30
}
for(var key in obj) {
    if(obj.hasOwnProperty(key)){
        console.log(key + ';' + obj[key]);
    }
}

6、常见问题

6.1、获取当前日期

function formatDate(dt){
    if(!dt){
        dt new date();
    }
    var year = dt.getFullYear();
    var month = dt.getMonth() + 1;
    var date = dt.getDate();
    
    if(month < 10){
        month = '0' + month;
    }
    if(date < 10){
        date = '0' + date;
    }
    return year + '-' + month + date;
}
var newDate = new Date();
var formatDate = formatDate(nowDate);
console.log(formatDate);

6.2、获取随机数

要求长度一致的字符串格式

function randomStr(len){
    var random = Math.random();
    random = random + '000000'; //防止自动生成的数字不满足长度报错,并且强制转成字符串
    return random.substr(0,len);
}
console.log(randomStr(20));

6.3、写一个能遍历对象和数组的通用forEach函数

function forEach(obj,fn){
    if(obj instanceof Array){ //如果是数组
        obj.forEach(function(item,index){
            fn(index,item);
        })
    }else{ //是个对象
        for( var k in obj){
            if(obj.hasOwnProperty(key)){
                fu(key,obj[key]);
            }
        }
    
    }
}
var arr = [1,2,3,4];
forEach(arr,dunction(index,item){
    console.log(index + ',' + item);
})
var obj = {
    x: 10,
    y: 20
};
forEach(obj,function(index,item){
    console.log(index + "," + item);
});

\