【无标题】一些小知识点总结

1、请简述var和let的区别?

var是es5中的定义变量的方法,let是es6中定义变量的方法。

var定义的变量存在声明提升,let定义的变量存在暂时性死区。

var定义的变量只有全局作用域和函数作用域、没有局部作用域,let定义的变量存在块级作用域

let不能重复定义,var可以重复定义。

2、请谈谈对变量声明提升和函数提升的理解?

es5使用var定义变量在程序的执行时回优先将定义变量的过程提升到最开始。

使用函数声明定义变量时,函数的声明及变量的赋值都会被提升到最开始。

当变量名和函数名相同时,因为函数声明提升还有赋值的过程,所以,优先于变量提升。

3、内存分为几个区域,各区域存储什么样的数据,特点是什么?

堆内存和栈内存、代码内存

栈内存存储的总大小比较小,存储的数据大小固定,采用后进先出的方式,访问速度快,通常用来存储值类型的数据及(内存空间、指针),执行上下文。

堆内存的存储大小比较大,存储数据大小不固定(树状结构存储),先进后出,访问速度慢。

通常用来存储引用类型(对象类型)的值。

4、函数fn分别使用call、apply、bind改变this指向obj,并传入参数1,2,3

fn.call(obj,1,2,3)  fn.apply(obj,[1,2,3])  fn.bind(obj)(1,2,3)

5、什么是闭包。闭包的理解,闭包的优缺点?

广义上,所以的函数都是闭包函数。狭义上说,函数将上级作用域内的数据通过return被返回从出去,供其他作用域访问的过程叫闭包。

优点:封装且回形成单向数据流,有利于大型程序的数据流控制。

缺点:容易造成内存泄漏(内存溢出)

6、请说明this指向问题?

1、全局作用域下,this始终指向window对象

2、函数内部的this,在非严格模式下,this通常指向window对象

3、函数内部的this,在严格模式下,函数没有没有写明哪个对象调用函数,this指向未定义

4、箭头函数中没有this和arguments,与箭头函数当前作用域内的this指向相同

5、call、apply、bind可以改变this指向 

6、构造函数中的this 指向new之后的对象

        构造函数生成对象时,this指向生成对象的实例。

        没有生成前,函数的this没有确定指向。 

7、原形链中的this 指向调用它的对象

7、写出class继承的关键代码

class a{

        constructor(){}

}

class b extends a{
        constructor(){
                super();

        }

}

8、简述浅拷贝和深拷贝的区别,并说明深浅拷贝各有几种方式?

浅拷贝是只拷贝对象的引用,深拷贝是引用及数据都拷贝。

当对象的值还是对象时,拷贝的过程如果只对第一级深拷贝,之后都是浅拷贝,称为浅拷贝,

对所有级别都进行深拷贝,才叫深拷贝

浅拷贝的方式:[...arr]  arr.concat([])  Object.assign({},obj1)  {...obj1}

深拷贝的方式:JSON.parse(JSON.Stringify(obj))

                递归 代码如下

let target = {};
        cloneObj(target, obj)
        console.log(target);

        console.log(obj.demo == target.demo);
        function cloneObj(target, source) {//target 目标对象 obj源对象
            // 如何获取对象的所有属性
            for (const key in source) {
                // console.log(key);
                // 获取属性值
                // console.log(obj, source[key]);
                // 判断属性值是否为基本数据类型
                if ((typeof source[key] != 'object') || (source[key] == null)) {
                    // 处理基本数据类型
                    // console.log(source[key]);
                    target[key] = source[key];
                } else {
                    // 处理数组和对象
                    // 判断是否为数组
                    if (source[key] instanceof Array) {
                        // console.log(source[key]);
                        // 解构赋值
                        // target[key] = [...source[key]]
                        // 将属性值对应数组中的元素取出来存在新的数组
                        let newArr = [...source[key]];
                        // 将新的数组添加到target中
                        target[key] = newArr;
                    } else {
                        // console.log(source[key]);
                        let newObj = {};
                        cloneObj(newObj, source[key]);
                        target[key] = newObj

                    }

                }
            }
        }

9、npm中的package.json文件的作用,如何生成

npm init

记录了当前项目的基本信息(项目名称、作者、描述、版本)、所有需要使用的包、script运行快捷方式、browser List信息

10、Nodejs中的模块化,如何导出数据。exports和module.exports的区别

导出数据module.exports  exports

导入数据Require

区别 当时module.exports exports指向同一个对象,导出时,以module.exports为准

11、es6模块化如何导出 接收数据

导出export  export default

export  import {} from ‘’

export default  import 变量 from '' import ''

12、Es6模块化和nodejs模块化的区别

es6模块化是异步导入,nodejs模块化是同步导入。

nodejs模块化运行缓存,首次导入时,生成对象,后续导入都指向这一个对象。

es6模块化每个模块导入时都只运行一次,多个模块化导入时,每次导入都运行一下

13、简述express中间件的作用,写出一个空的中间件基本格式

express 的中间件作用是 拦截http请求,做出回应

App.use(function(req,res,next){

        next();

}

14、写出加密组件crypto的基本过程

const jiami = crypto.creatHash('sha1');
jiami.update(字符串)
jiami.digest('hex')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值