JS 历史
既然要学 JavaScript 的话,那就必然要先来了解一下它的历史,这玩意儿是怎么来的。
1995年,JavaScript 在网景公司问世,问世之后就爆火了;
1996年,微软自己也搞了一版出来,两个版本打起来了;
1997年,终于他们找到了 ECMA(一个专业做标准的联盟),打造出ECMA-262标准,基于此标准实现了ECMAScript;
然后ECMAScript就开始各种版本的迭代了。。。
但是吧,JavaScript 不完全是 ECMAScript ,相比 JavaScript 还包含了 DOM 和 BOM.
关于 JS 数据类型
这道题基础,但感觉可以延伸的点挺多的。
JS 有哪些数据类型
JS 一共有8种数据类型,其中ES6种就有的有6种,新增了两种,
ES6有的:数字(Number)、字符串、布尔(true/false)、对象、undefined、null
新增的:bigint、symnol
在自己目前的学习过程中,好像都没有用到新增的这两个,js 的数据类型这题应该是非常非常基础的题目了,虽然简单但感觉也易错,例如一些初学者可能还会回答「 数组、函数、日期 」,但这些不是数据类型,是类,千万不能混淆了呀!!!
undefined 与 null 有哪些区别
null:表示没有对象,即此处不应该有值;
undefined:表示缺少值,即此处应该有值,但是还没有定义
关于这个问题,阮大大的文章解释得挺好,涉及到JavaScript的历史:https://www.ruanyifeng.com/blog/2014/03/undefined-vs-null.html
为什么需要bigint
bigint 可以表示超过 Number 范围的数,例如可以用来表示高精度的时间戳
什么是浮点数
JavaScript 中所有的数字,无论是整数还是小数都只有一种类型 Number,在程序内部 Number类型实质是一个 64 位固定长度的浮点数,也就是标准的 double 双精度浮点数。
推荐文章:https://segmentfault.com/a/1190000020333292
JavaScript 判断类型的方式及原理是什么?
第一种:typeof()
判断范围:可以判断除 null 外的其他数据类型,除了数据类型,typeof 还能判断 function,这个自己在控制台上操作一波就记住了~
判断原理:type 是根据各个类型机器码的前 3 位进行判断的,对象的前 3 位是 000,而 null 的所以机器码都是 0 所以 null 被判断出来为对象(那为啥,不是对象被判断为null呢?)
第二种:instanceof
判断范围:一般用来判断引用数据类型,判断一个实例是否属于某种类型,
【case】A instanceof B,判断A是否为B的实例对象,从而判断A是否为B类型
第三种:constructor
第四种:Object.prototype.toString.call()
可以判断所有的数据类型,也是最准的一种,涵盖最全的
(目前来讲,我只用到 typeof 这个方式,后续有用到其他的再慢慢补充内容)
讲一下 JS 原型与原型链
什么是原型
什么是原型链
对象只有一层模型?
- 原型链:原型链是一条对象隐式原型不断往上指向的一条指向链,尽头是Object的隐式原型,也就是null
- 作用:构造函数原型上的东西可以让实例们共享,从而节省了空间
如何创建一个原型链
如何改变(3种?),如何判断
原型链解决什么问题
在没有class的情况下实现继承
原型链的优缺点
优点:
缺点:原型链唯一的缺点就是不支持私有属性
如何解决原型链的缺点
那就用 class 呗~只是 class 是 ES6 引入的,不支持 IE 浏览器
文章推荐:https://www.zhihu.com/question/56770432/answer/315342130
扩展1: 什么是私有属性
扩展2: 继承与原型链的区别
只学原型链的话感觉其实原型链和继承好像也差不多?但后面学继承的话就是可以用原型链实现继承。
扩展3: ES6 有了 class 还要原型链吗
实际上我理解,在 ES6 推出class之前,就是用的原型链在 js 里实现继承,原型链更像是一种设计模式?
js 如何实现类
有两种实现方法
方法1: 使用原型
方法2:使用class
(class没有提供在原型上添加非函数属性的方法)
代码中的 this 是什么
this 是什么
this 是 call 的第一个参数,this 会根据所处的环境自动转换(window、)
扩展1: 什么是语法糖
扩展2: ’use strict‘ 的作用是什么
扩展3: 什么是 call
扩展4: call 与 apply 的区别
8、call、apply、bind的区别?
- call于apply的区别在于传参,前者直接传参,后者传一个数组
- bind传参后不立即执行,而是会返回一个函数,这个函数可以继续传参,且执行(bind函数可以分两次传参)
bind返回的函数能作为构造函数吗?
不能哦,会报错的
文章推荐:https://www.zhihu.com/search?type=content&q=this%E7%9A%84%E5%80%BC%E5%88%B0%E5%BA%95%E6%98%AF%E4%BB%80%E4%B9%88
js 的 new 做了什么事情
创建新对象, new 做了 4 件事情,学习 new 之前一定要先理解原型链与 this 。
扩展1: JS 中的设计模式?
文章推荐:https://zhuanlan.zhihu.com/p/23987456
js 的立即执行函数
是什么
声明一个函数立即执行
怎么做
只要通过语法检查即可
作用
在 ES6 之前,使用其创建局部作用域,ES6 之后用 let
什么是闭包
2、闭包是什么?有什么优缺点
闭包是一个能让函数外部访问到函数内部的一个函数
- 优点是:延长函数内部变量的寿命,使函数外部能访问到函数内部
- 缺点是:滥用闭包导致内存溢出,页面卡顿
文章推荐:https://zhuanlan.zhihu.com/p/22486908
扩渣1: 浏览器垃圾回收原理
js 如何实现继承
创建两个class,然后 class A extents B
实例化与继承概念区分
ES 6 语法知道哪些,分别怎么用?
Promise、Promise.all、Promise.race 分别怎么用?
什么是 JSONP,什么是 CORS,什么是跨域?
async/await 怎么用,如何捕获异常?
如何用正则实现 trim()?
JS 的作用域和作用域链
JS 的组件化和模块化
组件化
组件化开发的优缺点
组件化开发的原则
模块化
模块化的几种方法
模块化的优缺点
js 发展趋势
赋值、深拷贝与浅拷贝有什么不同?
未完待续,更新中。。。