JavaScript变量与数据类型

1.JS中有哪些数据类型?

JS中的数据类型包括7种原始数据类型Object对象类型

7 种原始类型如下:

  • Boolean:布尔值
  • Null:空
  • Undefined:一个声明未定义的变量的初始值,或没有实际参数的形式参数。
  • Number:基于 IEEE 754 标准的双精度 64 位二进制格式的值 ((253 -1) 到 (253 -1))
  • BigInt:可以用任意精度表示整数,实际操作是整数后面加个n
  • String:字符串
  • Symbol:可以用来创建匿名的对象属性。

2.JS Object数据类型和其他原始数据类型有什么区别 ?

原始数据类型 存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。栈区包括了 变量的标识符和变量的值。

object数据类型 存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处。放在栈空间中的值是该对象存储在堆中的地址。


下面以一段代码为例简述一下代码解析的流程(如果您看不懂以上的定义或者不了解堆和栈的话强烈建议看看下面的例子,懂的话直接跳过即可)。

a,b为原始数据类型,ary1,2是数组,为object数据类型。

var a = 12;
var b = a;
b = 13;
console.log(a);   //=>12

var ary1 = [12, 23];
var ary2 = ary1;
ary2.push(100);
console.log(ary1);  //=> [12,23,100]

下面这个图描述了上述代码的解析过程。


JavaScript变量与数据类型_第1张图片
Windows里的堆和栈

当代码开始解析的时候,首先会生成一个全局作用域(也叫做栈空间)的环境来执行代码。

先谈一谈原始数据类型。
  • 当执行到第一句 var a=12,浏览器会做三件事:
    1.声明一个a变量
    2.开辟一个空间存储12这个值
    3.将变量和12对应起来

  • 当执行到 var b=a的时候,它是把a存储的值直接给了b,也就是说第1,3步是一样的,第二步是又开辟了一个存值的空间,然后copy了a的值12。这两块空间是独立的。

  • 所以当执行到b=13的时候,只是将b开辟的那个存值的空间的值,从12变成了13。而a的值依旧为12。

所以说,所有基本类型的值都是不可改变的。

来,再谈到object数据类型。

他们比较复杂,和原始数据类型的机制不一样。

  • 当执行到var ary1 = [12, 23];的时候,会开启一块新的存储空间(名叫堆),然后把数组以键-值对的方式存储起来。还会存储其他的对象类型,比如长度length。
    然后再将ary1的指针指向这一块存储空间的地址。
  • 当执行到var ary2 = ary1;的时候,它是把ary2的指针指到ary1地址上。两者共用这一块空间。
  • 当执行第三步ary2.push(100);的时候,这一个堆里面的键值对就增加了一个,长度也变成了3。

由于ary1也指向的是这块的地址,所以说,ary1也发生了变化,为[12,23,100]。

所以说,这个就是对象变量和原始数据变量的区别,它是可以改变的。

3.谈谈你对变量提升的理解?

首先讲一下变量提升的概念:
变量提升:当栈内存(作用域)形成,Js代码自上而下代码执行之前,浏览器会把所有var和function都先进行提前的声明或者定义。这种预先处理机制称为变量提升。

声明(declare): var a / function sum
定义(defined): a=12 定义就是赋值

对代码是声明,对函数是声明和定义。

console.log(a);  // ---undefined
var a = 12;

上面一个例子可以看出,当变量提升的时候,只是对a变量进行变量声明var a,而没有赋值,所以结果是undefined

下面以一段代码和图例来具体讲解一下吧。

var a = 12;
var b = a;
b = 13;
console.log(a);

function sum() {
    var total = null;
    for (var i=0;i

这个是上面代码的具体执行流程。

JavaScript变量与数据类型_第2张图片
变量提升

大体来说和第2题的流程是一样的。
但是在栈内存形成之后和js代码执行之前,浏览器会有一个变量提升的工作

具体是将带有var和function标签的提出来对他们进行声明或定义(function是将开辟的函数堆空间的地址赋给函数)。

之后才是一行一行的执行代码。

对于函数形成的私有作用域,也是先进行变量提升在执行代码的。

4.分别指出以下运算的执行结果?

typeof undefined; => undefined
typeof true; => boolean
typeof 42; => number
typeof "42"; => string
typeof {lift: 42}; => object

参考链接:

[1]js原始数据类型和引用数据类型=>callback数据传输原理
[2]JS中的堆栈内存及闭包详解

你可能感兴趣的:(JavaScript变量与数据类型)