说说JavaScript中的堆栈?
堆(heap)、栈(stack)
堆是堆内存的简称,栈是栈内存的简称。说到堆栈,我们讲的就是内存的使用和分配了,没有寄存器的事,也没有硬盘的事。
各种语言在处理堆栈的原理上都大同小异。堆是动态分配内存,内存大小不一,也不会自动释放。栈是自动分配相对固定大小的内存空间,并由系统自动释放。
js的基本类型就5种,Undefined、Null、不是new出来的布尔、数字和字符串,它们都是直接按值存储在栈中的,每种类型的数据占用的内存空间的大小是确定的,并由系统自动分配和自动释放。这样带来的好处就是,内存可以及时得到回收,相对于堆来说,更加容易管理内存空间。
js中其他类型的数据被称为引用类型的数据(如对象、数组、函数等),它们是通过拷贝和new出来的,这样的数据存储于堆中。其实,说存储于堆中,也不太准确,因为,引用类型的数据的地址指针是存储于栈中的,当我们想要访问引用类型的值的时候,需要先从栈中获得对象的地址指针,然后,在通过地址指针找到堆中的所需要的数据。
说来也是形象,栈,线性结构,后进先出,便于管理。堆,一个混沌,杂乱无章,方便存储和开辟内存空间。
ES6有哪些新特性?
- var let const的区别
- 数组新增拓展
- 对象新增拓展
- 函数新增拓展
- Set 和 Map
- Promise
- Generator
- Proxy
- Module
- Decorator
JS中的String常见方法有哪些?
charAt() 返回指定位置的字符串,空格占位
replace() 用字符替代另一些字符
split() 把一个字符串分割成字符串数组
indexOf() 返回某个指定的字符串 在字符串中首次出现的位置,没有出现返回-1
lastIndexOf() 返回某个指定字符串最后出现的位置
match() 匹配,在字符串中检索指定的值 ,没有为null
toLowerCase() 转换为小写
toUpperCase() 转化为大写
slice() 数组和字符串都能用,提取某个字符串的某一部分,并以新的字符串返回并提取的部分
substr() 从索引号提取指定数目的字符(开始位置,提取数量)
substring() 同slice()
trim() 删除前置和后置的空格
toFixed() 保留小数
search() 检索字符串中,指定的字符串,或者是说,检索与正则表达式匹配的字符串
null和undefined有什么区别?
(1)相同点
第一:Undefined和Null两种数据类型都只有一个字面值,分别是undefined和null.
第二:Undefined和Null类型在转换为Boolean类型的值时,都会转换为false.
第三:在需要将两者转换成对象的时候,都会抛出一个TypeError的异常。
第四:Undefined
类型派生自Null
类型,所以在非严格相等的比较下,两者是相等的。
(2)不同点
第一:null是JavaScript的关键字,而undefined是JavaScript的一个全局变量,也就是挂载在window对象上的一个变量,并不是关键字。
第二:在使用typeof运算符进行检测时,Undefined类型的值会返回undefined.而Null类型的值返回为object
第三:在需要进行字符串类型的转换时,null
会转换成字符串null
,而undefined
会转换字符串undefined
.
第四:在进行数值类型的转换时,undefined
会转换为NaN
,无法参与计算,而null
会转换为0
,可以参与计算。
第五:建议:无论在什么情况下都没有必要将一个变量显示的赋值为undefined
。如果需要定义某个变量来保存将来要使用的对象,应该将其初始化为null
.