类型

作者: 你喜欢吃青椒吗_c744 | 来源:发表于2019-08-03 13:22 被阅读0次

    JavaScript的数据类型

    JavaScript简单数据类型(基本数据类型,值类型)

    • Boolean
    • String
    • Number
    • Undefined
    • Null
    • Symbol

    Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值。

    Undefined 这个值表示变量不含有值。

    可以通过将变量的值设置为 null 来清空变量。

    Javascript复杂数据类型(引用数据类型)

    • Object

    Object 本质上是由一组无序的明值组成的。
    Array、Function等都属于特殊的对象

    声明变量类型

    当您声明新变量时,可以使用关键词 "new" 来声明其类型:

    var carname=new String;
    var x = new Number;
    var y = new Boolean;
    var cars = new Array;
    var person = new Object;
    

    JavaScript 变量均为对象。当您声明一个变量时,就创建了一个新的对象。

    为什么要区分基本类型和复杂类型

    不可变性

    基本类型本身是不可变的。以字符串为例,我们在调用操作字符串的方法时,没有任何方法是可以直接改变字符串的:

    var str = 'ConardLi';
    str.slice(1);
    str.substr(1);
    str.trim(1);
    str.toLowerCase(1);
    str[0] = 1;
    console.log(str);  // ConardLi
    

    在上面的代码中我们对str调用了几个方法,无一例外,这些方法都在原字符串的基础上产生了一个新字符串,而非直接去改变str,这就印证了字符串的不可变性。
    但是:

    str += '6'
    console.log(str);  // ConardLi6
    
    

    你会发现,str的值被改变了,这不就打脸了字符串的不可变性么?其实不然,我们从内存上来理解:

    • JavaScript中,每一个变量在内存中都需要一个空间来存储。
    • 内存空间又被分为两种,栈内存与堆内存。
    • 栈内存
    1. 存储的值大小固定
    2. 空间较小
    3. 可以直接操作其保存的变量,运行效率高
    4. 由系统自动分配存储空间
      JavaScript中的原始类型的值被直接存储在栈中,在变量定义时,栈就为其分配好了内存空间


      image.png

      由于栈中的内存空间的大小是固定的,那么注定了存储在栈中的变量就是不可变的。

    在上面的代码中,我们执行了str += '6'的操作,实际上是在栈中又开辟了一块内存空间用于存储'ConardLi6',然后将变量str指向这块空间,所以这并不违背不可变性的特点。

    image.png

    复杂类型

    • 堆内存
    1. 存储的值大小不定,可动态调整
    2. 空间较大,运行效率低
    3. 无法直接操作其内部存储,使用引用地址读取
    4. 通过代码进行分配空间

    复杂类型的值实际存储在堆内存中,它在栈中只存储了一个固定长度的地址,这个地址指向堆内存中的值

    var obj1 = {name:"ConardLi"}
    var obj2 = {age:18}
    var obj3 = function(){...}
    var obj4 = [1,2,3,4,5,6,7,8,9]
    
    
    image.png

    当然,引用类型就不再具有不可变性了,我们可以轻易的改变它们:

    obj1.name = "ConardLi6";
    obj2.age = 19;
    obj4.length = 0;
    console.log(obj1); //{name:"ConardLi6"}
    console.log(obj2); // {age:19}
    console.log(obj4); // []
    
    

    以数组为例,它的很多方法都可以改变它自身。

    • pop() 删除数组最后一个元素,如果数组为空,则不改变数组,返回undefined,改变原数组,返回被删除的元素
    • push()向数组末尾添加一个或多个元素,改变原数组,返回新数组的长度
    • shift()把数组的第一个元素删除,若空数组,不进行任何操作,返回-undefined,改变原数组,返回第一个元素的值
    • unshift()向数组的开头添加一个或多个元素,改变原数组,返回新数组的长度
    • reverse()颠倒数组中元素的顺序,改变原数组,返回该数组
    • sort()对数组元素进行排序,改变原数组,返回该数组
    • splice()从数组中添加/删除项目,改变原数组,返回被删除的元素

    还有哪些复杂对象

    ECMAScript关于类型的定义中,只给出了Object类型,实际上,我们平时使用的很多引用类型的变量,并不是由Object构造的,但是它们原型链的终点都是Object,这些类型都属于引用类型。

    image.png
    • Array 数组
    • Date日期
    • RegExp正则
    • Function函数

    参考文章

    【JS 进阶】你真的掌握变量和类型了吗

    相关文章

      网友评论

          本文标题:类型

          本文链接:https://www.haomeiwen.com/subject/kftrdctx.html