类型

2019-08-03  本文已影响0人  你喜欢吃青椒吗_c744

JavaScript的数据类型

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

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

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

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

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

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的值被改变了,这不就打脸了字符串的不可变性么?其实不然,我们从内存上来理解:

  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); // []

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

还有哪些复杂对象

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

image.png

参考文章

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

上一篇 下一篇

猜你喜欢

热点阅读