new 运算符的执行过程

1. 新生成一个对象;
2. 链接到原型:obj._proto_ = Con.prototype;
3. 绑定this: apply;
4. 返回新对象(如果构造函数有自己的 return 时,则返回该值)
new操作符的原理:
· 创建一个类的实例:创建一个空对象obj,然后把这个空对象的_proto_设置为构造函数的prototype;
· 初始化实例:构造函数被传入参数并调用,关键字this被设定指向该实例obj;
· 返回实例obj。

代码的复用

当你发现代码开始写第二遍的时候,就要考虑如何复用了:
1. 函数封装
2. 继承
3. 复制 extend
4. 混入 mixin
5. 借用 apply/call

模块化

模块化大大提高了项目的可维护性、可拓展性和可协作性。通常,在浏览器中使用ES6的模块化支持,在Node中使用 common.js 的模块化支持。
@1 es6: import / export;
@2 common.js: require / module.exports / exports;
@3 amd: require / defined;

require与import的区别

· require 支持动态导入,import不支持,正在提案(bable 下可支持)。
· require 属于同步导入,import属于异步导入。
· require是值拷贝,导出值变化不会影响导入值;import指向内存地址,导入值会随导出值而变化。

babel 编译原理

1. babylon 将ES6/ES7代码编译成AST。
2. babel-traverse对AST进行遍历转译,得到新的AST。
3. 新AST通过babel-generator转换成ES5。

AST:抽象语法树(Abstract Syntax Tree),是将代码逐字母解析成 树状对象 的形式。这是语言之间的转换、代码语法检查、代码风格检查、代码格式化、代码高亮、代码错误提示和代码自动补全等等的基础。

函数柯里化

在一个函数中,首先填充几个参数,然后再返回一个新的函数的技术。,称为函数的柯里化。
通常可用于在不侵入函数的前提下,为函数预置通用参数,供多次重复调用。
const add = function add(x){
  return function (y){
     return x+y
  }
}
const add1 = add(1)
add1(2) === 3
add1(21) === 22

JS的语言特性

  1. 运行在客户端浏览器上;
  2. 不用预编译,直接解析执行代码;
  3. 弱类型语言,较为灵活;
  4. 与操作系统无关,跨平台语言;
  5. 脚本语言,解释性语言;

webpack
webpack是一个现代JavaScript应用程序的静态模块打包器(module bundler)。当webpack处理应用程序时,会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有的这些模块打包成一个或多个bundle。

ant-design的优点和缺点
优点:组件非常全面,样式效果也都不错。
缺点:框架自定义程度低,默认UI风格修改困难。

浅谈堆和栈的理解

js变量存储有堆存储和栈存储。
基本数据类型的变量存储在栈中;
引用数据类型的变量存储在堆中;
引用类型数据的地址也存储在栈中;
当访问基础类型变量时,直接从栈中取值;
当访问引用类型变量时,先中栈中读取地址,再根据地址到堆中取出数据。

箭头函数与普通函数的区别

  1. 箭头函数没有this,需要通过查找作用域链确定this的值。如果箭头函数被普通函数包含,this绑定的就是最近一层非箭头函数的this。
  2. 箭头函数没有自己的arguments对象,但是可以访问外围函数的arguments对象。
  3. 不能通过new关键字调用,同样也没有new.target值和原型。

ES6新特性

· 新增了let const 声明变量(有局部变量的概念);
· 结构赋值;
· 模板字符串、函数的默认参数、对象属性的简洁表达方式;
· 新的数据类型 symbol,新的数据结构set和map;
· 为解决异步回调问题引入的 promise和generator;
· 实现Class和模块,通过Calss可以更好的面向对象编程,使用模块加载方便模块化编程。(考虑到浏览器兼容,实际开发中使用babel进行编译);
· 块级作用域,ES5只有全局作用域和函数作用域,块级作用域的好处是不再需要立即执行的函数表达式,循环体中的闭包不再有问题;
· rest参数,用于获取函数的多于参数,这样就不需要使用arguments对象了;
· promise,一种异步编程的解决方案,比传统的解决方案回调函数和事件更合理强大;
· 模块化,模块功能主要有两个命令构成,export和import,export命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能。

call和apply

call和apply的作用是差不多的,只是传参的形式有区别:
1. 改变this指向;
2. 借用别的对象的方法;
3. 调用函数,因为apply、call方法会让函数立即执行。

js代码中的“use strict”
除了正常模式外,EcmaScript5添加了第二种运行模式:"严格模式"。

1. 消除 js 不合理、不严谨的地方,减少怪异行为;
2. 消除代码运行的不安全之处;
3. 提高编译器的效率,提高运行速度;
4. 为未来的js新版本做铺垫。

JOSN
全程:JavaScript Object Notation。
JSON中对象通过"{}"来标识,一个"{}"代表一个对象,对象的值是键值对形式(key:value)。JSON是JS的一个严格的子集,一种轻量级的数据交互格式,类似于xml。数据格式简单,易于读写,占用带宽小。
两个函数:

· JSON.parse(string):解析JSON字符串,把JOSN字符串变成JavaScript值或对象;
· JSON.stringify(obj):将一个JavaScript值(对象或数组)转换为一个JSON字符串;
· eval('('+json')'): 用eval方法注意加括号,而且这种方法更容易被攻击。

渐进增强和优雅降级
渐进增强:

针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进,达到更好的用户体验。

优雅降级:

一开始就构建完整的功能,然后再针对低版本的浏览器进行兼容。

作用域

· 作用域就是一个独立的地盘,让变量不会外泄、暴露出去。
· 隔离变量,不同作用域下的同名变量不会有冲突。
· ES6之前只有全局作用域和函数作用域。ES6提供了"块级作用域",let、const。
· 作用域是分层的,内层作用域可以访问外层作用域的变量,但反之则不行。

粘贴复制专家
1 声望0 粉丝