JS中的8种数据类型和区别

在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.引用数据类型大小是动态的,而且是无限的。

你可能感兴趣的:(JS中的8种数据类型和区别)