JavaScript 历史
既然要学 JavaScript 的话,那就必然要先来了解一下它的历史,这玩意儿是怎么来的。
1995年,JavaScript 在网景公司问世,问世之后就爆火了;
1996年,微软自己也搞了一版出来,两个版本打起来了;
1997年,终于他们找到了 ECMA(一个专业做标准的联盟),打造出ECMA-262标准,基于此标准实现了ECMAScript;
然后ECMAScript就开始各种版本的迭代了。。。
但是吧,JavaScript 不完全是 ECMAScript ,相比 JavaScript 还包含了 DOM 和 BOM.
高频
Javascript 数据类型与检测
JS 一共有8种数据类型,其中ES6种就有的有6种,新增了两种,
ES6有的:数字(Number)、字符串、布尔(true/false)、对象、undefined、null
新增的:bigint、symbol
在自己目前的学习过程中,好像都没有用到新增的这两个,js 的数据类型这题应该是非常非常基础的题目了,虽然简单但感觉也易错,例如一些初学者可能还会回答「 数组、函数、日期 」,但这些不是数据类型,是类,千万不能混淆了呀!!!
undefined 与 null 有哪些区别
null:表示没有对象,即此处不应该有值;
undefined:表示缺少值,即此处应该有值,但是还没有定义
关于这个问题,阮大大的文章解释得挺好,涉及到JavaScript的历史:www.ruanyifeng.com/blog/2014/0…
为什么需要bigint
bigint 可以表示超过 Number 范围的数,例如可以用来表示高精度的时间戳
JavaScript 判断类型的方式
第一种:typeof( )
判断原理:type 是根据各个类型机器码的前 3 位进行判断的,对象的前 3 位是 000,而 null 的所以机器码都是 0 所以 null 被判断出来为对象(那为啥,不是对象被判断为null呢?)
判断范围:可以判断除 null 外的其他数据类型,除了数据类型,typeof 还能判断 function,这个自己在控制台上操作一波就记住了~
第二种:instanceof
判断范围:一般用来判断引用数据类型,判断一个实例是否属于某种类型,
【case】A instanceof B,判断A是否为B的实例对象,从而判断A是否为B类型
第三种:constructor
第四种:Object.prototype.toString.call()
可以判断所有的数据类型,也是最准的一种,涵盖最全的
(目前来讲,我只用到 typeof 这个方式,后续有用到其他的再慢慢补充内容)
闭包
闭包就是能够读取其他函数内部变量的函数,例如函数 A 里面包含了函数 B,而函数 B 里面使用函数 A 的变量,那么函数B 被称为闭包。
- 优点是:可以读取函数内部的变量,让这些变量始终保持在内存中,实现封装和缓存
- 缺点是:闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露,影响网页性能
文章推荐:zhuanlan.zhihu.com/p/22486908
原型和原型链
原型和原型链的概念
原型: 在 ES6 之前,JS 没有类和继承的概念,JS 是通过原型来实现继承的,每个对象都会在其内部初始化一个属性,就是prototype(原型)。
**原型链:**当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么他就会去 prototype 里找这个属性,这个prototype又会有自己的 prototype,于是就这样一直找下去,这个就是原型链
原型链的优缺点
优点:在没有class的情况下实现继承
缺点:原型链唯一的缺点就是不支持私有属性,解决此缺点就是用 class ,只是 class 是 ES6 引入的,不支持 IE 浏览器
文章推荐:www.zhihu.com/question/56…
作用域和作用域链
作用域
作用域是可访问变量的集合,作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突
作用域链
一般情况下,变量取值到创建这个变量的函数的作用域中取值。 但是如果在当前作用域中没有查到值,就会向上级作用域去查,直到查到全局作用域,这么一个查找过程形成的链条就叫做作用域链。
JavaScript 如何实现继承(0)
继承(含es6)、多种继承方式 创建两个class,然后 class A extents B 实例化与继承概念区分
原生 ajax 过程(0)
ajax中get和post请求的区别 ajax的状态码
数组操作(0)
数组去重的方法
如何解决回调地狱(0)
this 指向 (0)
this 是 call 的第一个参数,this 会根据所处的环境自动转换(window、) 执行上下文
call bind apply 的区别(0)
- call于apply的区别在于传参,前者直接传参,后者传一个数组
- bind传参后不立即执行,而是会返回一个函数,这个函数可以继续传参,且执行(bind函数可以分两次传参)
bind返回的函数能作为构造函数吗? 不能哦,会报错的
文章推荐:www.zhihu.com/search?type…
new 关键字(0)
创建新对象, new 做了 4 件事情,学习 new 之前一定要先理解原型链与 this 。 文章推荐:zhuanlan.zhihu.com/p/23987456
JS中同步和异步,以及js的事件流(0)
JS中常见的异步任务 这部分着重要理解 Promise、async awiat、event loop 等 event loop、宏任务和微任务 async/await 和 Promise 的关系 Promise、Promise.all、Promise.race 分别怎么用? async/await 怎么用,如何捕获异常?
事件如何先捕获后冒泡(0)
事件冒泡、捕获(委托)
赋值、深拷贝与浅拷贝的区别(0)
JS 中常见的设计模式(0)
es6的新特性(0)
ES 6 语法知道哪些,分别怎么用?
js 发展趋势(0)
其他
js 的立即执行函数
是什么:声明一个函数立即执行 怎么做:只要通过语法检查即可 作用:在 ES6 之前,使用其创建局部作用域,ES6 之后用 let
setTimeout 和 setInterval 的区别
setTimeout( ) 定义: setTimeout()方法用于在指定毫秒数后再调用函数或者计算表达式(以毫秒为单位),setTimeout() 只执行函数一次 语法: setTimeout(code,millisec) code:必需,要调用的函数后要执行的 JavaScript 代码串; millisec:必需,在执行代码前需等待的毫秒数。
setInterval( ) 定义: setInterval() 方法用于按照指定的周期(以毫秒计)来循环调用函数或计算表达式,直到 clearInterval() 被调用或窗口关闭,由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。 语法: setInterval(code,millisec[,"lang"]) code:必需,要调用的函数或要执行的JavaScript 代码串; millisec:必须,周期性执行或调用 code 之间的时间间隔,以毫秒计。
其他知识点
什么是语法糖 ’use strict‘ 的作用是什么 如何用正则实现 trim()? JS 的组件化和模块化 组件化 组件化开发的优缺点 组件化开发的原则 模块化 模块化的几种方法 模块化的优缺点 浏览器的垃圾回收机制 实现一个 EventMitter 类(EventMitter 就是发布订阅模式的典型应用) 组件化和模块化 JS有哪些内置对象 JS引用方法 使元素消失的方法 根据 0.1+0.2 ! == 0.3,讲讲 IEEE 754 ,如何让其相等 ==和===区别是什么 js中跨域方法 前端有哪些页面优化方法 图片的预加载和懒加载 mouseover和mouseenter的区别 DOM diff原理 map和forEach的区别 前端事件流 如何判断一个变量是对象还是数组(prototype.toString.call()) setTimeout 和 setInterval的机制 splice和slice、map和forEach、 filter()、reduce()的区别 JS的几条基本规范 变量提升