阿里菜鸟网络前端实习二面
上来先按流程自我介绍,学了多久,怎么学的,看过哪些书等
然后开始问技术点,原型链的了解
当我们访问对象的一个属性或方法时,它会先在对象自身中寻找,如果有则直接使用,如果没有则会去原型对象中寻找,如果找到则直接使用。如果没有则去原型的原型中寻找,直到找到Object对象的原型,Object对象的原型没有原型,如果在Object原型中依然没有找到,则返回undefined。
css各种定位,每种定位相对于哪,每种定位的特点,flex布局的意义,再详细介绍。
CSS中的定位使用来布局的熟练应用对页面美化有很好的帮助,下面就进行详细介绍:定位分为静态定位,相对定位,绝对定位,固定定位这四种,定位有不同的参数,例如:left、right、top、bottom、z-index等。
- 静态定位(static)
一般的标签元素不加任何定位属性都属于静态定位,在页面的最底层属于标准流。
- 绝对定位(absolute)
绝对定位的元素从文档流中拖出,使用left、right、top、bottom等属性相对于其最接近的一个最有定位设置的父级元素进行绝对定位,如果元素的父级没有设置定位属性,则依据 body 元素左上角作为参考进行定位。绝对定位元素可层叠,层叠顺序可通过 z-index 属性控制,z-index值为无单位的整数,大的在上面,可以有负值。
绝对定位的定位方法:如果它的父元素设置了除static之外的定位,比如position:relative或position:absolute及position:fixed,那么它就会相对于它的父元素来定位,位置通过left , top ,right ,bottom属性来规定,如果它的父元素没有设置定位,那么就得看它父元素的父元素是否有设置定位,如果还是没有就继续向更高层的祖先元素类推,总之它的定位就是相对于设置了除static定位之外的定位的第一个祖先元素,如果所有的祖先元素都没有以上三种定位中的其中一种定位,那么它就会相对于文档body来定位(并非相对于浏览器窗口,相对于窗口定位的是fixed)。
- 相对定位(relative)
相对定位元素不可层叠,依据left、right、top、bottom等属性在正常文档流中偏移自身位置。同样可以用z-index分层设计。
- 固定定位(fixed)
固定定位与绝对定位类似,但它是相对于浏览器窗口定位,并且不会随着滚动条进行滚动。
固定定位的最常见的一种用途是在页面中创建一个固定头部、固定脚部或者固定侧边栏,不需使用margin、border、padding。
- 绝对定位vs相对定位
绝对定位好像把不同元素安排到了一栋楼的不同楼层(除首层,文本流放在首层),它们之间互不影响;相对定位元素在首层,与文本流一起存放,它们之间互相影响。
被设置了绝对定位的元素,在文档流中是不占据空间的,如果某元素设置了绝对定位,那么它在文档流中的位置会被删除,它浮了起来,其实设置了相对定位也会让元素浮起来,但它们的不同点在于,相对定位不会删除它本身在文档流中占据的空间,其他元素不可以占据该空间,而绝对定位则会删除掉该元素在文档流中的位置,使其完全从文档流中抽了出来,其他元素可以占据其空间,可以通过z-index来设置它们的堆叠顺序 。
之后问ES6相关,新增属性
- 声明变量
let/const
let:用来声明变量,类似于var,但是使用let有以下特性:
- 不存在变量提升
- 暂时性死区
- 不允许重复声明,同一作用域内只能声明一次
- 新增的块级作用域
const:
用来声明常量,使用规则除了声明之后不能被修改,其他特性和let一样,本质上是const是内存地址不得改动,而不是变量的值不能改动
- 字符串扩展
- codePointAt()
- fromCodePoint()
- repeat()
- indexof()补充includes() startswith() endswith()
includes():返回布尔值,表示是否找到了参数字符串。
startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。
endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部。
3.字符串的正则方法
-
字符串对象共有 4 个方法,可以使用正则表达式:match()、replace()、search()和split()。
-
ES6 对正则表达式添加了u修饰符,含义为“Unicode 模式”,用来正确处理大于\uFFFF的 Unicode 字符。也就是说,会正确处理四个字节的 UTF-16 编码。
-
点字符
点(.)字符在正则表达式中,含义是除了换行符以外的任意单个字符。对于码点大于0xFFFF的 Unicode 字符,点字符不能识别,必须加上u修饰符。
- Unicode 字符表示法
ES6 新增了使用大括号表示 Unicode 字符,这种表示法在正则表达式中必须加上u修饰符,才能识别当中的大括号,否则会被解读为量词。
- 量词
使用u修饰符后,所有量词都会正确识别码点大于0xFFFF的 Unicode 字符。
- 解构赋值
- 基本用法
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。
- 默认值
解构赋值允许指定默认值。注意,ES6 内部使用严格相等运算符(===),判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined,默认值才会生效。
-
对象的解构赋值
-
字符串也可以解构赋值。这是因为此时,字符串被转换成了一个类似数组的对象。
-
数值和布尔值的解构赋值
解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错。
- ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。
它是 JavaScript 语言的第七种数据类型,前六种是:undefined、null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。Symbol 值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。
注意,Symbol函数前不能使用new命令,否则会报错。这是因为生成的 Symbol 是一个原始类型的值,不是对象。也就是说,由于 Symbol 值不是对象,所以不能添加属性。基本上,它是一种类似于字符串的数据类型。
Promise (Promise真的问的太深,虽然差不多能写出源码但是口述说的还是迷迷糊糊)
Generator原理,优缺点
然后网络安全,详细介绍cookie,比较cookie sessionStorage localStorage 区别,怎么保护cookie不被泄露。
之后介绍token,具体原理,怎么应用。
Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
详细介绍XSS,CSRF,怎么防范,它们之间的区别,回答了前后端过滤,加密等方法,但是面试官深问怎么加密,如何过滤,具体方法,没答出来。
跨站脚本攻击(XSS),是最普遍的Web应用安全漏洞。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。
CSRF(Cross-site request forgery),也被称为:one click attack/session riding,中文名称:跨站请求伪造,缩写为:CSRF/XSRF。
一般来说,攻击者通过伪造用户的浏览器的请求,向访问一个用户自己曾经认证访问过的网站发送出去,使目标网站接收并误以为是用户的真实操作而去执行命令。常用于盗取账号、转账、发送虚假消息等。攻击者利用网站对请求的验证漏洞而实现这样的攻击行为,网站能够确认请求来源于用户的浏览器,却不能验证请求是否源于用户的真实意愿下的操作行为。
防御XSS
- 对输入(和URL参数)进行过滤,对输出进行编码。
- 对cookie设置HttpOnly 属性
防御CSRF攻击
目前防御 CSRF 攻击主要有三种策略:
-
验证 HTTP Referer 字段;
-
在请求地址中添加 token 并验证;
-
在 HTTP 头中自定义属性并验证。
解决跨域有哪些方法,他们的原理,怎么实现cookie跨域,设置代理的原理,代理为何能实现跨域,具体属性等(到这就感觉自己已经凉凉了)。
之后转到Vue,Vue3相比于Vue2做了哪些改变,你所说的废弃了那些不常用的api具体是哪些,怎么定义“不常用”
- vue3新特性
-
数据响应重新实现(ES6的proxy代替Es5的Object.defineProperty)
-
源码使用ts重写,更好的类型推导
-
虚拟DOM新算法(更快,更小)
-
提供了composition api,为更好的逻辑复用与代码组织
-
自定义渲染器(app、小程序、游戏开发)
-
Fragment,模板可以有多个根元素
Vue中的通信方式,传参方式,传参的底层原理
- props
- $emit
- $attrs & $listeners
- provide & inject
- vuex
- eventBus
- $refs
- slot-scope & v-slot
- scopedSlots
- $parent & $children & $root