1. 基本数据类型
基本数据类型有6种,分别是Number,String,Undefined,Null,Boolean,Symbol(ES6),还有Bingint(ES10)
基本数据类型存放在栈内存中,复杂数据类型的值存放在堆内存,复杂数据类型的引用存放在栈内存,对象的赋值操作是将地址赋值给新的引用,指向同一片内存区域.
2. 判断一个值的类型
- typeof可以正确判断基本数据类型,但不能判断复杂数据类型. 但typeof null除外,他返回object但是null是基本数据类型,
- instanceof可以判断复杂数据类型,但不能判断基本数据类型.
- typeof 函数 返回function,除此之外,typeof 对象返回的都是object,所以可以先用typeof判断是否为基本数据类型,如果是复杂数据类型那么再用instanceof来判断复杂数据类型.
3.判断一个元素是否为数组
isArray()
,返回true代表是数组,false不是数组instanceof Array
返回true代表是数组,false不是数组obj.constructor === Array
返回true代表为数组,false代表不是数组.
function fn() {
let a = [1, 2, 3, 4];
let args = arguments;
console.log(Array.isArray(a));
console.log(Array.isArray(args));
console.log(a instanceof Array);
console.log(args instanceof Array);
console.log(a.constructor === Array);
console.log(args.constructor === Array);
}
fn(1, 2, 3, 4)
4.类数组和数组
- 类数组具有length属性
- 类数组没有数组的方法
Array.prototype.slice.call(arraylike,start)
,[...arraylike]
,Array.from(arraylike)
三个方法可以把类数组转化为真正的数组...扩展运算符
可以把数组或者类数组转换为逗号分割的参数序列
5.=== 和 ==
- === : 等同符 只有类型/数值 均相等才返回true,否则返回false
- == : 等值符 类型相同时,直接比较值
类型不同时,转换类型后在进行比较,转换规则如下:- NaN和任何值都不相同(包括自己)
- 有undefined和null时,他们之和自己以及对方相等,和其他的都不相等
- 当有Boolean/string/number时,会转化成数字进行比较
- 一方是对象,一方是Boolean/string/number时,object转换成基本类型在判断.
[] == ![]
的返回值?
- !的优先级高,所以先计算 ![],引用数据类型转换为布尔都是
true
,所以![]
为false
- 一方为对象要转换为基本类型,
[]
转换为0,有一个数字的数组会转换为那个数字,多个数字是NaN - 布尔值会转换为数字计算,所以false变成0
- 最后是
0 == 0
返回true
6.ES6中的class和ES5的类有什么区别?(复习js的继承和构造函数)
- ES6 class 内部所有定义的方法都是不可枚举的;
- ES6 class 必须使用 new 调用;
- ES6 class 不存在变量提升;
- ES6 class 默认即是严格模式;
- ES6 class 子类必须在构造函数中调用super(),这样才有this对象;ES5中类继承的关系是相反的,先有子类的this,然后用父类的方法应用在this上。
7. 改变数组的api
splice/sort/splice/reverse/fill/push/pop/shift/unshift
- 不改变的:
foreach/map/filter/slice/every/reduce/find/entries
8. JS执行上下文和作用域链
执行上下文就是js解析和执行的环境.执行上下文栈是存储函数调用的栈结构.
- js执行在单线程上,所有代码排队执行.
- 一进入浏览器就会创建全局上下文,并压入栈底.
- 每执行一个函数,就会创建一个函数的上下文并压入栈顶,当函数执行完成后,就会出栈,等待垃圾回收并销毁.
- js的执行引擎总是会在栈顶的执行上下文.
- 全局上下文只有唯一的一个,在退出浏览器时销毁.
作用域链:会从当前作用域开始查找,如果没找到,就会向上级作用域查找,直到全局作用域.
9. 什么是闭包? 闭包的作用?
闭包就是指在一个函数访问另一个函数的变量.闭包最常见的方法就是一个函数里创建另一个函数.
闭包的作用:
- 封装私有变量
- 模拟块级作用域
- 实现js的模块化
10. new 发生了什么
- 创建了一个新对象
- 设置新对象的原型链,
obj.__proto__ = constructor.prototype
- 调用构造函数,
func.call(obj,...args)
- 如果构造函数没有返回值,则将新对象返回
11.ES6新特性
- 块级作用域 let/const
- 箭头函数
- 引入了基本数据类型symbol
- 对象解构
- 数组的新方法
- 增加了模块化 import/export
- 提供了set/map等数据结构
- 增加了Proxy构造函数,可以创建Proxy对象
- 提供了类的语法糖(class)
- 提供了扩展运算符
- 提供了生成器(Generator)和迭代器(iteator)
12.跨域
跨域指的就是违背了浏览器的同源策略
同源:协议/端口/域名必须完全一样
跨域的限制
- 不能读取非同源页面的cookies/localstorage
- 不能操作非同源页面的dom
- 不能跨域发送ajax请求
跨域解决方法
- 设置两个页面为相同的域名解决cookies无法访问的问题
- 通过jsonp解决ajax问题
- 通过后端设置允许跨域解决ajax跨域
- 通过nginx代理,向同源的nginx发送请求,nginx进行代理转发解决跨域问题
13.从地址栏输入url到显示页面的步骤
- 浏览器根据url找到DNS进行解析,从DNS找到服务器的IP,然后向服务器发送请求.
- 服务器对请求进行解析,将页面返回给浏览器.
- 浏览器对资源进行解析,建立html(DOM),css,js
- 对资源进行解析的时候,分为dom树和(render)渲染树,当解析时,遇到html就会形成一个个dom,但是遇到js就会阻塞dom树,因为js可能会修改dom,而css的加载不会阻塞dom树,当dom树和css规则树都加载完成后,就会合并成为render树,渲染成最终的页面
- 将资源进行加载,渲染页面.
- dom的操作非常消耗性能,所以频繁的操作dom可能造成页面的卡顿.
14.判断某个对象是不是某个类型的方法
一个对象是不是某个类型的本质就是这个对象有没有某个类型的属性和方法,如果有就是这个类型的对象.比如有了Persion
的属性和方法,就是Person
的对象,在JS中,类的属性和方法都在原型对象上Persion.probotype
,所以一个对象如果能找到Person.probotype
就有了Person
的属性和方法,那就是Person
的对象,而一个对象是通过__proto__
属性去找原型的,所以obj.__proto__ === Person.probotype
这个对象就有了Person
的属性和方法,就是Person
的对象.
而instanceof
就是通过找原型链来判断能不能找到Person.prototype
找到了就有了Person
的属性和方法就是person
对象,返回true
,否则返回false
面试笔记
金山云一面
- 双向绑定
- diff算法
- 服务端渲染ssr
- url
- 三次握手 四次挥手
- vue2 vue3 react
- localstorage
- 304 302 301 用在哪
- 浏览器缓存
- 页面跳转
- 事件循环
- 页面传输数据
- 学习vue3 react
爱奇艺一面
- flex布局 flex容器和元素的属性 包括order
- vuex的作用,什么时候用到
- 用过混入么,怎么使用
- 混入中钩子的执行顺序 data和methods的合并 谁的destory先调用
- nexttick
- 直接修改数组会相应式更新么 可能通过什么方法直接更改数组下标
- 事件循环 宏任务队列 微任务队列 js为什么是单线程的(因为js的主要功能是修改dom,多个线程同时修改dom会造成显示错乱,需要加各种锁)
- nginx如何配置的 git如何使用的
- 深浅拷贝 浅拷贝直接赋值和object.assign()的区别 (assign只能拷贝一层,内层还是浅拷贝)
- vue首屏加载缓慢的问题
2021-4-1 爱奇艺二面
- 介绍https 协议 (没看过不会)
- Tcp/IP协议 三次握手/四次挥手
- 从url到页面发生的过程
- 网页性能问题 首屏加载缓慢(主要) 页面加载缓慢(次要) 以及解决方案
- linux的常用命令