博主全网搜集了2021最火面试题——js篇

1. 例举3种强制类型转换和2种隐式类型转换?

string,boolean,number,undefined,function,object

2.数组方法pop() push() unshift() shift()

push()尾部添加
pop()尾部删除
unshift()头部添加
shift()头部删除

3.IE和标准下有哪些兼容性的写法

var ev = ev || window.event
document.documentElement.clientWidth || document.body.clientWidth
Var target = ev.srcElement||ev.target

4.call和apply的区别

Object.call(this,obj1,obj2,obj3)
	Object.apply(this,arguments)

5事件委托是什么

利用事件冒泡的原理,让自己的所触发的事件,让他的父元素代替执行!

6.闭包是什么,有什么特性,对页面有什么影响

闭包就是能够读取其他函数内部变量的函数,使得函数不被GC回收,如果过多使用闭包,容易导致内存泄露

7 .添加 删除 替换 插入到某个接点的方法

1)创建新节点
	createElement() //创建一个具体的元素
	createTextNode() //创建一个文本节点
	
	2)添加、移除、替换、插入
	appendChild() //添加
	removeChild() //移除
	replaceChild() //替换
	insertBefore() //插入
	
	3)查找
	getElementsByTagName() //通过标签名称
	getElementsByName() //通过元素的Name属性的值
	getElementById() //通过元素Id,唯一性

8.document load 和document ready的区别

document.onload 是在结构和样式,外部js以及图片加载完才执行js
document.ready是dom树创建完成就执行的方法,原生种没有这个方法,jquery中有 $().ready(function)

9函数声明与函数表达式的区别?

在Javscript中,解析器在向执行环境中加载数据时,对函数声明和函数表达式并非是一视同仁的,解析器会率先读取函数声明,
并使其在执行任何代码之前可用(可以访问),至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解析执行。

10.对作用域上下文和this的理解,看下列代码:

var User = {
 count: 1,
 getCount: function() {
  	return this.count;
 }
};
console.log(User.getCount()); // what?
var func = User.getCount;
console.log(func()); // what?
问两处console输出什么?为什么?
答案:是1和undefined。
func是在window的上下文中被执行的,所以不会访问到count属性。

11. 例举3种强制类型转换和2种隐式类型转换?

答案:强制(parseInt,parseFloat,number) 隐式(== ===)

12.Javascript的事件流模型都有什么?

var a = null; alert(typeof a); 答案:object
解释:null是一个只有一个值的数据类型,这个值就是null。表示一个空指针对象, 所以用typeof检测会返回”object”。

13.回答以下代码,alert的值分别是多少?

<script>
     var a = 100;  
     function test(){  
        alert(a);  
     a = 10;  //去掉了var 就变成定义了全局变量了
        alert(a);  
}  
test();
alert(a);
</script>
正确答案是: 100, 10, 10

14.javaScript的2种变量范围有什么不同?

全局变量:当前页面内有效 局部变量:函数方法内有效

15. null和undefined的区别?

null是一个表示"无"的对象,转为数值时为0;undefined是一个表示"无"的原始值,转为数值时为NaN。
当声明的变量还未被初始化时,变量的默认值为undefined。 null用来表示尚未存在的对象
undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。典型用法是:
(1)变量被声明了,但没有赋值时,就等于undefined。
(2)调用函数时,应该提供的参数没有提供,该参数等于undefined。 (3)对象没有赋值的属性,该属性的值为undefined。
(4)函数没有返回值时,默认返回undefined。 null表示"没有对象",即该处不应该有值。典型用法是: (1)
作为函数的参数,表示该函数的参数不是对象。 (2) 作为对象原型链的终点。

16. js延迟加载的方式有哪些?

defer和async、动态创建DOM方式(创建script,插入到DOM中,加载完毕后callBack)、按需异步载入js

17.列举javaScript的3种主要数据类型,2种复合数据类型和2种特殊数据类型。

主要数据类型:string, boolean, number
复合数据类型:function, object
特殊类型:undefined,null

18.offsetWidth offsetHeight和clientWidth clientHeight的区别

(1)offsetWidth (content宽度+padding宽度+border宽度)
(2)offsetHeight(content高度+padding高度+border高度)
(3)clientWidth(content宽度+padding宽度)
(4)clientHeight(content高度+padding高度)

19.闭包的好处

(1)希望一个变量长期驻扎在内存当中(不被垃圾回收机制回收)
(2)避免全局变量的污染
(3)私有成员的存在
(4)安全性提高

20.冒泡排序算法

// 冒泡排序
var array = [5, 4, 3, 2, 1];
var temp = 0;
for (var i = 0; i <array.length; i++) {
	for (var j = 0; j <array.length - i; j++) {
		if (array[j] > array[j + 1]) {
		temp = array[j + 1];
		array[j + 1] = array[j];
		array[j] = temp;
	 	}
	}
}

21.数组去重方法

