变量作用域和内存

原始值和引用值

1、原始值: 就是简单的数据类型,储存的是值
例如: Undefined 、 Null 、 Boolean 、 Number 、 String 和 Symbol
2、引用值:就是由多个值构成的对象,它是保存在内存中的对象,javascript不允许直接访问内存位置,因此是不能操作对象所在的内存空间,所以操作对象其实是操作的对该对象的引用而非对象本身,因此报错引用值的变量是按引用访问的。

动态属性

1、引用值可以随时添加、修改、删除其属性
2、复制值
原始值和引用值再通过变量复制值的时候也有所不同,
(1)原始值复制值的时候会被复制到新变量的位置
(2)在把引用值变量赋值给另一个变量的时候储存在变量中的值也会被复制到新的变量的位置中去,区别在于这里复制的实际上是一个指针,它指向储存在对内存中的对象,因此两个变量实际指向的是同一对象。
3、参数传递(函数参数传递)
(1)在按值传递参数的时候,值会被复制到一个局部变量。即一个命名参数,或者用 ECMAScript 的话说,
就是 arguments 对象中的一个槽位。
(2)在按引用类型传递的时候,值在内存中的位置会被保存在一个局部变量。这样的话本地变量的修改会反应到函数外部。

// 按值传递
function addTen(num) {
num += 10;
return num;
}
let count = 20;
let result = addTen(count);
console.log(count); // 20,没有变化
console.log(result); // 30
// 按引用类型传递
function setName(obj) {
obj.name = "Nicholas";
}
let person = new Object();
setName(person);
console.log(person.name); // "Nicholas"

4、 确定类型
使用typeOf 判断一个变量是否为原始类型(字符串,数值,null , undefined 等),但是typeOf对原始类型有用,但是对引用类型的作用不大。
使用instanceof:如果变量是给定的引用类型,可以同过这个操作符来判断引用类型的数据类型

console.log(person instanceof Object); // 变量 person 是 Object 吗?
console.log(colors instanceof Array); // 变量 colors 是 Array 吗?
console.log(pattern instanceof RegExp); // 变量 pattern 是 RegExp 吗?

解释:按照定义,所有引用值都是 Object 的实例,因此通过 instanceof 操作符检测任何引用值和
Object 构造函数都会返回 true 。类似地,如果用 instanceof 检测原始值,则始终会返回 false ,
因为原始值不是对象。

执行上下文

1、所谓上下文就是指的是变量或者函数可以访问哪些数据,也可以说,就是作用域
2、全局上下文,指的就是全局环境,也就是我们说的window对象。
通过var定义的全局变量和函数都会成为window对象的属性和方法。
使用let 和const 定义的顶级声明不会在全局上下文中,但在作用域链解析上是一样的。
注意:上下文在其所有代码都执行完毕后会被销毁,包括定义
在它上面的所有变量和函数(全局上下文在应用程序退出前才会被销毁,比如关闭网页或退出浏览器)。
3、作用域链增强
上下文分为全局上下文和函数上下文:
const 和 let 声明的变量的作用域都是块级的 ,块级作用域由一对 { } 界定。因此, if 块、 while 块、 function 块,甚至连单独
的块也是 let 声明变量的作用域。
使用const 的常量声明必须初始化某个值,一经声明 在其生命周期内的任何时候都不能在重新赋予新值。

注意:const 声明只应用到顶级原语或者对象。换句话说,赋值为对象的 const 变量不能再被重新赋值
为其他引用值,但对象的键则不受限制。

如果想让整个对象都不能修改,可以使用 Object.freeze() ,这样再给属性赋值时虽然不会报错,
但会静默失败:

垃圾回收

1、标记清理
2、引用计数
3、性能
4、内存管理
5、内存泄漏
6、静态分配与对象池

总结:
小结
JavaScript 变量可以保存两种类型的值:原始值和引用值。原始值可能是以下 6 种原始数据类型之
一: Undefined 、 Null 、 Boolean 、 Number 、 String 和 Symbol 。原始值和引用值有以下特点。
 原始值大小固定,因此保存在栈内存上。
 从一个变量到另一个变量复制原始值会创建该值的第二个副本。
 引用值是对象,存储在堆内存上。
 包含引用值的变量实际上只包含指向相应对象的一个指针,而不是对象本身。
 从一个变量到另一个变量复制引用值只会复制指针,因此结果是两个变量都指向同一个对象。
 typeof 操作符可以确定值的原始类型,而 instanceof 操作符用于确保值的引用类型。
任何变量(不管包含的是原始值还是引用值)都存在于某个执行上下文中(也称为作用域)。这个
上下文(作用域)决定了变量的生命周期,以及它们可以访问代码的哪些部分。执行上下文可以总结
如下。
 执行上下文分全局上下文、函数上下文和块级上下文。
 代码执行流每进入一个新上下文,都会创建一个作用域链,用于搜索变量和函数。
 函数或块的局部上下文不仅可以访问自己作用域内的变量,而且也可以访问任何包含上下文乃
至全局上下文中的变量。
 全局上下文只能访问全局上下文中的变量和函数,不能直接访问局部上下文中的任何数据。
 变量的执行上下文用于确定什么时候释放内存。
JavaScript 是使用垃圾回收的编程语言,开发者不需要操心内存分配和回收。JavaScript 的垃圾回收
程序可以总结如下。
 离开作用域的值会被自动标记为可回收,然后在垃圾回收期间被删除。
 主流的垃圾回收算法是标记清理,即先给当前不使用的值加上标记,再回来回收它们的内存。
图灵社区会员 aSINKz(1561821892@qq.com) 专享 尊重版权
102 第 4章 变量、作用域与内存
 引用计数是另一种垃圾回收策略,需要记录值被引用了多少次。JavaScript 引擎不再使用这种算
法,但某些旧版本的 IE 仍然会受这种算法的影响,原因是 JavaScript 会访问非原生 JavaScript 对
象(如 DOM 元素)。
 引用计数在代码中存在循环引用时会出现问题。
 解除变量的引用不仅可以消除循环引用,而且对垃圾回收也有帮助。为促进内存回收,全局对
象、全局对象的属性和循环引用都应该在不需要时解除引用。

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

推荐阅读更多精彩内容