1 Star 0 Fork 0

计爱玲 / fed-e-task-01-01

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
Apache-2.0

简答题

1. 请说出下列最终的执行结果,并解释为什么?

var a = []
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i)
  }
}
a[6]() // 10

答:输出结果为10。因为var是全局变量,当执行a6的时候,函数体中的变量i,JS引擎会根据作用域去查到,在函数作用域里查不到i的定义,就会往上层作用域查找,直到在全局作用域中查到i,此时i已经变成了10。 如果希望调用ai的结果输出i,可以将for循环中的i的声明由var改为let。因为let会产生块级作用域。执行函数时函数内的变量i可以在for循环里面每次产生的块级作用域里查到i的值。

var a = []
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i)
  }
}
a[6]() // 6

除此之外,还可以通过闭包的形式,用函数作用域摆脱全局作用域的影响。将每一轮的变量i放到闭包中,执行函数的时候,JS引擎根据作用域查找时,在当前闭包中就可以查到当前的i的值,而当前i的值就是每轮循环时的i。

var a = []
for (let i = 0; i < 10; i++) {
  a[i] = (function(i){
    return function () {
      console.log(i)
    }
  })(i)
}
a[6]() // 6

2. 请说出下列最终的执行结果,并解释为什么?

var tmp = 123
if (true) {
  console.log(tmp)
  let tmp
}

答:会在console.log(tmp)时报错:ReferenceError: Cannot access 'tmp' before initialization 因为在ES6中,let定义的变量会产生块级作用域,虽然在全局用var tmp = 123 定义了tmp,但是在进入if里面后,又用let重新定义了tmp,此时的if作用域的tmp都是let变量声明的块级变量,全局变量tmp已经被屏蔽了。当执行console.log(tmp)时,根据作用域的查找原则,JS引擎会先在代码执行处的最内层的块级作用域中查找,如果查找不到才会往上级作用域查找。而在if块级作用域中有tmp的声明,但是console.log(tmp)在执行的时候,tmp还未被初始化,所以会报错。


3. 结合ES6新语法,用最简单的方式找出数组中的最小值

var arr = [12, 34, 32, 89, 4]
const minValue = Math.min(...arr)
console.log(minValue) // 4

4. 请详细说明var、let、const三种声明变量的方式之间的具体差别?

答:let const都是块级作用域,let是变量,const是常量。var定义的变量在创建和初始化的过程会提升。let和const定义的变量创建过程会提升,但初始化过程没有提升。而const只有创建和初始化过程,没有赋值过程,不可以被重新赋值。

console.log(t) // undefined
var t
console.log(t) // ReferenceError: Cannot access 't' before initialization
let t

5. 请说出下列代码最终输出的结果,并解释为什么?

var a = 10
var obj = {
  a: 20,
  fn() {
    setTimeout(() => {
      console.log(this.a)
    })
  }
}
obj.fn()

答:输出20。setTimeout中的函数是箭头函数,箭头函数中的this指向的是上层作用域中的this,也就是普通函数fn(){}函数体的this。而fn()是对象obj的成员方法,在调用时fn内的this指向函数的调用者,也就是obj,所以this.a就是obj.a,所以输出20。


6. 简述Symbol类型的用途?

答:Symbol是ES6新增的一种基础数据类型,最主要的作用就是为对象添加独一无二的属性名。console.log(Symbol() === Symbol()) // false

const obj = {
  [Symbol()]: 11
}

此时obj的这个Symbol属性不可被枚举。


7. 说说什么是浅拷贝,什么是深拷贝?

答:JS的数据类型分为值类型和引用类型。值类型变量是存放在栈中,引用类型变量是将内存地址放在栈中,而栈中的地址指向了堆中的一块区域,堆中这个地址存放的内容才是这个引用类型变量的真正的内容。 在浅拷贝时,值类型会直接拷贝,而引用类型只拷贝了变量的地址,新的变量和原变量还会指向同一个堆中的区域。新变量的改变会对原变量产生影响,因为内存地址相同,其中一个变量的改变,其实改变的是同一个内存中的东西。

