无论如何,你都必须得知道的js知识(续)
前言
碎碎念
此分类用于记载我认为需要整理的js知识
以及我不知道的js知识
。因为是利用零碎时间去整理一些笔记,所以这篇文章后续会持续更新,有兴趣的小伙伴可以先收藏吃灰,哈哈哈。
24. reduce函数剖析(补充)
7. 利用reduce函数将二维数组转换为一维数组
let arr = [[0, 1], [2, 3], [4, 5]]
let newArr = arr.reduce((pre, cur) => pre.concat(cur), [])
console.log(newArr) // [0, 1, 2, 3, 4, 5]
8. 利用reduce函数将多维数组转换为一维数组
let arr = [[0, 1], [2, 3], [4,[5,6,7]]]
`相较于二维数组的转换,多了一层递归处理`
let newArr = arr => arr.reduce((pre,cur) => pre.concat(Array.isArray(cur) ? newArr(cur) : cur), [])
newArr(arr) // [0, 1, 2, 3, 4, 5, 6, 7]
25. 关于js中的内存机制
js栈内存和堆内存详解—图解基本数据类型和引用数据类型的区别。堆栈
这种数据结构,具有先进后出,后进先出
的特点,先明细几个概念:
-
栈内存: 计算机为浏览器执行
js
代码,在内部开辟的空间,也被称为执行环境栈
。里面存放的是基本数据类型以及对象类型数据的引用地址,地址指向了堆内存里的对象内容。由于栈内存中存放的基础数据类型的大小是固定的,所以栈内存的内存都是操作系统自动分配和释放回收的。 -
堆内存: 堆内存里存放的是除函数的引用类型的值,如数组和对象。由于堆内存所存大小不固定,系统无法自动释放回收,所以需要JS引擎来手动释放这些内存
-
执行上下文: 大致分为三类
a.
全局执行上下文
,有一个全局对象windowb.
函数级上下文
:任何一个函数都有自己特有的执行上下文(函数里面的区域可以访问到函数外部的变量,但是函数外部的区域,是访问不到函数里面的)c.
块级上下文
: 由let
或者const
加一个{}
所组成的区域,就是一个块级上下文(括号区域外是无法访问到括号区域里面声明的let或者const变量的,但是可以访问到括号区域里面的var变量) -
变量对象:存储某个区块代码里声明的值和变量
-
真实JS变量在堆栈中的存储:
function foo() {
var a = 1
var obj = {
name: 'xiaoming'
}
}
foo()
原始类型的值会直接存储在上下文中,而上下文则存储在栈内存中;
引用类型的值实际上会被存储在堆内存中,每一个值都对应着一个地址,然后在栈内存的执行上下文中将变量的值赋值成对应的地址。
- 栈和堆的溢出:
a. 栈:当递归调用方法时,随着栈深度的增加,JVM
维持着一条长长的方法调用轨迹,直到内存不够分配,产生栈溢出。
b. 堆:循环创建对象,通俗点就是不断的new
一个对象。
结语
大概就这样吧~
转载自:https://juejin.cn/post/7168294616607752206