### 简答
1:如何理解原型?
1.没创建一个对象时都会关联另一个对象,这个对象就是原型对象。创建出来的对象都会从原型中继承属性和方法。
2.每一个对象都有一个_proto_属性。
3.把所有对象的共用属性全存放在一个对象。然后让每一个对象的_proto_都指向这个存放共用属性的对象的地址。
4.而这个共用属性就是原型。原型主要是为了减少不必要的内存消耗。
2:如何理解继承?
1.继承就是对共性的属性与方法继承给另一个类。并加入私有属性和方法。使另一个类拥有这个类的属性和方法。
2.实现代码的复用。
3:class类名中super你是怎么应用?
1.super 当作函数使用 实参给父类中的constructor函数形参赋值的
2.super 当作对象使用 指向父类的prototype
4:函数的原型与普通对象的原型之间有什么关系?
1.实例对象的原型与构造函数的原型是同一个。
5:什么是作用域链
1.当代码执行时,会创建一个变量对象的作用域链。由当前作用域往父级作用域中寻找变量,就叫做作用域链
6:什么是闭包?闭包特点?
闭包是由函数以及声明该函数的词法环境组合而成的。该环境包含了这个闭包创建时作用域内的任何局部变量(闭包维持了一个对它的词法环境的引用:在一个函数内部定义的函数,会将外部函数的活跃对象添加到自己的作用域链中)。所以可以在一个内层函数中访问到其外层函数的作用域。
特点:
1.防止变量污染
2.闭包中变量没有被销毁
3.从表面上看,函数外部可以访问内部变脸,实际上都是因为作用域和作用域链的特点实现的
7:什么是词法作用域?
1.又称静态作用域指的是函数在声明时就确定好了访问权限
8:执行上下文中有哪些内容?
1.创建执行上下文栈。
2.程序执行时创建执行上下文对象,并把对象推入到执行栈中。
3创建全局上下文实例。
4当函数执行时回创建函数上下文实例,并将上下文推送到执行栈中。执行完毕后从执行栈中移除上下文,并销毁
5关闭浏览器时,全局上下文销毁,执行栈销毁
9:谈谈你对执行栈的理解
1.执行代码队列。
2.将要执行代码推送到代码队列中。
4.然后按顺序执行。
5.执行完毕后会销毁相应的代码队列。
10 浏览器时间循环机制是什么?
1.JavaScript代码的执行过程中,除了依靠函数调用栈来搞定函数的执行顺序外,还依靠任务队列(task queue)来搞定另外一些代码的执行。整个执行过程,我们称为事件循环过程。
2.一个线程中,事件循环是唯一的,但是任务队列可以拥有多个。任务队列又分为macro-task(宏任务)与micro-task(微任务),在最新标准中,它们被分别称为task与jobs。
11 js严格模式和非严格模式区别是什么
1.严格模式通过抛出错误来消除了一些原有静默错误。
2.严格模式修复了一些导致 JavaScript引擎难以执行优化的缺陷:有时候,相同的代码,严格模式可以比非严格模式下运行得更快。
3.严格模式禁用了在ECMAScript的未来版本中可能会定义的一些语法。
### 函数封装题目
1:模拟map
function map(arr, callback) {
let les = []
if (!arr instanceof Array) {
throw new Error('arr not is Array')
}
if(!callback instanceof Function){
throw new Error('arr not is Function')
}
for (let i = 0; i < arr.length; i++) {
let val = callback(arr[i], i)
les.push(val)
}
return les
}
2:模拟filter
function filter(arr, callback) {
let res = [];
for (let i = 0; i < arr.length; i++) {
let tmp = callback(arr[i], i)
if (tmp) {
res.push(arr[i])
}
}
return res
}
3:请手写instanceof原理函数?
function new_instance_of(leftVaule, rightVaule) {
let rightProto = rightVaule.prototype;
leftVaule = leftVaule.__proto__;
while (true) {
if (leftVaule === null) {
return false;
}
if (leftVaule === rightProto) {
return true;
}
leftVaule = leftVaule.__proto__
}
}
4:请写出递归深拷贝函数
function deepCopy(data){
let res;
if(!(data instanceof Object)) return data;
res = (data instanceof Object) && Array.isArray(data)?[]:{};
for(let k in data){
res[k] = deepCopy(data[k])
}
return res;
}
5:封装一个数组去重的方法:
function removeArr(arr1) {
let arr=[]
if (!arr instanceof Array) {
throw new Error('arr not is Array')
}
for (let i = 0; i < arr1.length; i++) {
arr[i]=arr1[i]
}
for (let i = 0; i < arr.length - 1; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] == arr[j]) {
arr.splice(arr[j], 1)
i--
}
}
}
return arr
}
### 程序题
> 请写出下面变量的访问权限是什么??
1.
~~~js
var a = 23;
function foo(){
var b = 23;
c = 123
function bar(){
var c = 123;
var d = 345
return function (){
if(c){
var e = 213
}
}
}
let res= bar()
res();
}
~~~
1.var a 全局变量
2. var b foo()里 局部变量
3.c在foo() 局部变量
4.var c在bar()里 局部变量
5.var d 在bar()里 局部变量
6.var e 在 bar() 局部变量
7.let res 在foo() 局部变量
8.res()在foo() 局部变量
2.
~~~js
if(123){
let a = 123;
}
var a = 345;
{
let b = 456;
}
~~~
1.let a 全局变量
2.var a 全局变量
3.let b 全局变量
3.
~~~js
function foo(){
a = 123
for(let i in [1,2]){}
function bar(){
c = 123;
var c;
}
bar()
}
foo()
~~~
1.a foo()里 局部变量
2.let i for() 局部变量
3.c bar() 局部比爱能量
4.var c bar()局部变量
> 请写出表达式运算过程
~~~
let a= 123;
a = 123
let res = a && 'hellow'
res=123='hellow'
let res1 = true && 'dafsd' && 0 && 'aaaaa'
res1 = true = 'dafsd' = 0
let res1 = true && 'dafsd' && 10 && 'aaaaa'
res1 = true = 'dafsd' = 10 = 'aaaaa'
let res = 0 || undefined || null || 34-12;
res=34-12=22
let res = 0 || []
res =[]
let res1 = 0 || {}
res1 = {}
网友评论