IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> ES6标准入门(阮一峰)学习笔记01第12章-babel,let,const,冻结常量,声明变量的6种方法,顶层对象的属性,global对象 -> 正文阅读

[JavaScript知识库]ES6标准入门(阮一峰)学习笔记01第12章-babel,let,const,冻结常量,声明变量的6种方法,顶层对象的属性,global对象

1、ECMAScript6简介

Node.js是Iavascript的服务器运行环境。

2、Babe转码器

  • Babe转码器是一个Es6转码器,将es6转成es5
  • babel的配置文件是.babelrc,存放在项目的根目录下。需要配置这个文件
  • 命令行转码工具babel-cli
npm -install --global babel-cli
  • babel-cli工具自带一个babel-node命令,执行babel-node可以进入repl环境,可以直接运行es6脚本
  • 其他的还有babel-register,babel-core,babel-ployfill转码命令
  • 其他的转码方式,略过

第二章-let和const命令

3、let命令–局部有效

let在代码块内有效,在代码块外无效

<script>
  {
    let name='zhangsan'
    var age=20
    let address='beijing'
    console.log(address)//可以输出
  }

  console.log(name)//无法输出
  console.log(age)
</script>
  • for循环计数器很适合使用let命令,for循环中var和let的区别
    本例中,要主要到由于function是在调用a[x]的时候执行的
<script>
  var b=[];
  for(var j=0;j<10;j++){//var是全局有效,
    b[j]=function(){//调用是才去执行,执行时j已经循环完毕,由于是全局的,j一直存在,最终指向10
      console.log(j)//打印出来的j是指向全局的
    }

  }
  b[2]()//输出10,因为var全局有效,log的j指向循环后的j,也就是10
  b[6]()//输出10
  var a=[];
  for(let j=0;j<10;j++){//let局部有效,j在本轮循环有效
    a[j]=function(){
      console.log(j)//打印出来的j是指向局部的,每个j都是一个新的值,
    }
  }
  a[2]()//输出2
  a[6]()//输出6
</script>

javascript的内部引擎会记住上一轮循环的值!

  • for循环变量是一个父作用域,而循环体内部是一个单独的子作用域
<script>
  for(let i=0;i<3;i++){
    let i='hello'
    console.log(i)//输出仨个hello
  }
</script>

4、let命令-let不允许代码提升

<script>
  console.log(i)//可以执行,i为undifned(代码提升)
  var i=10
  console.log(i)

  console.log(j)//不允许代码提升,j报错
  let j=10
  console.log(j)
</script>

5、let命令–暂时性死区

如果在全区声明了变量,又在代码块内再次声明同名局部变量,该变量就会在绑定块级作用域,如果在块级内申明前使用便令,则会报错

<script>
  var temp;
  if (true){
    temp='hello javascript'//报错,不能赋值
    let temp
    temp='another javascript'
    console.log(temp)//可以打印
  }
</script>

其实告诉大家一个道理,变量一定要先声明后使用

6、let命令–不允许重复声明

let不允许在相同作用域内重复声明同一个变量,函数内部也不可以

<script>
  function fun(){
    let a=100//不可以重复声明
    var a=200//不可以重复声明

  }
</script>

7、let命令–块级作用域

<script>
  function f1(){
    let n=5
    if (true){
      let n=10
      console.log(n)//输出10外层作用域和内层作用域互相不影响
    }

    console.log(n)//输出5,外层作用域和内层作用域互相不影响

  }

  console.log("=======")
  f1()
  function f2(){
    var n=5
    if (true){
      var n=10
      console.log(n)//输出10,局部修改了全局作用域
    }

    console.log(n)//输出10局部修改了全局作用域

  }

  f2()
</script>

8、let命令–块级作用域与函数声明

es6关于函数作用域

  • 允许在块级作用域内声明函数
  • 函数声明类似于var,即会提升到全局作用域或函数作用域的头部
  • 同时,函数声明还会提升到所在的会计作用域的头部

9、const命令–基本用法

const声明一个只读的常量,首次声明后不能修改
const和let一样,只在声明所在的块级作用域内有效
const命令声明的常量也不会提升,同样存在暂时性死区,只能在声明后使用。

10、const的本质

const实际上保证的并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。对于符合类型的数据(主要是对象和数组)而言,变量指向的内存地址只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,完全不能控制。因此,将一个对象声明为常量时必须非常小心。

<script>
  const foo={}
  foo.prop=123

  console.log(foo.prop)//打印123

  //将foo指向另一个对象就会报错
  foo={}//会报错
</script>

const的地址指向

<script>
  const a=[]
  a.push('hello')//可执行
  console.log(a)//可执行
  a.length=0//可执行
  console.log(a)//可执行
  a=['world']//报错,a的地址不变,但是地址指向的对象发生改变,这里常量a是一个数组,但是数组本身是可写的,如果将另一个数组赋值给a就会报错
</script>

11、冻结常量指向的对象

使用Object.freeze()来冻结对象

<script>
  //创建对象并冻结再赋值给常量foo
  const foo=Object.freeze({})
  //冻结会报错
  foo.prop=123
  console.log(foo.prop)//冻结后打印undifined
</script>

使用Object.freeze()来冻结对象的每个属性(彻底冻结)

12、ES6声明变量的6种方法

  • var
  • function
  • let
  • const
  • import
  • class

13、顶层对象的属性

  • 顶层对象在浏览器环境中指的是window对象,在node环境中指的是global对象。
  • var和function命令声明的全局变量依旧是顶层对象的属性。
  • let和cosnt、class命令声明的全局变量不属于顶层对象的属性。
<script>
  var a=1;
  console.log(window.a)//打印出1

  let b=1;
  console.log(window.b)//打印undefind,因为let出来的b不是顶层对象
</script>

14、global对象

es5中

  • 浏览器中顶层对象是window,但node和web worker没有window
  • 在浏览器和web Worder中,self也指向顶层对象,但node没有self
  • 在node中,顶层对象是global,但其他环境都不支持。

同一段代码中,为了能够在各种环境中都渠道顶层对象,目前一般是使用this变量,但也有局限性:

  • 在全局环境中,this会返回顶层对象,但在node和es6模块中,this返回的是当前模块
  • 对于函数的this,如果函数不是作为对象的方法运行,而是单纯作为函数运行,this会指向顶层对象,但是严格模式下,this会返回undefined。
  • 不管是严格模式,还是普通模式,new Function(‘return this’)()总会返回全局对象
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-18 12:36:40  更:2021-08-18 12:38:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:01:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码