原生JS面试题3

六、面向对象和面向过程各有什么的优点?

面向过程:
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源。
缺点:没有面向对象易维护、易服用、易扩展。
面向对象(OOP):
优点:易维护、易复用、易扩展。由于面向对象有封装、继承、多态的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护。
缺点:性能比面向过程低。

有人这么形容OP和OO的不同:用面向过程的方法写出来的程序是一份蛋炒饭,而用面向对象写出来的程序是一份盖浇饭。
 盖浇饭的好处就是"菜"“饭"分离,从而提高了制作盖浇饭的灵活性。饭不满意就换饭,菜不满意换菜。用软件工程的专业术语就是"可维护性"比较好,“饭”
和"菜"的耦合度比较低。蛋炒饭将"蛋”“饭"搅和在一起,想换"蛋”"饭"中任何一种都很困难,耦合度很高,以至于"可维护性"比较差。

七、用原生 js 实现懒加载

1、 懒加载的概念:在图片非常多的应用场景,为了提高也没面加载速度,改善用户体验,我们对未出现在视野范围内的图片先不进行加载,等到出现在视野范围才去加载。

2、为什么要懒加载:懒加载( LazyLoad )是前端优化的一种有效方式,极大的提升用于体验,图片一直是页面加载的流量大户,现在一张图片几兆已经是很正常的事,远远大于代码的大小。倘若一次ajax请求过来10张图片的地址,而且一次性把10张图片都加载出来,肯定是不合理的,后果是:
1)、会显示的很慢,多加载1秒都会引起用户的流失,这对靠流量的网站来说绝对是噩梦;
2)、用户如果只是随便看看,没想全部看,这无疑是浪费了用户很多流量。
3、懒加载的实现原理:
原理很简单,先把img的src指向空或者一个小图片,图片真实的地址存储在img的一个自定义的属性里,比如data-xx = “ 图片的真实地址 ”。添加滚动条事件,当页面滚动直至此图片出现在可视区域时,用js取到该图片的data-xx 的值赋给 src。
在这里插入图片描述

八、ES6具体指的是什么?列举并解释你常用的ES6新方法及其作用

ES6是ECMAScript 的第6个版本,2015年发布

总结:
1、块级作用域 : const,let命令
const声明一个只读的常量。一旦声明,常量的值就不能改变。这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。

注意: const的作用域与let命令相同:只在声明所在的块级作用域内有效。
let 有块级作用域,只在 let 命令所在的代码块内有效。
注意:let、const 不存在变量、常量提升

在这里插入图片描述

2、模板字符串
反引号。 在${ } 中写变量
在这里插入图片描述

3、 箭头函数
箭头函数通俗点讲就是匿名函数。 箭头函数没有this,他的this和js普通函数中 .bind( this )差不多,都是指向定义时所在的环境

4、解构赋值
1)数组的解构赋值
在这里插入图片描述
在这里插入图片描述 2)对象的解构赋值
在这里插入图片描述

5、ES6 标准的 Promise

6、for .. of .. 遍历

for in是ES5标准,遍历key. ==
for of是ES6标准,遍历value.

遍历数组通常使用for循环,ES5的话也可以使用 forEach ,ES5具有遍历数组功能的还有map( forEach没有返回值,map有返回值,)、fiter(过滤关键字)、some(判断数组中是否有符合条件的元素,如大于10)、every(判断是否所有的元素都符合条件)、reduce(累加器)等。只不过他们的返回结果不一样,但是使用 foreach遍历数组的话,使用break不能中断循环,使用return也不能返回到外层函数。

Array.prototype.method = function(){
    console.log(this.length)
}

var myArray = [1,2,3,4,5,6,7]
myArray.name = "数组"
for(var index in myArray){
    console.log(myArray[index])
}

使用 for in 也可以遍历数组,但是会 存在以下问题

1.index索引为字符串型数字,不能进行运算几何运算
2. 遍历顺序有可能不是按照数组的内部顺序
3. 使用 for in 会遍历数组所有的可枚举属性,包括原型。例如上例的原型方法method和name属性

所以for in更适合遍历对象,不要使用for in 遍历数组
那么除了使用for 循环,如何更简单的正确的遍历数组达到完美的期望呢(即不遍历 method和name)。ES6中的 for of 更胜一筹

var myArray = [1,2,3,4,5,6,7]
for(let value of myArray){
    console.log(value)
}

记住,for in 遍历的是数组的索引, 而 for of遍历的是数组元素的值

for of 遍历的只是数组内的元素,而不包括数组的原型属性 method 和索引 name

遍历对象,通常用 for in 来遍历对象的键名

Object.prototype.method = function(){
    console.log(this)
}
var myObject = {
    a:1,
    b:2,
    c:3
}

for(let key in myObject){
    console.log(key)
}

for in 可以遍历到 myObject的原型方法 method,如果不想遍历原型方法和属性的话,可以在循环内部判断一下,hasOwnPropery方法可以判断某属性是否是该对象的实例属性

7、Class 类
在这里插入图片描述

8、 Module 模块 : import 导入模块, export 导出模块

9、拓展的对象功能
1)对象初始化简写。
es5如果出现键值对重名的,可以简写
在这里插入图片描述

2)es6通过省略冒号与 function 关键字,为对象添加方法:

在这里插入图片描述

9、展开运算符
ES6 中一个好玩的特性就是 展开运算符 也是三个点儿 …
在这里插入图片描述
10、Set 和 Map 数据结构
1) Set
ES6提供了新的数据结构Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
Set 本身是一个构造函数,用来生成数据结构。
Set 函数可以接受一个数组 作为参数,用来初始化
在这里插入图片描述
利用扩展运算符 [ …set ] 可以将 set 类数组数据,转换成一个真正的数组

上述代码也展示了一种去除数组重复成员的方法。
在这里插入图片描述

扩展:
在这里插入图片描述

Set 实例的属性和方法
在这里插入图片描述在这里插入图片描述

Arra. from 方法也可以 将 Set 结构 转为 数组
在这里插入图片描述

扩展运算符 ( … ) 和 Set 结构相结合, 就 可以去除数组的重复成员。

在这里插入图片描述
Babel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执行。
Babel的配置文件是.babelrc,存放在项目的根目录下。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值