let a = 1
let b = a
b = 2
// 值类型拷贝新变量不会对原变量产生影响。
console.log(a === b, a, b) // false 1 2

let c = {
  name: 'cathy'
}
let d = c
d.name = 'jal'
// 引用类型拷贝新变量会对原变量产生影响。
console.log(c === d, c, d) // true { name: 'jal' } { name: 'jal' }

而在深拷贝时,遇到值类型会直接拷贝,遇到引用类型时,会进行递归拷贝,如果这个引用类型是数组/对象,则判断数组的每一个元素/属性值,如果是值类型,则直接拷贝,如果是引用类型,则再对这个元素/属性值进行判断,递归下去,直到拷贝完整个对象为止。 这是我之前写的深拷贝案例:

/**
 * 深拷贝
 * @param {Object} obj 要拷贝的对象
 */
function deepClone(obj) {
  if (typeof obj !== 'object' || obj === null) return obj
  let newObj
  if (obj instanceof Array) {
    newObj = []
  } else {
    newObj = {}
  }
  for (let key in obj) {
    if (obj.hasOwnProperty(key))
      newObj[key] = deepClone(obj[key])
  }
  return newObj
}

8. 谈谈你是如何理解JS异步编程的,Event Loop是做什么的,什么是宏任务,什么是微任务?

JS是单线程语言,指JS执行环境中那个负责执行代码的线程只有一个。但是JS的运行环境以及JS的某些API在运行时是可以开启新的线程的。当JS代码的回调栈中进行某些耗时任务时,会将这些耗时任务放到WebAPI中,等到可以执行的时候,就会进入消息队列中。当回调栈空的时候,会被Event Loop监听到,Event Loop会从消息队列中取出第一个任务放到回调栈中让主任务执行。 notes/img/IMG_0159.jpeg JS回调队列中的任务称之为【宏任务】,而宏任务执行过程中可以临时加上一些额外需求,可以选择作为一个新的宏任务进到队列中排队(如setTimeout),也可以作为当前任务的【微任务】,直接在当前任务结束后立即执行。

微任务的目的是为了提高整体的响应能力,目前绝大多数异步调用都是作为宏任务执行,Promise 、MutationObserver、process.nextTick 是作为微任务在本轮调用的末尾执行。


9. 将下面异步代码使用Promise改进?

setTimeout(function() {
  var a = 'hello'
  setTimeout(function () {
    var b = 'lagou'
      setTimeout(function () {
        var c = 'I love U'
        console.log(a + b + c)
      }, 10)
  }, 10)
}, 10)

改为Promise后:

new Promise((resolve, reject) => {
  setTimeout(() => {
    var a = 'hello'
    resolve(a)
  }, 10);
})
.then(res=>{
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      var b = ' lagou'
      resolve(res + b)
    }, 10);
  })
})
.then(res => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      var c = ' I love U'
      resolve(res + c)
    }, 10);
  })
})
.then(res => {
  console.log(res)
})
.catch(err=>{
  console.log(err)
})

10. 请简述TypeScript和JavaScript之间的联系

答:TypeScript是JavaScript的超集,是基于JavaScript之上的编程语言,它解决了JavaScript类型系统的问题。TypeScript的语法上对JavaScript兼容,JavaScript代码完全可以当做TypeScript代码运行。不过TypeScript在JavaScript基础上,有了更严格的类型要求。如果有错误的类型问题,JavaScript在运行时才会暴露出来,而TypeScript则会在项目编译初期就会报错。


11. 请谈谈你所认为的TypeScript优缺点

答: 优点:

  • JavaScript的超集/扩展集
  • 任何一种JavaScript运行环境都支持
  • 功能更为强大,生态也更健全、更完善

缺点:

  • 语言本身多了很多概念
  • 项目初期,TypeScript会增加一些成本
Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

简介

ES6+、异步编程、TypeScript 展开 收起
Apache-2.0
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/jiailing/fed-e-task-01-01.git
git@gitee.com:jiailing/fed-e-task-01-01.git
jiailing
fed-e-task-01-01
fed-e-task-01-01
master

搜索帮助