new操作符做了什么
- 创建一个空对象,并且this变量引用该对象,同时还继承了该函数的原型
- 属性和方法被加入到this引用的对象中
- 新创建的对象由this所引用,并且最后隐式的返回this
- 如果函数内部显式返回对象类型数据,则返回该数据,执行结束,不然返回新创建的对象。
等价于
var obj = {}; obj.__proto__ = Base.prototype; Base.call(obj);
xml和json的区别
区别 | xml | javascript | json |
名称 | EXtensible Markup Language | JavaScript Object Notation | |
定义 | 轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式 | ||
不必须使用双引号包裹需要 | 键必须由双引号包裹 | ||
来源 | 源自SGML。 | 基于JavaScript语言 | |
数据体积 | 数据体积小,传递更快 | ||
命名空间 | XML支持名称空间 | 不提供对命名空间的任何支持 | |
安全 | 相对安全 | 相对不安全 | |
支持编码 | 支持各种编码 | 仅支持UTF-8编码 | |
注释 | 支持注释。 | 不支持注释 | |
数据交互 | 与js交互更加方便,更容易解析处理 键必须是字符串,值必须是数据类型, | ||
数据描述 | 数据描述明确 | ||
传输速度 | 远远快于xml |
let,var,const详解
let
- 声明的变量。只在let命令所在的代码块内有效。
- 不能预解析,提前调用的结果是报错。
- 不能重复,否则执行报错。
var
- 预解析提前调用的结果是undefined
- 变量名可以重复,效果是重复赋值
const
- 只读的常量 。一旦声明, 常量的值就不能改变。
- 声明时必须初始化
- const保证的并不是变量的值不动,而是变量指向的内存地址不得改动
- 使用Object.freeze(obj) 冻结obj,就能使其内的属性不可变,但它有局限,就是obj对象中要是有属性是对象,该对象内属性还能改变,要全不可变,就需要使用递归等方式一层一层全部冻结。
const dog = {} dog.name = 'wangcai' dog // {name: "wangcai"}
暂时性死区TDZ
-暂时性死区,意思是变量在作用域内已经存在,必须在let/const声明后面使用。
-TDZ本质:只要一进入当前作用域,所要使用的变量就已经存在,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
TDZ也意味着typeof不再是一个百分百安全的操作。
typeof a; Let a;
变量a,使用let命令声明之前,都属于a的“死区”,只要用到该变量就会报错。因此,typeof运行时就会抛出一个ReferenceError.
作为比较,如果一个变量根本没有被声明,使用typeof反而不会报错。
ES6规定暂时性死区和let,const语句不出现变量提升,主要是为了减小运行时的错误,防止变量在声明前就使用这个变量。
Bigint和Number的区别
- Number类型的数字有精度限制,数值的精度只能到 53 个二进制位(相当于 16 个十进制位,
正负9007199254740992),大于这个范围的整数,就无法精确表示了。
- Bigint没有位数的限制,任何位数的整数都可以精确表示。但是其只能用于表示整数,且为了与Number进行区分,
- BigInt 类型的数据必须添加后缀n。BigInt 可以使用负号(-),但是不能使用正号(+)。
- 另外number类型的数字和Bigint类型的数字不能混合计算。
- 12n+12;//报错
箭头函数和普通函数的区别
- 箭头函数和普通函数的声明不同,箭头函数语法更加简洁、清晰
- 箭头函数会捕获其所在上下文的 this 值,作为自己的 this 值,定义的时候就确定并固定
- 箭头函数不能作为构造函数使用,也不能使用new关键字(因为箭头函数没有自己的this
- 它的this其实是继承了外层执行环境中的this,且this指向永远不会改变,作为构造函数其的this要是指向创建的新对象)
- 箭头函数没有自己的arguments。在箭头函数中访问arguments实际上获得的是外层局部(函数)执行环境中的值
- call、apply、bind 并不会影响其 this 的指向
- 箭头函数没有原型prototype
- 箭头函数不能当作 Generator(生成器) 函数,不能使用 yield 关键字。
Generator(生成器)函数
- 生成器特别适合要迭代的值不是某个数据结构的元素,而是计算结果的场景
创建生成器首先要定义一个生成器函数,使用function* ,调用生成器不会执行函数体,而是会返回一个生成器对象,调用它的next方法会导致生成器函数的函数体从头开始执行,直至遇见一个yield语句,yield相当于return,yield语句的值会成为调用迭代器的next的返回值
function* oneDigitPrimes() {
yield 2;
yield 3;
yield 5;
yield 7;
}
let primes = oneDigitPrimes();
console.log(primes);//oneDigitPrimes {<suspended>}
console.log(...primes);//2 3 5 7
const Seq = function*(from, to) {
for (let i = from; i < to; i++) yield i;
};
[...Seq(3, 5)]; //[3,4,5]
//使用yield*简化 不只返回一个值,而是迭代可迭代对象并返回送得到的每个值
function* sequence(...iterables) {
for (let iterable of iterables) {
yield* iterable;
}
}
//yield和yield*只能在生成器函数中使用,可以迭代任何可迭代对象
function* oneAndDone() {
yield 1;
return "done";
}
[...oneAndDone()]; //[1],不会出现'done'
用框架和不用框架的区别 vue和react的区别?
1. 框架的好处:使用框架写项目 代码最终还是会编译成原生html css js 而框架为开发者做了很多事情 让其开发者只需关注业务逻辑即可 极大的提高了开发速度
2. 例如前端框架根本上是解决了 ui 与状态 同步问题 频繁操作dom 导致性能底下 中间步骤多 容易出错 易产生bug 不易维护
3. 组件化: 其中以react为例 react组件化最为彻底 甚至可以到函数级别的组件 高度的组件化 使我们的工程易维护 易组合扩展
4. jquery时代的代码 耦合严重 现代框架不管是mac mvp mvvm都能帮助我们分层 代码解耦 更易读写
5. 生态 现在的框架都自带生态 都很丰富 不管还数据管理框架 或者ui库 都有成熟的解决方案
6. 框架的缺点代码臃肿 使用时需将整个代码引入框架 而框架封装了很多功能组件 使用者需要按照规则使用 而且实际有些功能组件使用不到
7. 框架更新迭代快 需要持续学习熟悉
8. vue 和 react 的区别:框架的思想差异:react整体是函数式的思想 把组件设计成纯组件 把状态和逻辑通过参数传入 所以在react中是单项数据流
get和post请求的区别?
1. 传参不同get参数是存储在url地址栏中 post则是存储在message body 请求头里面 get需要使用 Request.QueryString 来获取 而post则使用Request.form来获取变量 get通过uri post使用表单
2. get提交数据大小有限制 post 无大小限制
3. get会把数据缓存起来 post 不会缓存数据
4. get数据不安全 post较安全 https 最安全
5。get对数据进行查询 post 对数据进行修改
6. 推荐使用post 因为不会缓存数据
defer和async的区别?
1. script 标签中的两个属性
2. defer 中文的意思是延迟 其作用是脚本会等到页面解析完毕后延迟执行 先下载脚本 延迟执行1. async 中文意思是异步 和defer类似 都用与改变脚本的行为 告诉浏览器立即下载文件 但与defer不同 async不保证脚本的先后执行顺序 用与 互相之间不依赖的脚本加载。
2. 一般用来优化解决 页面加载阻塞 白屏
3. 当然最稳妥的办法还是把script标签放置在body的底部,没有兼容性问题,不会因此产生白屏问题,没有执行顺序问题。
tcp和udp的区别?
1. tcp 是面向连接的 udp是无连接的即 发送数据前 不需要建立连接
2. tcp是可靠的服务 通过tcp传送的数据 无差错 不丢失 不重复 按顺序到达 udp 尽最大努力传送 不保证可靠交付 因此tcp 适合大数据量的交换
3. tcp 是面向字节 udp是面向报文的
4. tcp只能是一对一 而udp支持一对一 对多
5. tcp 面向连接 的可靠传输 udp 不可靠
. http 1.0 1.1 2.0的区别?
1. http 1.0 (构建可扩展性) 原有的应用非常局限 浏览器服务器的迅速扩展使其用途更广
2. 版本信息会随着请求发送
3. 状态代码行也会在响应开始时发送,允许浏览器本身了解请求的成功或失败,并相应调整其行为(如特定的方式更新或使用缓存)
4. 引入了http请求头的概念 无论请求还是响应 允许传输元数据 并是协议非常灵活可扩展
5. content-type标头 告诉客户端实际返回的内容的类型 在其帮助下增加了传输除纯文本html文件外的其他类型文档的能力
6. http 1.1 (标准化的协议)http 1.0 多种不同实现 应用有些混乱 http1.1 是一个标准化的版本 重点关注的是校正http设计中的结构性缺陷
7. 连接可以重复使用 节省了多次打开他的时间 以显示单个原始文档中的资源
8. 增加流水线操作 允许前一个请求完全发送前发送第二个请求 以降低通信的延迟
9. 支持响应分块
10. 引入了额外的缓存控制机制
11. 引入内容协商 语言编码类型 允许客户端服务器约定最合适的内容进行交换
12. 通过host头 能够使不同的域名配置在同一个ip地址的服务器
13. 安全性得到提高
14. http 2.0 http2是二进制协商而不是文本协议 不在可读无障碍的手动创建
15. 这是一个复用协议 并行的请求可以在同一个链接中处理 移除了http1.x中的顺序和阻塞约束
16. 压缩headers 因为headers在请求中往往是相似的 降低了成本
17. 允许服务器在客户端缓存中填充数据 通过一个服务器推送机制 来提前请求
mongodb 和 mysql的区别?
数据库 mongodb mysql
数据库模型 非关系型 关系型
存储方式 以类json文档格式存储 不同的引擎有不同的储存方式
查询语句 专属的mongodb查询方式(类似javascript函数) sql语句
数据处理方式 基于内存 将热数据存在物理内存中 达到高速读写 不同的引擎有不同的特点
成熟度 新兴数据库 成熟度较低 成熟度高
广泛度 nosql数据库 比较完善且开源 使用人数不断增长 开源数据库 市场份额不断增长
事务性 只支持单文档实事务操作 弱一致性 支持事务操作
占用空间 占用空间大 占用空间小
join操作 mongodb 没有join Mysql支持
进程线程的区别?
1. 根本区别 进程是操作系统资源分配基本单位 线程是处理器任务调度和执行基本单位
2. 资源开销 每个进程都有独立的代码和数据空间 进程之间的切换会有较大的开销 线程可以看做轻量级的进程 同一类线程共享代码和数据空间 每个线程都有独立的运行栈和程序计数器 线程之间切换开销小
3. 包含关系 如果一个进程里面有很多线程 则执行过程不是一条线的 而是多条线程共同完成的 线程是进程的一部分 所以 线程也被称为 轻量级进程
4. 内存分配 统一进程的线程是可以共享本进程的地址空间和资源 而进程之间是相互独立的地址空间和资源独立
5. 影响关系 因为进程有独立的地址空间 一个进程崩溃 其他进程不会受到影响 而线程之间没有独立的地址空间 一个线程死掉 整个进程就挂掉了 所以多进程要比多线程健硕