说说JavaScript中的堆栈?

堆(heap)、栈(stack)
堆是堆内存的简称,栈是栈内存的简称。说到堆栈,我们讲的就是内存的使用和分配了,没有寄存器的事,也没有硬盘的事。
各种语言在处理堆栈的原理上都大同小异。堆是动态分配内存,内存大小不一,也不会自动释放。栈是自动分配相对固定大小的内存空间,并由系统自动释放。

js的基本类型就5种,Undefined、Null、不是new出来的布尔、数字和字符串,它们都是直接按值存储在栈中的,每种类型的数据占用的内存空间的大小是确定的,并由系统自动分配和自动释放。这样带来的好处就是,内存可以及时得到回收,相对于堆来说,更加容易管理内存空间。

js中其他类型的数据被称为引用类型的数据(如对象、数组、函数等),它们是通过拷贝和new出来的,这样的数据存储于堆中。其实,说存储于堆中,也不太准确,因为,引用类型的数据的地址指针是存储于栈中的,当我们想要访问引用类型的值的时候,需要先从栈中获得对象的地址指针,然后,在通过地址指针找到堆中的所需要的数据。

说来也是形象,栈,线性结构,后进先出,便于管理。堆,一个混沌,杂乱无章,方便存储和开辟内存空间。

ES6有哪些新特性?

  1. var  let const的区别
  2. 数组新增拓展
  3. 对象新增拓展
  4. 函数新增拓展
  5. Set 和 Map
  6. Promise
  7. Generator
  8. Proxy
  9. Module
  10. 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.