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++){
b[j]=function(){
console.log(j)
}
}
b[2]()
b[6]()
var a=[];
for(let j=0;j<10;j++){
a[j]=function(){
console.log(j)
}
}
a[2]()
a[6]()
</script>
javascript的内部引擎会记住上一轮循环的值!
- for循环变量是一个父作用域,而循环体内部是一个单独的子作用域
<script>
for(let i=0;i<3;i++){
let i='hello'
console.log(i)
}
</script>
4、let命令-let不允许代码提升
<script>
console.log(i)
var i=10
console.log(i)
console.log(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)
}
console.log(n)
}
console.log("=======")
f1()
function f2(){
var n=5
if (true){
var n=10
console.log(n)
}
console.log(n)
}
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)
foo={}
</script>
const的地址指向
<script>
const a=[]
a.push('hello')
console.log(a)
a.length=0
console.log(a)
a=['world']
</script>
11、冻结常量指向的对象
使用Object.freeze()来冻结对象
<script>
const foo=Object.freeze({})
foo.prop=123
console.log(foo.prop)
</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)
let b=1;
console.log(window.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’)()总会返回全局对象
|