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]

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


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<arguments.length;i++) {
        var item = argument[i];
        item = parseFloat(item);
        !isNaN(item)? total += item :null
    }
    return total;
}

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

变量提升

大体来说和第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中的堆栈内存及闭包详解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335