javascript---Symbol类型, 引用类型, 作用域
javascript的引用类型, 即对象类型是我们最常用的的类型, 其中有许多让我们需要注意的地方, 最新的 , ES6 的推出, 使得对象类型的属性名不仅仅可以是字符串类型,还可是 Simbol 类型--(^_^现在有两种类型了哦)这里奉上传送门Symbol 值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。
-
Smbol类型
let mySymbol = Symbol(); // 第一种写法 let a = {}; a[mySymbol] = 'Hello!'; // 第二种写法 let a = { [mySymbol] = 'Hello!'; }; // 第三种写法 let a = {}; Object.defineProperty(a, mySymbol, { value: 'Hello!' }); // 以上写法都得到同样结果 a[mySymbol] // "Hello!"
-
引用类型
引用类型(对象类型)是js主要类行,他的用法类似于 c 语言中的指针js基本类型和引用类型存储于两个地方, 基本类型值指的是那些保存在栈内存中的简单数据段,即这种值完全保存在内存中的一个位置 。而引用类型值则是指那些保存在堆内存中的对象,意思是变量中保存的实际上只是一个指针,这个指针指向内存中的另一个位置,该位置保存对象。ps. 指针指针指针!!! (^-^ 重要的时期说三遍)
由于对象类型为指针引用, 在变量复制方面,基本类型和引用类型也有所不同。基本类型复制的是值本身,而引用类型复制的是地址
let box = 'Lee'; //在栈内存生成一个 box 'Lee' let box2 = box; //在栈内存再生成一个 box2 'Lee'
let box = new Object(); //创建一个引用类型 box.name = 'Lee'; //新增一个属性 let box2 = box; //把引用地址赋值给 box2
ps. 复制对象的时候要注意你的复制需求, 到底需要潜复制还是深复制
- 函数参数对于函数参数, 如果是基本类型则直接按指传递, 而如果是引用类型则传递的是引用地址--(^_^指针)
-
执行环境及作用域
- 执行环境是 JavaScript 中最为重要的一个概念。执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为。
- 全局执行环境是最外围的执行环境。在 Web 浏览器中,全局执行环境被认为是 window对象。因此所有的全局变量和函数都是作为 window 对象的属性和方法创建的。
- PS:当执行环境中的所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁。如果是全局环境下,需要程序执行完毕,或者网页被关闭才会销毁。
- PS:每个执行环境都有一个与之关联的变量对象,就好比全局的 window 可以调用变量和属性一样。局部的环境也有一个类似 window 的变量对象,环境中定义的所有变量和函数都保存在这个对象中。(我们无法访问这个变量对象,但解析器会处理数据时后台使用它)
- PS:每个函数被调用时都会创建自己的执行环境。当执行到这个函数时,函数的环境就会被推到环境栈中去执行,而执行后又在环境栈中弹出(退出),把控制权交给上一级的执行环境。
- PS:当代码在一个环境中执行时,就会形成一种叫做作用域链的东西。它的用途是保证对执行环境中有访问权限的变量和函数进行有序访问。作用域链的前端,就是执行环境的变量对象
-
作用域
javascript设计之初并没有块级作用域, 而只有函数作用域(^_^是不是有点反人类)所以给程序员带来了不便,不过可以通过立即执行匿名函数来模仿块级作用域(function () { var name = 'Iris';})()
ES6: 没有块级作用域的语音一切都要归罪于 var 关键字, 于是 ES6 推出了新的关键字 let const 现在官方推荐所有的 var 关键字都可以用 let 代替, let cost 将存在块级作用域功能 具体他们的不同可以参考
(function(){ if (4) { var name = 'Iris'; } console.log(name);//Iris if (5) { let age = '23'; } console.log(age);//age is not defined })()
ps. name在代码块外部是不可见的