第一题.(5分)
JavaScript中的数据类型有哪几种?并写出判断数据类型的方法
题解:
Number、Boolean、String、Undefined、Null、object
typeof可以用来检测变量的数据类型
第二题.(5分)
简述一下let,var,const的区别;
题解:
var:全局作用域,声明变量提升
let:块级作用域,声明变量不会被提升,不允许重复声明
const:块级作用域,定义后值不能修改,声明变量不会被提升
第三题.(5分)
JavaScript中call,apply,bind的区别和用法
题解:
call: 是函数对象的方法,用于在指定的上下文中调用函数。它接受一个参数列表,第一个参数是要设置为函数上下文的对象,其余参数是函数的参数。call会立即调用函数。
apple:在指定的上下文中调用函数,接受一个参数数组作为参数,而不是一个参数列表,也会立即调用函数
bind:用于创建一个新的函数,它与原始函数具有相同的功能,但永久性地绑定到指定的上下文。不会立即调用函数,可以接受参数,这些参数会被传递给原始函数
第四题.(5分)
JavaScript对象创建的方式有哪些?
题解:
利用对象字面量创建
//利用对象字面量创建对象 {}
var obj = {}; //创建了一个空的对象
var obj = {
unname: '',
age: '',
sex: '',
height: '',
sayHi: function() {
console.log(12);
}
}
里面属性或者方法采取键值对形式
多个属性或者方法之间用逗号隔开
方法冒号后面跟的是一个匿名函数
利用new Object创建对象
// 利用new Object() 创建对象
var obj = new Object(); //创建一个空的对象
obj.uname = 'zhang';
obj.age = 18;
obj.sayHi = function() {
console.log(12);
}
(1)利用等号赋值的方法添加对象的属性和方法
(2)每个属性和方法之间用分号
利用构造函数创建对象
// 利用构造函数创建对象
// 前两种方法一次只能创建一个对象
function 构造函数名() {
this.属性 = 值;
this.方法 = function() {}
}
new 构造函数名();
// 构造函数 把对象里面的一些相同属性的方法和属性抽象出来封装到函数里面
(1).构造函数名字首字母大写
(2).我们构造函数不需要return就可以返回结果
调用函数返回的是一个对象
利用new关键字调用函数的行为叫实例化
(3).调用构造函数,必须使用new
(4).我们只要new Star()调用函数就创建了一个对象 ldh{}
(5).我们属性和方法前面必须添加this
第五题.(5分)
简述一下浏览器的垃圾回收机制
题解:
js中内存的分配和回收都是自动完成的,内存在不使用的时候会被垃圾回收器自动回收
内存的生命周期:
内存分配:声明变量或函数时,系统会自动分配内存
内存使用:读写内存,也就是使用变量、函数
内存回收:使用完毕,由垃圾回收器自动回收不再使用的内存
全局变量在页面关闭时回收
局部变量的值在不用时自动回收掉
内存泄漏:程序中分配的内存由于某种原因未释放或无法释放叫内存泄漏
两种垃圾回收算法: 引用计数法 标记清除法
引用计数法:看一个对象是否有指向它的引用,没有引用了就回收对象
存在问题:嵌套引用,如果两个对象向相互引用,尽管已经不再使用,垃圾回收器不会进行回收,导致内存泄漏
因为他们引用的次数永远不会是0
标记清除法:将“不再使用的对象”定义为“无法到达的对象”
从根部出发定时扫描内存的中的对象,凡是能从根部到达的对象。都是还需要的对象
无法从根部触及到的对象被标记为不再使用,稍后进行回收
第六题.(5分)
New操作符执行过程
题解:
1.创建一个新的空对象
2.将新对象的原型指向构造函数的原型
3.执行构造函数
4.返回新对象
第七题.(10分)
已知如下数组,编写一个程序将数组扁平化去并除其中重复部分数据,最终得 到一个不重复的数组
如var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]
化为:arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
题解:
function splitAndFlatten(arr) {
const flatArray = arr.toString().split(',').map(Number);
return Array.from(new Set(flatArray));
}
上述函数先将数组按[]进行分割之后再对其进行去重处理。
二.代码输出题(40分)
第八题.(10分)()()
题解:2
因为调用了两次函数,第一次调用b的值为1,但a的值变为2
所以在第二次调用后b的值变为2.
第九题(10分)(事件循环机制)
题解:
1、4、5、7、6、3、2
先根据顺序输出1、4,然后new promise是一个同步操作,然后输出里面的5,然后将then里面的内容放在异步栈中,最后输出7,在同步任务进行完后,开始进行异步操作,而异步操作分为微任务和宏任务,then属于微任务所以先执行,输出6,然后再执行计时器,根据时间输出。
第十题.(10分)(作用域和this指向)
person1:普通调用函数,this指向调用它的函数
window:箭头函数中this与普通函数完全不同,也不受调用方式的影响,事实上箭头函数并不存在this
1.箭头函数中的this引用就是最近作用域的this
2.向外层作用域中一层一层找this,知道由this定义
window:两个函数构成立即执行函数,其this指向全局作用域
person1:里面的this指向外层作用域的this,所以指向上一层的person1
window:箭头函数this只指向外层作用域,不受call、bind和apply的影响
第十一题(10分)(变量)
题解: 0~10
functionArray里面存的是一个函数用来打印i的值
在上面循环结束时i的值时10,所以最后打印的是10