js基础 之类型(一)

164 阅读2分钟

入坑 js 一年半之际,后知后觉的我终于开始写技术博客了,并且选择了一个非常烂大街的主题,js 类型。那就让我们开始吧。

类型分类

按存储类型分,可以分为基本类型和引用类型。基本类型有数字,字符串,布尔,null,undefined,引用类型包括对象。

按存储类型分是指什么?

存储类型指这些数据在 js 内存空间里不同的存储方式。其实在 js 的学习和使用过程中,内存管理的存在感就一直不强。因为无论是分配还是回收基本都是自动的,语言也不提供接口查看。
js 内存分为栈、堆和池。基本数据类型的大小基本是固定的,保存在栈中,先进后出。引用对象本身保存在堆内存中,同时也在栈中保存了对应的引用。池用于存放常量。 这也解释了对象的深浅拷贝的问题,浅拷贝只是在栈中新分配了一根指针,本质上二者是指向堆中同一对象。同时从这个知识点还可以引申出作用域链,闭包等知识点。

基本类型包装

在操作字符串的时候,我们经常会调用他的 substr 方法。但是字符串本身是没有操作方法的。那这个 substr 是从哪里来的呢?

var foo = "string";
var val = "string".substr(1, 1);
// val = 't'

当运行第二行代码时,js 引擎实际上创建了一个 String 对象,把'string'作为参数传入构造函数,调用该对象上的 substr 方法,然后销毁该对象。 js 基本包装类型有 String,Number,Boolean 三种。这三个对象都有同名的转型函数,返回值为基本类型。调用 typeof 去检查下面三者的数据类型时得到的结果是完全不一样的。

var a1 = 123; //number
var a2 = String(a1); //string
var a3 = new String(a1); //object

symbol 算基本类型还是引用类型

symbol 是 es6 新出的特性,用于表示独一无二的值。属于基本类型。当需要生成一个唯一值,并且这个值本身是什么并不重要,就可以使用 symbol。symbol 是通过 Symbol 函数生成的。该函数不能用 new 调用。

资料

1.JavaScript 内存机制
2.es6 Symbol