1.什么叫优雅降级和渐进增强?

优雅降级:
Web站点在所有新式浏览器中都能正常工作,
如果用户使用的是老式浏览器,
则代码会针对旧版本的IE进行降级处理了,
使之在旧式浏览器上以某种形式降级体验却不至于完全不能用。
如:border-shadow 渐进增强:
从被所有浏览器支持的基本功能开始,
逐步地添加那些只有新版本浏览器才支持的功能,
向页面增加不影响基础浏览器的额外样式和功能的。
当浏览器支持时,它们会自动地呈现出来并发挥作用。
如:默认使用flash上传,
但如果浏览器支持 HTML5 的文件上传功能,
则使用HTML5实现更好的体验;

2.举一些ES6对Object类型做的常用升级优化?

优化部分

对象属性变量式声明。
ES6可以直接以变量形式声明对象属性或者方法。
比传统的键值对形式声明更加简洁,
更加方便,语义更加清晰. let [apple, orange] = ['red appe', 'yellow orange']; // let myFruits = {apple: 'red appe', orange: 'yellow orange'};
let myFruits = {apple, orange};
尤其在对象解构赋值(见优化部分b.)或者模块输出变量时,
这种写法的好处体现的最为明显 let {keys, values, entries} = Object; // let MyOwnMethods = {keys: keys, values: values, entries: entries}
let MyOwnMethods = {keys, values, entries}; 可以看到属性变量式声明属性看起来更加简洁明了。
方法也可以采用简洁写法 let es5Fun = {
method: function(){}
}; let es6Fun = {
method(){}
}
对象的解构赋值。
ES6对象也可以像数组解构赋值那样,
进行变量的解构赋值 let {apple, orange} = {apple: 'red appe', orange: 'yellow orange'}; 对象的扩展运算符(...)。
ES6对象的扩展运算符和数组扩展运算符用法本质上差别不大,
毕竟数组也就是特殊的对象。
对象的扩展运算符一个最常用也最好用的用处就在于可以轻松的取出
一个目标对象内部全部或者部分的可遍历属性,
从而进行对象的合并和分解 let {apple, orange, ...otherFruits} =
{apple: 'red apple', orange: 'yellow orange', grape: 'purple grape', peach: 'sweet peach'};
// otherFruits {grape: 'purple grape', peach: 'sweet peach'}
// 注意: 对象的扩展运算符用在解构赋值时,
// 扩展运算符只能用在最有一个参数(otherFruits后面不能再跟其他参数)
let moreFruits = {watermelon: 'nice watermelon'};
let allFruits = {apple, orange, ...otherFruits, ...moreFruits}; super 关键字。
ES6在Class类里新增了类似this的关键字super。
同this总是指向当前函数所在的对象不同,
super关键字总是指向当前函数所在对象的原型对象 升级部分 ES6在Object原型上新增了is()方法,
做两个目标对象的相等比较, //false其实是不合理的,Object.is修复了这个小bug。
//(Object.is(NaN, NaN) // true)
用来完善'==='方法。
'==='方法中NaN === NaN ES6在Object原型上新增了assign()方法,
用于对象新增属性或者多个对象合并 const target = { a: };
const source1 = { b: };
const source2 = { c: };
Object.assign(target, source1, source2);
target // {a:1, b:2, c:3} 注意:
assign合并的对象target只能合并source1、source2中的自身属性,
并不会合并source1、source2中的继承属性,
也不会合并不可枚举的属性,
且无法正确复制get和set属性(会直接执行get/set函数,取return的值) ES6在Object原型上新增了getOwnPropertyDescriptors()方法,
此方法增强了ES5中getOwnPropertyDescriptor()方法,
可以获取指定对象所有自身属性的描述对象。
结合defineProperties()方法,
可以完美复制对象,
包括复制get和set属性
ES6在Object原型上新增了getPrototypeOf()和setPrototypeOf()方法,
用来获取或设置当前对象的prototype对象。
这个方法存在的意义在于,
ES5中获取设置prototype对像是通过__proto__属性来实现的,
然而__proto__属性并不是ES规范中的明文规定的属性,
只是浏览器各大产商“私自”加上去的属性,
只不过因为适用范围广而被默认使用了,
再非浏览器环境中并不一定就可以使用,
所以为了稳妥起见,
获取或设置当前对象的prototype对象时,
都应该采用ES6新增的标准用法
ES6在Object原型上还新增了Object.keys(),
Object.values(),Object.entries()方法,
用来获取对象的所有键、所有值和所有键值对数组

