1. Map和Set的区别,Map和Object的区别
set:
是集合,不能有重复性,可用于数组去重,类似===符号比较,但是其中NaN与NaN相等
向 Set 加入值的时候,不会发生类型转换,所以5!=='5',
map:
是字典,有顺序性,分强弱,弱map/弱set不对obj进行引用,
JSON 直接支持 Object,但不支持 Map
写删频繁用map,效率高
2. 数组的filter、every、flat的作用是什么
重点: fn.call(context, arr[i], i, arr);
使用call函数时,this传`null` 或 `undefined` 时会自动替换为指向全局对象。
实践方案: 先把函数调用方式写一遍,按照方式定义入参,注意绑定this。
3. es6有哪些新特性
默认参数、模板字符串、结构赋值、箭头函数、promise、let const、class、module
使用babel编译es6
es5变量提升:
blog.csdn.net/m0_49016709… www.freesion.com/article/808…
var仅声明,function声明+定义,函数提升为了解决函数相互调用的问题
当代码执行遇到创建函数这部分代码后,直接的跳过即可
es6中 let a = 6 不再定义到window上,顶层变量与全局变量脱钩
- 带var的私有作用域变量提升阶段,都声明为私有变量,和外界没有任何关系。
- 不带var不是私有变量,会向它的上级作用域查找,看是否为上级的变量,不是继续向上查找,一直找到window为止(我们把这种查找机制叫做:作用域链),也就是我们在私有作用域中操作的这个非私有变量,一直是别人的变量。
<script type="text/javascript">
var a; //声明
a=10; //赋值
console.log(a); //输出10 调用;
function sum(){ //声明赋值
console.log(0)
}
sum(); //输出0 调用
</script>
const
`const`实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。但引用数据类型保存的仅仅是存储地址,所以引用数据类型可以添加/修改key、value
结构赋值
对象的解构赋值可以取到继承的属性
如果等号右边是数值和布尔值,则会先转为对象
由于`undefined`和`null`无法转为对象,所以对它们进行解构赋值,都会报错
//如果等号右边是数值和布尔值,则会先转为对象
let {toString: s} = 123;
s === Number.prototype.toString // true
let {toString: s} = true;
s === Boolean.prototype.toString // true
let { prop: x } = undefined; // TypeError
let { prop: y } = null; // TypeError
可以使用圆括号的情况只有一种:赋值语句的非模式部分,可以使用圆括号。
[(b)] = [3]; // 正确
({ p: (d) } = {}); // 正确
[(parseInt.prop)] = [3]; // 正确
上面三行语句都可以正确执行,因为首先它们都是赋值语句,而不是声明语句;其次它们的圆括号都不属于模式的一部分。
第一行语句中,模式是取数组的第一个成员,跟圆括号无关;
第二行语句中,模式是`p`,而不是`d`;
第三行语句与第一行语句的性质一致。
4.说一下对Promise的了解
5.Promise的all和race有什么区别
www.jianshu.com/p/360278dd3… race 一般用于和定时器绑定,比如将一个请求和一个三秒的定时器包装成Promise实例,加入到race队列中,请求三秒中还没有回应时,给用户一些提示或一些相应的操作。
6.箭头函数和普通函数的区别
this 永远指向其上下文的 this ,任何方法都改变不了其指向,如 call() , bind() , apply() ,可以说正是因为没有自己的this,才使其具备了以上介绍的大部分特点
箭头函数是匿名函数,不能作为构造函数,不可以使用new命令,否则会抛出一个错误。所以箭头函数也不具有new.target。
箭头函数没有原型属性prototype
不能简单返回对象字面量
不能使用yield关键字,因此箭头函数不能用作 Generator 函数。
箭头函数括号后面不能换行;
箭头函数不具有super。
-
普通函数
普通函数的this指向调用它的那个对象
6.箭头函数的ES5实现
// es6
const obj = {
getArrow() {
return () => {
console.log(this === obj);
};
}
}
// es5,由 Babel 转译
var obj = {
getArrow: function getArrow() {
var _this = this;
return function () {
console.log(_this === obj);
};
}
};
7、站和堆的区别
zhuanlan.zhihu.com/p/142681436…
栈(stack)会自动分配内存空间,会自动释放。堆(heap)动态分配的内存,大小不定也不会自动释放。
8、闭包的原理
9、instanceof的实现原理
function instance_of(L, R) {//L 表示左表达式,R 表示右表达式
var O = R.prototype;
L = L.__proto__;
while (true) {
if (L === null)
return false;
if (O === L) // 这里重点:当 O 严格等于 L 时,返回 true
return true;
L = L.__proto__;
}
}
10、new的实现原理
如果构造函数中返回了一个对象,则在实例中只能访问到返回的对象中的属性。
11、数据类型有哪些?如何判断一个数据是否是数组
Array.isArray([]) // true
[] instanceof Array // true
Object.prototype.toString.call([]) === '[object Array]' // true
//因为toString为Object的原型方法,而Array 、Function等类型作为Object的实例,都重写了toString方法,所以要用prototype上的
typeof arr === 'object' && isFinite(arr.length) // length是个有限数
12、JQuery实现链式调用的原理是什么
每个方法都return this
13、分别介绍一下原型、原型链、作用域和作用域链的含义和使用场景
Object.prototype.__proto__ = null;
这个机制也说明了访问局部变量要比访问全局变量更快,因为中间的查找过程更短,但js优化好,可以忽略不计
css
css和js两种方式实现div右移1000px动画
blog.csdn.net/weixin_3916… css使用animation和keyframes js 使用div.style.left 和 div.offsetLeft
visibility、display、opacity的区别
blog.csdn.net/liujiango/a… visiblity 会触发重绘,会继承,子元素可visible展示 opacity 是合成层,不会触发重绘,会继承,子元素不可展示
单行截断css
// 只能单行,兼容性好
div {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
// 多行,兼容性不好,只有webkit内核支持,Firefox, IE不支持,兼容性不好
div {
display: -webkit-box;
overflow: hidden;
-webkit-line-clamp: 2;//最多2行,2行装不下就用...省略
-webkit-box-orient: vertical;
}
使用after伪元素遮盖
flex布局
设为 Flex 布局以后,子元素的float、clear和vertical-align
flex-direction: row | row-reverse | column | column-reverse;
flex-wrap: nowrap | wrap | wrap-reverse;
justify-content: flex-start | flex-end | center | space-between | space-around;
align-items: auto | flex-start | flex-end | center | baseline | stretch;
order: 权重,用来判断位置
flex-grow
flex-shrink
flex-basis: 属性定义了在分配多余空间之前,项目占据的主轴空间
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ] 默认0 1 auto
align-self
flex:1的意义
developer.mozilla.org/zh-CN/docs/… mdn --- flex: 1 0;
transition、transform、translate的区别
transition 动画: property duration timing-function delay;
transform: 属性向元素应用 2D 或 3D 转换。该属性允许我们对元素进行旋转、缩放、移动或倾斜。
translate 位置偏移
说一下BFC
blog.csdn.net/DFF1993/art… 具有BFC特性的元素可以看做是隔离了的独立容器,容器里面的元素不会在布局上影响到外面的元素 可以解决margin塌陷的问题 还可以实现两列布局,左侧固定,右侧自适应
元素有:
body 根元素
浮动元素:float 除 none 以外的值
绝对定位元素:position (absolute、fixed)
display 为 inline-block、table-cells、flex
overflow 除了 visible 以外的值 (hidden、auto、scroll)