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的语言特性
- 运行在客户端浏览器上;
- 不用预编译,直接解析执行代码;
- 弱类型语言,较为灵活;
- 与操作系统无关,跨平台语言;
- 脚本语言,解释性语言;
webpack
webpack是一个现代JavaScript应用程序的静态模块打包器(module bundler)。当webpack处理应用程序时,会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有的这些模块打包成一个或多个bundle。
ant-design的优点和缺点
优点:组件非常全面,样式效果也都不错。
缺点:框架自定义程度低,默认UI风格修改困难。
浅谈堆和栈的理解
js变量存储有堆存储和栈存储。
基本数据类型的变量存储在栈中;
引用数据类型的变量存储在堆中;
引用类型数据的地址也存储在栈中;
当访问基础类型变量时,直接从栈中取值;
当访问引用类型变量时,先中栈中读取地址,再根据地址到堆中取出数据。
箭头函数与普通函数的区别
- 箭头函数没有this,需要通过查找作用域链确定this的值。如果箭头函数被普通函数包含,this绑定的就是最近一层非箭头函数的this。
- 箭头函数没有自己的arguments对象,但是可以访问外围函数的arguments对象。
- 不能通过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。
· 作用域是分层的,内层作用域可以访问外层作用域的变量,但反之则不行。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。