3.举一些ES6对Function函数类型做的常用升级优化?

优化部分:

箭头函数(核心)。
箭头函数是ES6核心的升级项之一,
箭头函数里没有自己的this,
这改变了以往JS函数中最让人难以理解的this运行机制。 主要优化点: 箭头函数内的this指向的是函数定义时所在的对象,
而不是函数执行时所在的对象。
ES5函数里的this总是指向函数执行时所在的对象,
这使得在很多情况下this的指向变得很难理解,
尤其是非严格模式情况下,
this有时候会指向全局对象,
这甚至也可以归结为语言层面的bug之一。 ES6的箭头函数优化了这一点,
它的内部没有自己的this,这也就导致了this总是指向上一层的this,
如果上一层还是箭头函数,则继续向上指,
直到指向到有自己this的函数为止,并作为自己的this
箭头函数不能用作构造函数,
因为它没有自己的this,无法实例化
也是因为箭头函数没有自己的this,
所以箭头函数 内也不存在arguments对象。(可以用扩展运算符代替)
函数默认赋值。 ES6之前,
函数的形参是无法给默认值得,
只能在函数内部通过变通方法实现。
ES6以更简洁更明确的方式进行函数默认赋值 function es6Fuc (x, y = 'default') {
console.log(x, y);
}
es6Fuc() // 4, default 升级部分 ES6新增了双冒号运算符,
用来取代以往的bind,call,和apply。(浏览器暂不支持,Babel已经支持转码) foo::bar;
// 等同于
bar.bind(foo); foo::bar(...arguments);
// 等同于
bar.apply(foo, arguments);

4.Generator函数是什么,有什么作用?

如果说JavaScript是ECMAScript标准的一种具体实现、
Iterator遍历器是Iterator的具体实现,
那么Generator函数可以说是Iterator接口的具体实现方式。
执行Generator函数会返回一个遍历器对象,
每一次Generator函数里面的yield都相当一次遍历器对象的next()方法,
并且可以通过next(value)方法传入自定义的value,来改变Generator函数的行为。
Generator函数可以通过配合Thunk 函数更轻松更优雅的实现异步编程和控制流管理。

5.什么是 Babel?

Babel 是一个 JS 编译器,
自带一组 ES6 语法转化器,
用于转化 JS 代码。
这些转化器让开发者提前使用最新的 JS语法(ES6/ES7),
而不用等浏览器全部兼容。
Babel 默认只转换新的 JS 句法(syntax),
而不转换新的API。

