文章目录
1. let、const、var的区别
-
let
完全可以取代var
,因为两者语义相同,而且let
没有副作用。let
不会变量提升,只在块级作用域内有用 -
在
let
和const
之间,建议优先使用const
,尤其是在全局环境,不应该设置变量,只应设置常量。 -
const
优于let
有几个原因。一个是const
可以提醒阅读程序的人,这个变量不应该改变;另一个是const
比较符合函数式编程思想,运算不改变值,只是新建值,而且这样也有利于将来的分布式运算;最后一个原因是 JavaScript 编译器会对const
进行优化,所以多使用const
,有利于提高程序的运行效率,也就是说let
和const
的本质区别,其实是编译器内部的处理不同
2. map与普通对象的区别
普通对象只能用字符串当作键,而es6中的map数据结构,类似于对象,也是键值对的集合,但是键的范围不限于字符串,各种类型的值(包括对象)都可以当作键
3. 常用es6语法
箭头函数,模板字符串、变量解构赋值、proxy、promise对象、class类的引入、set与map数据结构
4. 常见解决跨域方法
-
jsonp跨域
通过script标签引入js文件,这个js文件又会返回一个js函数调用,也就是请求后通过callback方式回传结果
优点:
1.不受同源策略限制
2.兼容性更好
3.支持老版本浏览器缺点:只支持get请求
-
cors跨域
使用自定义的http头部请求。让浏览器与服务器之间进行沟通,从而决定请求或相应是否成功
优点:
- 支持所有类型的http请求
- 比jsonp有更好的错误处理机制
- 被大多数浏览器支持
-
h5的postMessage方法
h5新特性,目前只支持窗口(iframe)之间交换数据, 不能和服务端交换
5. ajax了解
客户端发起请求,获取或发送服务端数据的一项技术
优势
- 无刷新页面
- 服务器端任务转到客户端处理
- 减轻浏览器负担节约带宽
- 彻底将页面与数据分离
缺点
- 无法使用回退按钮
- 不利于网页seo
- 不能发送跨域请求
6. 闭包
嵌套函数引用了外部函数变量的函数叫做闭包。可能会造成变量污染
7. window.location对象包括哪些属性
hash、host、hostname、href、origin、pathname、search、protocol
8. 轮播图实现原理概述
一系列的大小相等的图片平铺,利用CSS布局只显示一张图片,其余隐藏。通过计算偏移量利用定时器实现自动播放,或通过手动点击事件切换图片
9. this的指向
this永远指向最后调用它的那个对象
Tips:改变this指向的方法:
- 使用es6的箭头函数,箭头函数的this始终指向函数定义时的this、而非执行时
- 函数内部使用_this=this
- 使用apply、call、bind
- new实例化一个对象
10. 严格模式理解
引自阮一峰老师博客详解严格模式
严格模式是ES5中提出的运行模式,其目的为下面几个
- 消除js语法的一些不合理、不严谨之处,减少一些怪异行为;
- 消除代码运行的不安全之处,保证代码运行安全
- 提高编译器效率,增加运行速度
- 为未来新版本的js做好铺垫
调用:
<script>
"use strict"; // 必须放在第一行
</script>
// 针对函数
function strict(){
"use strict";
return "这是严格模式"
}
规定:
- 全局变量必须显示声明
- 禁止使用with语句
- 创设eval作用域。正常模式下,eval语句的作用域,取决于它处于全局作用域,还是处于函数作用域。严格模式下,eval语句本身就是一个作用域,不再能够生成全局变量了,它所生成的变量只能用于eval内部。
"use strict";
var x = 2;
console.info(eval("var x = 5; x")); // 5
console.info(x); // 2
- 禁止this关键字指向全局对象
- 禁止在函数内部遍历调用栈
- 禁止删除变量,只有configurable设置为true的对象属性,才能被删除
"use strict";
var x;
delete x; // 语法错误
var o = Object.create(null, {'x': {
value: 1,
configurable: true
}});
delete o.x; // 删除成功
- 对一个对象只读属性赋值报错
- 对一个getter方法读取的属性赋值报错
- 对禁止扩展的对象添加新属性报错
- 删除不可删除的属性报错
- 对象不能有重名属性
- 函数不能有重名参数
- 禁止八进制表示法 如
var n=0100;
- 不允许对arguments赋值;
- arguments不再追踪参数变化
function f(a) {
a = 2;
return [a, arguments[0]];
}
f(1); // 正常模式为[2,2]
function f(a) {
"use strict";
a = 2;
return [a, arguments[0]];
}
f(1); // 严格模式为[2,1]
- 禁止使用arguments.callee
- 函数必须声明在顶层
- 也就是说,不允许在非函数的代码块内声明函数
11. bind、call、apply区别
apply()方法调用一个函数,其具有一个指定this值,以及作为一个数组(或类似数组的对象)提供的参数
call()方法接受的是若干个参数列表,而apply接收的是一个包含多个参数的数组
bind()方法创建一个新的函数,然后传入this所绑定的值和参数
var a ={
name : "Cherry",
fn : function (a,b) {
console.log( a + b)
}
}
var b = a.fn;
b.apply(a,[1,2]) // 3
b.call(a,1,2) // 3
b.bind(a,1,2)() // 3
12. 创建对象的方法
直接赋值,new实例, 工厂函数
13. js基本数据类型
Undefined、Null、Boolean、Number、String、Symbol(ES6引入的表示独一无二的值)、BigInt
14. js引用数据类型
Array、Object、Function
15. 深拷贝的实现方案
- jQuery的extend方法
$.extend(true, {}, obj)
- lodash.cloneDeep()方法
- 递归