资讯专栏INFORMATION COLUMN

javascript---Symbol类型, 引用类型, 作用域

leejan97 / 1635人阅读

摘要:指针指针指针重要的时期说三遍由于对象类型为指针引用在变量复制方面,基本类型和引用类型也有所不同。在浏览器中,全局执行环境被认为是对象。

javascript---Symbol类型, 引用类型, 作用域
javascript的引用类型, 即对象类型是我们最常用的的类型, 其中有许多让我们需要注意的地方, 最新的 , ES6 的推出, 使得对象类型的属性名不仅仅可以是字符串类型,还可是Simbol 类型--(^_^现在有两种类型了哦)这里奉上传送门ES6 阮一峰

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在代码块外部是不可见的

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107195.html

相关文章

  • Javascript Symbol 隐匿的未来之星

    摘要:通常,它做为一个偏功能性的标记来表示,在全剧中它是唯一的。并且使用来生成,会在存入当前全局上下文中一个结构中,我们称它为顾名思义,它是全局的,所以使用时我们需要谨慎,尤其是在大型项目中。 ES6中基础类型增加到了7种,比上一个版本多了一个Symbol,貌似出现了很长时间,但却因没有使用场景,一直当作一个概念层来理解它,我想,用它的最好的方式,还是要主动的去深入了解它吧,所以我从基础部分...

    wwolf 评论0 收藏0
  • 变量、作用和内存问题

    摘要:使用声明的变量会动被添加到最近的环境中查询标识符,现在作用域链的最前端开始搜索,逐步向上级查询,直到找到匹配的标识符,在变量查询中,访问局部变量要比全局变量更快,因为不需要向上搜索作用域。 基本类型和引用类型的值 基本类型值指的是简单的数据段;引用类型值指那些可能由多个值构成的对象。不能给基本类型添加属性,可以给引用类型值动态的添加属性。 基本类型按值访问,存放在栈内存中。引用类型按引...

    lentrue 评论0 收藏0
  • JavaScript高级程序设计》笔记:变量、作用、内存问题

    摘要:作用域链中的下一个变量对象来自包含外部环境,而再下一个变量对象则来自下一个包含环境。这样,一直延续到全局执行环境全局执行环境的变量对象始终都是作用域链中的最后一个对象标识符解析沿作用域链一级一级搜索标识符。 一、写在前面 最近研究了创建Android虚拟机、vscode结合weex开发Android APP、Vmware装MAC虚拟机的事,看的内容不够多,接下来加油 二、变量、作用域和...

    U2FsdGVkX1x 评论0 收藏0
  • JavaScript变量、作用和内存问题

    摘要:全局变量是最外围的一个执行环境,代码在环境中执行,会创建一个作用域链,用途是保证对执行环境有权访问所有变量和函数的有序访问。作用域链中最后一个对象始终是全局执行环境。内部环境可以通过作用域链访问所有的外部环境,外部则不能访问内部。 1、基本类型和引用类型的值 * 基本类型 : 指的是简单的数据段,五种基本类型是按值访问的,可以直接操作保存在变量中实际的值。 * 引用类型 : 指那些可能...

    Dr_Noooo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<