分为两大块:js基本类型和js引用类型
原始类型和引用类型区别:
原始类型存储在栈,
- 存储的值大小固定
- 空间较小
- 可以直接操作其保存的变量,运行效率高
- 由系统自动分配存储空间
引用类型数据存储在堆
- 存储的值大小不定,可动态调整
- 空间较大,运行效率低
- 无法直接操作其内部存储,使用引用地址读取
- 通过代码进行分配空间
相对于上面具有不可变性的原始类型,我习惯把对象称为引用类型,引用类型的值实际存储在堆内存中,它在栈中只存储了一个固定长度的地址,这个地址指向堆内存中的值。
js基本类型:
number,string,boolean,null,undefined,symbol,bigint.
Number:
Number():对字符串的处理遵循数字常量的相关规定/语法:只要这个字符串是正确的十进制、二进制、八进制和十六进制表达方式,以及正确的正负号科学计数法,都能被正确的转化成数字。如果处理失败时返回NaN;
parseInt():将输入值转化为整数,在没有第二个参数时默认以十进制转换数值,有第二个参数时,以第二个参数为基数转换数值,如果基数有误返回NaN:
parseFloat():将输入的是小数字符串(或具有可转换小数的字符串)转换为小数,如果输入是个整数字符串依然返回整数
String:
String()函数做强制类型转换时,对于Number和Boolean实际上就是调用的.toString()方法,但是对于null和undefined,就不会调用.toString()方法,因为调用他们的方法,会报错。它会将null直接转换为"null",将undefined直接转换为"undefined"
toString()方法其实适用任何类型向String类型转化,该方法不会影响到原变量,它会将转换的结果返回。采用Number类型的.toString()方法的基模式,可以用不同的基输出数字,例如二进制的基是2,八进制的基是8,十六进制的基是16。不能tostring Null,undefined。
String更强大。
undefined
这个类型只有一个值就是undefined。这个值的语义是,希望表示一个变量最原始的状态。undefined是全局对象的一个属性。也就是说,它是全局作用域的一个变量,并非一个关键字。undefined的最初值就是原始数据类型undefined。自ECMAscript5标准以来undefined是一个不能被配置(non-configurable),不能被重写(non-writable),不能被列举(no-enumerable)的属性
null
null这个类型只有一个值就是null,null 是表示缺少的标识,指示变量未指向任何对象。把 null 作为尚未创建的对象,也许更好理解。希望表示 一个对象被人为的重置为空对象,而非一个变量最原始的状态 。null在内存里的表示就是,栈中的变量没有指向堆中的内存对象
和undefined的区别,表达的意思不一样,-
null表示无值,即该处不应该有值,也没有指向任何对象或者任何值,而undefined表示缺少值,表示应该有值,但是还没有定义,所以先指向全局变量window.undefined或者undefined来代替那个还没有定义的值null和undefined还要注意: 两者的值相同,但是类型不同
boolean
布尔值 转换记得:引用类型都是true,基础类型除了+0,-0,false,null,undefined,'',NaN都是true
symbol
表示唯一,用一个函数创建。参数是description。
const a =Symbol('123');
const b =Symbol('123');
a===b //false;
没有一个Symbol是一样的,这只是一个描述。Symbol 类型也可以作为对象属性名,凡是属性名是 Symbol 类型的,就都是独一无二的,可以保证不会与其他属性名产生冲突。
我们知道通过Object.getOwnPropertySymbols()和Reflect.ownKeys()两种方法去获得Symbol类型的属性名,两者的区别是Object.getOwnPropertySymbols()输出对象自身的所有Symbol属性,而Reflect.ownKeys()除了输出自身的所有Symbol还输出可枚举和不可枚举的属性名
有两个静态方法。
Symbol.for()
- 它接受一个字符串作为参数,然后全局搜索有没有以该参数作为名称的
Symbol值。如果有,就返回这个Symbol值,否则就新建并返回一个以该字符串为名称的Symbol值。使用这个方法创建的symbol值会在全局范围进行注册。这个注册范围包括当前页面和页面中包含的iframe,以及service Worker Symbol.for()也可以生成Symbol值,它和Symbol()的区别是:Symbol.for()方法在创建Symbol值之前会在全局环境中查找,在创建之后会在全局环境中将生成的Symbol登记供搜索使用。而Symbol()方法没有查找和登记这两个过程。
Symbol.keyFor()
-
该方法传入一个symbol值,返回该值在全局注册的键名
const name = Symbol.for('name') console.log(Symbol.keyFor(name)) //'name'
BigInt
bigint可以表示任何值
引用
引用类型: object,array,function,date,regexp,