var arr = [1, 1, 8, 8, 12, 12, 15, 15, 16, 16];
// 1.es6数组去重
function unique(arr) {
    return Array.from(new Set(arr))
}
console.log(unique(arr))
// 2.ES5去重(利用for嵌套for,然后splice去重)
var arr = [1, 1, 8, 8, 12, 12, 15, 15, 16, 16];
function unlink(arr){
    for(var i = 0;i<arr.length;i++){
        for(var j = i+1;j<arr.length; j++) {
            if(arr[i] == arr[j]){
                arr.splice(j, 1);
                j--
            }
        }
    }
    return arr;
}
unlink(arr)
// 3、利用indexOf去重
var arr = [1, 1, 8, 8, 12, 12, 15, 15, 16, 16];
function unlink(arr) {
    if (!Array.isArray(arr)) {
        console.log('错误!')
        return
    }
    var array = [];
    for (var i = 0; i < arr.length; i++) {    // 首次遍历数组
        if (array.indexOf(arr[i]) === -1) {   // 判断索引有没有等于
            array.push(arr[i])
        }
    }
    return array
}
console.log(unlink(arr));
// 4、利用filter
var arr = [1, 1, 8, 8, 12, 12, 15, 15, 16, 16];
function unlink(arr) {
    return arr.filter(function (item, index, arr) {
        //当前元素,在原始数组中的第一个索引==当前索引值,否则返回当前元素
        return arr.indexOf(item, 0) === index;
    });
}
console.log(unlink(arr));

22.dom事件委托什么原理,有什么优缺点?

事件委托原理:事件冒泡机制 优点
1.可以大量节省内存占用,减少事件注册。比如ul上代理所有li的click事件就很不错。
2.可以实现当新增子对象时,无需再对其进行事件绑定,对于动态内容部分尤为合适 缺点 事件代理的常用应用应该仅限于上述需求,如果把所有事件都用事件代理,可能会出现事件误判。即本不该被触发的事件被绑定上了事件。

23.js基础数据类型和引用类型分别是什么?这个前提条件下写一个getType,返回相应的类型

1.基本数据类型(自身不可拆分的):Undefined、Null、Boolean、Number、String
2.引用数据类型(对象):Object (Array,Date,RegExp,Function) ES6基本数据类型多了个symbol 据说这道题刷了百分之二十的人 感谢Abbyshen提出 function gettype(nm){
return Object.prototype.toString.call(nm); }

24.proto、prototype、Object.getPrototypeOf()

__proto__是指内部原型,和Object.getPrototypeOf()结果等价
function f(){}
f.__proto__ === Object.getPrototypeOf(f); //true
f.prototype === Object.getPrototypeOf(f); //false

25.setTimeout 和 setInterval 细谈

常问的点,前者是在一定时间过后将函数添加至执行队列,执行时间=延迟时间+之前函数代码执行时间+执行函数时间。
后者是不管前一次是否执行完毕,每隔一定时间重复执行,用于精准执行互相没有影响的重复操作。
如果需要控制前后执行顺序,最好使用setTimeout模拟setInterval
var time = 400, times = 0, max = 10;
	function func(){
	  times++;
	  if(times < max){
	    //code here
	    setTimeout(func, time);
	  } else {
	    console.log("finished");
	  }
	}
setTimeout(func, time);

26、闭包相关

什么是闭包
闭包是指有权访问另一个函数作用域中变量的函数

怎么创建闭包
在函数内部嵌套使用函数

function fn() {
           for (var i = 0; i < 2; i++) {
               (function () {
                   var variate = i;
                   setTimeout(function () {
                       console.log("setTimeout执行后:"+variate);
                   }, 1000);
               })();//闭包,立即执行函数,匿名函数

           }
          console.log(i);//2
          console.log(variate);//variate is not defined
       }
       fn();

为什么用闭包
因为在闭包内部保持了对外部活动对象的访问,但外部的变量却无法直接访问内部,避免了全局污染;
可以当做私有成员,弥补了因js语法带来的面向对象编程的不足;
可以长久的在内存中保存一个自己想要保存的变量.
闭包的缺点
可能导致内存占用过多,因为闭包携带了自身的函数作用域
闭包只能取得外部包含函数中得最后一个值

27.forEach和map的区别

相同点 都是循环遍历数组中的每一项
forEach和map方法里每次执行匿名函数都支持3个参数,参数分别是item(当前每一项)、index(索引值)、arr(原数组)
匿名函数中的this都是指向window 只能遍历数组 都有兼容问题 不同点 map速度比foreach快
map会返回一个新数组,不对原数组产生影响,foreach不会产生新数组, map因为返回数组所以可以链式操作,foreach不能

28.js加载位置区别优缺点

1.html文件是自上而下的执行方式,但引入的css和javascript的顺序有所不同,css引入执行加载时,程序仍然往下执行,而执行到<script>脚本是则中断线程,待该script脚本执行结束之后程序才继续往下执行。
所以,大部分网上讨论是将script脚本放在之后,那样dom的生成就不会因为长时间执行script脚本而延迟阻塞,加快了页面的加载速度。
2.但又不能将所有的script放在body之后,因为有一些页面的效果的实现,是需要预先动态的加载一些js脚本。所以这些脚本应该放在之前。
3.其次,不能将需要访问dom元素的js放在body之前,因为此时还没有开始生成dom,所以在body之前的访问dom元素的js会出错,或者无效
4.script放置位置的原则“页面效果实现类的js应该放在body之前,动作,交互,事件驱动,需要访问dom属性的js都可以放在body之后