js基础知识汇总
2022-06-06 14:03:06 0 举报
AI智能生成
前端
作者其他创作
大纲/内容
ES6
let、const、var的区别
块级作用域:块作用域由 { }包括,let和const具有块级作用域,var不存在块级作用域。块级作用域解决了ES5中的两个问题:
内层变量可能覆盖外层变量
用来计数的循环变量泄露为全局变量
内层变量可能覆盖外层变量
用来计数的循环变量泄露为全局变量
变量提升:var存在变量提升,let和const不存在变量提升,即在变量只能在声明之后使用,否在会报错。
给全局添加属性:浏览器的全局对象是window,Node的全局对象是global。var声明的变量为全局变量,并且会将该变量添加为全局对象的属性,但是let和const不会。
重复声明:var声明变量时,可以重复声明变量,后声明的同名变量会覆盖之前声明的遍历。const和let不允许重复声明变量。
暂时性死区:在使用let、const命令声明变量之前,该变量都是不可用的。这在语法上,称为暂时性死区。使用var声明的变量不存在暂时性死区。
初始值设置:在变量声明时,var 和 let 可以不用设置初始值。而const声明变量必须设置初始值。
指针指向:let和const都是ES6新增的用于创建变量的语法。 let创建的变量是可以更改指针指向(可以重新赋值)。但const声明的变量是不允许改变指针的指向。
const对象的属性可以修改吗
如果new一个箭头函数会怎么样
箭头函数与普通函数的区别
1.简洁。可以介绍没有参数或者返回值只有一个之类的省略情况
2.不会创建自己的this,只会在自己作用域的上一层继承this,所以箭头函数this不能改变,包括call,bind,apply
3.不能作为构造函数使用,
4.没有自己的arguments,在箭头函数中访问arguments实际上是获取了它外层函数的arguments值,可以用...arg
5.,没有prototype
6.不能用作Generator函数,不能使用yeild关键字
箭头函数的this指向哪里
babel转化
扩展运算符的作用及使用场景
对象扩展运算符
数组扩展运算符
转化参数序列,复制数组,合并数组,与解构赋值结合,字符串转数组
Proxy可以实现什么功能
在 Vue3.0 中通过 Proxy 来替换原本的 Object.defineProperty 来实现数据响应式。
对对象与数组的解构的理解
数组
对象
如何提取高度嵌套的对象里指定的属性
逐级解构
ES6中模板语法与字符串的处理
模板字符串
存在性判定
自动重复:
原型
对原型、原型链的理解
原型修改与重写
原型链指向
原型链的终点是什么|如何打印出原型链的终点
如何获得对象非原型链上的属性
异步编程
异步编程的实现方式
回调函数
Promise
generator
asunc函数
setTimeout、Promise、Async/Await的区别
对Promise的理解
Promise的基本用法
Promise解决了什么问题
Promise.all和Promise.race的区别和使用场景
对async/await的理解
await到底在等啥
async/await优势
async/await对比Promise的优势
async/await如何捕获异常
并发与并行的区别
什么是回调函数?回调函数有什么缺点?如何解决回调地狱
setTimeout、setInterval、requestAnimationFrame各有什么特点
执行上下文、作用域链、闭包
对闭包的理解
理解定义
常用用途
使用场景
函数节流
优缺点
① 减少全局变量;
② 减少传递函数的参数量;
③ 封装;
② 减少传递函数的参数量;
③ 封装;
使用闭包会占有内存资源,过多的使用闭包会导致内存溢出等
对作用域、作用域链的理解
全局作用域和函数作用域
全局作用域
函数作用域
块级作用域
作用域链
对执行上下文的理解
1. 执行上下文类型
(1)全局执行上下文
(2)函数执行上下文
(3)eval函数执行上下文(不重要)
2. 执行上下文栈
3. 创建执行上下文
创建阶段
this。绑定
创建词法环境组件
创建变量环境组件
执行阶段
垃圾回收与内存泄漏
浏览器的垃圾回收机制
概念
回收机制
回收方式
标记清除
引用计数
减少垃圾回收
数组
对象
函数
有哪些情况会导致内存泄漏
意外的全局变量
计时器或回调函数
脱离DOM的引用
闭包
this/call/apply/bind
对this对象的理解
函数调用模式
方法调用模式
构造器调用模式
apply 、 call 和 bind 调用模式
call()和apply()的区别
call和apply哪个性能更好?
实现call、bind及apply函数
call
apply
bind
面向对象
对象创建的方式有哪些
工厂模式
构造函数模式
原型模式
组合使用构造函数模式和原型模式
动态原型模式
寄生构造函数模式
对象继承的方式有哪些
原型链
构造函数
组合继承
原型式继承
寄生式继承
寄生式组合继承
javaScript基础
new操作符实现原理
首先创建了一个新的空对象
设置原型,将对象的原型设置为函数的 prototype 对象
让函数的 this 指向这个对象,执行构造函数的代码(为这个新对象添加属性)
判断函数的返回值类型,如果是值类型,返回创建的对象。如果是引用类型,就返回这个引用类型的对象。
map和Object的区别
map和weakMap的区别
javaScript都有哪些内置对象
值属性
函数属性
基本对象
数字和日期对象
字符串
可索引的集合对象
使用键的集合对象
矢量集合
结构话数据
控制抽象对象
反射
国际化
WebAssembly
其他
常用的正则表达式有哪些
对JSON的理解
javaScript脚本延迟加载的方式有哪些
JavaScript类数组对象的定义
Array.prototype.slice.call(arrayLike);
Array.prototype.splice.call(arrayLike, 0);
Array.prototype.concat.apply([], arrayLike);
Array.from(arrayLike);
数组有哪些原生方法
数组和字符串的转换方法
toString()
toLocalString()
join()
可指定转换为·字符串时的分割符
数组尾部操作方法
pop()
push()
数组首部操作的方法
shift()
unshift()
重排序reverse()和sort()
数组连接的方法
concat()
数组截取的方法
slice()
数组插入的方法
splice()
数组归并的方法
reduce()和reduceRight()
Unicode、UTF-8、UTF-32的区别
UTF-8
UTF-32
常见的位运算符有哪些,其计算规则是什么
为什么函数的arguments的参数是类数组而不是数组?如何遍历类数组
社么是DOM、BOM
对类数组对象的理解、如何转化为数组
escape,encodeURL,encodeURLComponent的区别
对AJAX的理解,实现一个AJAX请求
JavaScript为什么要变量提升,它导致了什么问题
什么是尾调用,使用尾调用有什么好处
ES6模块与CommonJS模块有什么异同
常见的DOM操作有哪些
DOM获取
DOM创建
DOM删除
DOM修改
use strict是什么意思?使用它区别是什么?
如何判断一个对象是否属于某个类
强类型语言和弱类型语言的区别
解释性语言和编译型语言的区别
for...in和for...of的区别
如何使用for...of遍历对象
ajax、fetch、axios区别
ajax
fetch
axios
数组遍历的方法有哪些
数据类型
JavaScript有哪些数据类型,它们的区别是什么?
基础数据类型
String
Number
Boolean
Null
Undefined
Symbol
es6新增
BigInt
es6新增
复合数据类型
Object
Function
Array
数据类型检测的方法有哪些
typeof
instanceof
constructor
Object.proto.toString.call()
判断数组的方式有哪些
Object.prototype.toString.call()
obj.__proto__ === Array.prototype
Array.isArray(obj)
obj.instanceof Array
Array.prototype.isPrototypePf(obj)
null和undefined区别
undefined代表的是未定义 ,null代表的是空对象
undefined在javaScript中不是一个保留字,可以使用undefined作为变量名,但方法危险,可以使用viod 0安全的获取undefined值
当使用typeof判断时,null返回"object",历史遗留问题
typeof null结果是什么,为什么
"object",在js中所有值都存储在32位的单元中,而object的类型标签用000代表,null是特殊数据类型,null值是机器码NULL指针(null指针全是000)
intanceof操作符的实现原理及实现
instanceof 运算符用于判断构造函数的 prototype 属性是否出现在对象的原型链中的任何位置。
为什么0.1+0.2 !==0.3,如何让其相等
计算机是通过二进制的方式存储数据的,这两个数的二进制都是无限循环小数,而js处理这种最多保留小数点后52位,最后遵从0舍1入
如何安全的获取undefined值
void 0
typeof NaN结果是什么
Number
isNaN和Number.isNaN函数的区别
==操作符的强制类型转换规则
首先会判断两者类型是否**相同,**相同的话就比较两者的大小;
类型不相同的话,就会进行类型转换;
会先判断是否在对比 null 和 undefined,是的话就会返回 true
判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number
判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断
判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断
其他值到字符串的转换规则
Null 和 Undefined 类型 ,null 转换为 "null",undefined 转换为 "undefined",
Boolean 类型,true 转换为 "true",false 转换为 "false"。
Number 类型的值直接转换,不过那些极小和极大的数字会使用指数形式。
Symbol 类型的值直接转换,但是只允许显式强制类型转换,使用隐式强制类型转换会产生错误。
对普通对象来说,除非自行定义 toString() 方法,否则会调用 toString()(Object.prototype.toString())来返回内部属性 [[Class]] 的值,如"[object Object]"。如果对象有自己的 toString() 方法,字符串化时就会调用该方法并使用其返回值。
其他值到数字值的转换规则
Undefined 类型的值转换为 NaN。
Null 类型的值转换为 0。
Boolean 类型的值,true 转换为 1,false 转换为 0。
String 类型的值转换如同使用 Number() 函数进行转换,如果包含非数字值则转换为 NaN,空字符串为 0。
Symbol 类型的值不能转换为数字,会报错。
对象(包括数组)会首先被转换为相应的基本类型值,如果返回的是非数字的基本类型值,则再遵循以上规则将其强制转换为数字。
其他值到布尔类型的值的转换规则
假值的布尔强制类型转换结果为 false。从逻辑上说,假值列表以外的都应该是真值。
|| 和&&操作符的返回值
子主题
Object.is()与比较操作符"==="、"=="的区别
使用双等号(==)进行相等判断时,如果两边的类型不一致,则会进行强制类型转化后再进行比较。
使用三等号(===)进行相等判断时,如果两边的类型不一致时,不会做强制类型准换,直接返回 false。
使用 Object.is 来进行相等判断时,一般情况下和三等号的判断相同,它处理了一些特殊的情况,比如 -0 和 +0 不再相等,两个 NaN 是相等的。
什么是JavaScript的包装类型
在 JavaScript 中,基本类型是没有属性和方法的,但是为了便于操作基本类型的值,在调用基本类型的属性或方法时 JavaScript 会在后台隐式地将基本类型的值转换为对象
JavaScript中如何进行隐式类型的转换
在运算符前后值不同
+操作符+操作符的两边有至少一个string类型变量时,两边的变量都会被隐式转换为字符串;其他情况下两边的变量都会被转换为数字。
-、*、\操作符NaN也是一个数字
对于**==**操作符
操作符两边的值都尽量转成number
操作符两边的值都尽量转成number
对于**<和>**比较符
如果两边都是字符串,则比较字母表顺序:其他情况下,转换为数字再比较:
如果两边都是字符串,则比较字母表顺序:其他情况下,转换为数字再比较:
ToPrimitive方法
+操作符什么时候用于字符串的拼接
+ 的其中一个操作数是字符串(或者通过以上步骤最终得到字符串),则执行字符串拼接,否则执行数字加法。
为什么会有BigInt的提案
0 条评论
下一页