在ES5的时候,我们认知的数据类型确实是 6种:Number、String、Boolean、undefined、object、Null。
ES6 中新增了一种 Symbol。这种类型的对象永不相等,即始创建的时候传入相同的值,可以解决属性名冲突的问题,做为标记。
谷歌67版本中还出现了一种 bigInt。是指安全存储、操作大整数。(但是很多人不把这个做为一个类型)。
基本数据类型
Number,String,Boolean,null,undefined,symbol,bigint(后两个为ES6新增)
1、Undefined 类型
只有一个值。在使用var 声明变量但未对其加初始化时,这个变量就是undefined。
2、Null 类型
只有一个值。null是表示一个空对象指针,这也是typeof操作符检测 null 值时会返回 object 的原因。
3、Boolean 类型
使用最多的一个类型,有两个字面值,分别是true、false。true不一定等于1,false不一定等于0。
boolean类型的字面值是区分大小写的。True和False是标识符
4、Number 类型
数字类型,表示数据的整数和浮点数。某些语言中也称为“双精度值”。
var intNum = 55;十进制
var num = 012;八进制
var octalNum = 0x23;十六进制
5、String 类型
字符串可以有单引号、双引号表示。字符串是不可变的,一旦创建,值就不能改变
要改变某个变量保存的字符串,首先要销毁原来的字符串,然后于用另一个包含的字符串填充该变量。
注)toString()可以输出二进制、八进制、十进制,十六进制。
null和undefined没有toString()方法,用String函数不返回这两个值的字面量。
6、 Symbol 类型
Symbol 类型的对象永远不相等,即便创建的时候传入相同的值。因此,可以用解决属性名冲突的问题(适用于多少编码),做为标记。
这是 es6 新增的数据类型。
7、BigInt 类型
Javascript 中的任意精度整数,可以安全存储和操作大整数。即始超出 Number 能够表示的安全整数范围。是 chrome 67中的新功能。
应用数据类型
object,function(__proto__ Function.prototype)
object:普通对象,数组对象,正则对象,日期对象,Math数学函数对象。
8、Object 类型
ECMAjavascript中的对象其实就是一组数据和功能的集合。对象可以通过执行new操作符后跟要创建的对象类型的名称来创建。创建object类型的实例并为其添加属性(或)方法,就可以自定义创建对象。
如:var o = new Object( );
object 的每个实例都有下列属性和方法:
constructor:保存着用于创建当前对象的函数。(构造函数)constructor就是object();
hasOwnProperty(propertyName):用于检查给定的当前属性在当前对象实例中)而不是在实例原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字稚串形式指定(例如:o.hasOwnProperty(“name”))。
isPrototypeOf(object):用于检查传入的对象是否是传入对象原型。
propertyIsEnumerable(propertyName):用于检查给定属性是否能够用for-in语句。与hasOwnProperty()方法一样,作为参数的属性名必须以字符串形式指定。
toLocaleString( ):返回对象的字符串表示,该字符串与执行环境的地区对应。
toString( ):返回对象的字符串表示。
valueOf( ):返回对象的字符串、数值或者布尔值表示。通常与toString( )方法的返回值得相同。
ECMAJS中object是所有对象的基础,因些所有对象都具有这些基本的属性和方法。
数据类型检测
-typeof 检测数据类型的逻辑运算符
-instanceof 检测是否为某个类型的实例
-constructor 检测构造函数
-Object.prototype.toString.call 检测数据类型
typeof [ value ] 返回当前值的数据类型 "数据类型"
-返回的结果都是字符串
-局限性
+ typeof null => "object"
+ typeof 不能细分类型(检测普通对象或数组对象都是"object")
输出结果:"string"
ps:所有的值,在内存中都是以二进制存储的。
把其它类型转换为数字的方法:
+ 强转换 (基于底层机制转换的) number([ value ])
+ 一些隐式转换都是基于Number转换的 ps:即不直接调用number 但还是会利用number先进行转换
+ isNaN(' 12px ') 先把其它类型转换为数字再检测
+ 数学运算 '12px' - 13
+ 字符串 == 数字 两个等号比较很多时候也是要把其它值转换为数字
+ ...
+ 弱转换 (基于一些额外的转换) parseInt([ value ])/ paresFloat([ value ])
JS之所以能在浏览器运行,是因为浏览器给JS提供了执行环境 => 栈内存(Stack)
栈内存:提供代码执行环境
堆内存:存放东西(属性,方法)
存储方式
基本数据类型是直接存储在栈中的简单数据段,占据空间小、大小固定,属于被频繁使用的数据。栈是存储基本类型值和执行代码的空间。
引用数据类型是存储在堆内存中,占据空间大、大小不固定。引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址,当解释器寻找引用值时,会检索其在栈中的地址,取得地址后从堆中获得实体。
两种数据类型的区别
1.堆比栈空间大,栈比堆运行速度快。
2.堆内存是无序存储,可以根据引用直接获取。
3.基础数据类型比较稳定,而且相对来说占用的内存小。
4.引用数据类型大小是动态的,而且是无限的。