类型

作者: 你喜欢吃青椒吗_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