撩课-Web大前端每天5道面试题-Day30的更多相关文章

  1. 撩课-Web大前端每天5道面试题-Day10

    1. px和em的区别? px和em都是长度单位; 区别是: px的值是固定的,指定是多少就是多少, 计算比较容易. em得值不是固定的,并且em会继承父级元素的字体大小. 浏览器的默认字体高都是16 ...

  2. 撩课-Web大前端每天5道面试题-Day4

    1. 如何实现瀑布流? 瀑布流布局的原理: ) 瀑布流布局要求要进行布置的元素等宽, 然后计算元素的宽度, 与浏览器宽度之比,得到需要布置的列数; ) 创建一个数组,长度为列数, 里面的值为已布置元素 ...

  3. 撩课-Web大前端每天5道面试题-Day1

    1. var的变量提升的底层原理是什么? JS引擎的工作方式是: 1) 先解析代码,获取所有被声明的变量: 2)然后在运行.也就是说分为预处理和执行两个阶段. 变量提升:所有变量的声明语句都会被提升到 ...

  4. 撩课-Web大前端每天5道面试题-Day11

    1. 如何手写一个JQ插件? 方式一: $.extend(src) 该方法就是将src合并到JQ的全局对象中去: $.extend({ log: ()=>{alert('撩课itLike');} ...

  5. 撩课-Web大前端每天5道面试题-Day31

    1.web storage和cookie的区别? Web Storage的概念和cookie相似, 区别是它是为了更大容量存储设计的. Cookie的大小是受限的, 并且每次你请求一个新的页面的时候C ...

  6. 撩课-Web大前端每天5道面试题-Day25

    1.web前端开发,如何提高页面性能优化? 内容方面: .减少 HTTP 请求 (Make Fewer HTTP Requests) .减少 DOM 元素数量 (Reduce the Number o ...

  7. 撩课-Web大前端每天5道面试题-Day7

    1. 你能描述一下渐进增强和优雅降级之间的不同吗? 定义: 优雅降级(graceful degradation): 一开始就构建站点的完整功能, 然后针对浏览器测试和修复 渐进增强(progressi ...

  8. 撩课-Web大前端每天5道面试题-Day23

    1.为什么用Nodejs,它有哪些优缺点? 优点: 事件驱动,通过闭包很容易实现客户端的生命活期. 不用担心多线程,锁,并行计算的问题 V8引擎速度非常快 对于游戏来说,写一遍游戏逻辑代码,前端后端通 ...

  9. 撩课-Web大前端每天5道面试题-Day16

    1.for循环中的作用域问题? 写出以下代码输出值,尝试用es5和es6的方式进行改进输出循环中的i值. ; i<=; i++) { setTimeout(function timer() { ...

随机推荐

  1. Html Agility Pack解析Html(C#爬虫利器)

    有个需求要写网络爬虫,以前接触过一个叫Html Agility Pack这个解析html的库,这次又要用到,然而发现以前咋用的已经不记得了,现在从头开始记录一下使用过程. Html Agility P ...

  2. mac下查看jdk安装版本及安装目录

    使用IntelliJ idea新建工程时需要查看jdk安装目录,记录下来为以后备用. mac自带jdk,查看jdk版本: IcarusdeMacBook-Pro:~ icarus$ java -ver ...

  3. 2018-2019-2 20175230 实验三《Java面向对象程序设计》实验报告

    目录 实验三 实验三 敏捷开发与XP实践 实验内容 实验要求 实验步骤 (一) 编码标准 (二)敏捷开发与XP (三)敏捷开发与XP 实验体会 实验三 实验三 敏捷开发与XP实践 实验内容 1.XP基 ...

  4. “全栈2019”Java多线程第三十一章:中断正在等待显式锁的线程

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  5. Linux系统文件与目录管理(1)

    文件与目录的操作 在Linux系统的文件与目录的管理上,不外乎『显示属性』.『拷贝』.『删除文件』.『移动文件或目录』.『重命名』等常用操作,由于文件与目录的管理在 Linux当中是很重要的,尤其是每 ...

  6. 转---单页面应用下的JS内存管理

    正文从这开始- 内存问题对于后端童鞋而言可能是家常便饭,特别是C++童鞋.我在实习时做过半年的c++游戏客户端开发(也是前端开发哦),也见识了各式各样的内存问题,就说说我的第一个坑,当时做个需求,就是 ...

  7. git小乌龟工具TortoiseGit记住你的账号密码

    在使用TortoiseGit的过程中,发下每次push或者pull都要重复输入账号密码,非常麻烦 怎么设置记住密码 在[系统盘]:\Users[你的用户名](比如C:\User\Administrat ...

  8. Selenium3 + Python3自动化测试系列三——控制浏览器操作

    控制浏览器操作 控制浏览器窗口大小 在测试过程中,我们在打开浏览器后,根据需求可自定义调整浏览器的尺寸大小.WebDriver提供了set_window_size()方法来设置浏览器的大小. 如果页面 ...

  9. 桶排序和计数排序的理解实现和比较(Java)

    比较和非比较的区别 常见的快速排序.归并排序.堆排序.冒泡排序等属于比较排序.在排序的最终结果里,元素之间的次序依赖于它们之间的比较.每个数都必须和其他数进行比较,才能确定自己的位置.比较排序的优势是 ...

  10. 在MVC3中使用富文本编辑器:KindEditor的配置及上传图片

    现在比较常用的富文本编辑挺多的,如ueditor.fckeditor.kingeditor等,本文主要介绍一下KindEditor的配置与使用. 先去官网http://www.kindsoft.net ...