面试题

148 阅读6分钟
1. Map和Set的区别,Map和Object的区别

blog.csdn.net/muzidigbig/…

set:
是集合,不能有重复性,可用于数组去重,类似===符号比较,但是其中NaN与NaN相等
向 Set 加入值的时候,不会发生类型转换,所以5!=='5',

map:
是字典,有顺序性,分强弱,弱map/弱set不对obj进行引用,
JSON 直接支持 Object,但不支持 Map
写删频繁用map,效率高
2. 数组的filter、every、flat的作用是什么

blog.csdn.net/lin_fightin…

重点: fn.call(context, arr[i], i, arr);
      使用call函数时,this传`null` 或 `undefined` 时会自动替换为指向全局对象。
      
实践方案: 先把函数调用方式写一遍,按照方式定义入参,注意绑定this
3. es6有哪些新特性

es6.ruanyifeng.com/

默认参数、模板字符串、结构赋值、箭头函数、promise、let constclassmodule

使用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的了解

segmentfault.com/a/119000002…

5.Promise的all和race有什么区别

www.jianshu.com/p/360278dd3… race 一般用于和定时器绑定,比如将一个请求和一个三秒的定时器包装成Promise实例,加入到race队列中,请求三秒中还没有回应时,给用户一些提示或一些相应的操作。

6.箭头函数和普通函数的区别

segmentfault.com/a/119000002…

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、闭包的原理

segmentfault.com/a/119000003…

9、instanceof的实现原理

www.cnblogs.com/yalong/p/10…

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的实现原理

www.cnblogs.com/renzhiwei20…

如果构造函数中返回了一个对象,则在实例中只能访问到返回的对象中的属性。

11、数据类型有哪些?如何判断一个数据是否是数组

blog.csdn.net/miao_yf/art…

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 布局以后,子元素的floatclearvertical-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 根元素
浮动元素:floatnone 以外的值
绝对定位元素:position (absolute、fixed)
display 为 inline-block、table-cells、flex
overflow 除了 visible 以外的值 (hidden、auto、scroll)