1、ES5
规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明。如下代码是非法的:
if(true){
function foo(){}
}
try{
function foo(){}
} catch(e){
}
// 浏览器为了兼容旧代码,不会报错
2、ES6
引入了块级作用域,明确允许在块级作用域之中声明函数。ES6
规定,块级作用域之中,函数声明语句的行为类似于 let
,在块级作用域之外不可引用。
3、考虑到环境导致的行为差异太大,应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句。
// 块级作用域内部的函数声明语句,建议不要使用
{
let a = 'secret';
function f() {
return a;
}
}
// 块级作用域内部,优先使用函数表达式
{
let a = 'secret';
let f = function () {
return a;
};
}
4、暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。(声明变量之前,都是变量的死区,不能调用)
5、ES5 只有两种声明变量的方法:var
命令和 function
命令。ES6
除了添加 let
和 const
命令,后面章节还会提到(《阮一峰ECMAScript 6 入门》),另外两种声明变量的方法: import
命令和 class
命令。所以,ES6
一共有 6 种声明变量的方法。
6、数组与对象结构赋值的区别:数组按顺序,对象按 key
值
7、对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。代码如下:
let { foo: foo, bar: bar } = { foo: 'aaa', bar: 'bbb' };
8、解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于 undefined
和 null
无法转为对象,所以对它们进行解构赋值,都会报错。
let { prop: x } = undefined; // TypeError
let { prop: y } = null; // TypeError
9、ECMAScript
中所有参数都是按值传递,不可能通过参数传递参数。
// 例1 向参数传递基本类型(传递的值被复制给局部变量)
function addTen(num){
num += 10;
return num;
}
var count = 20;
var result = addTen(count)
console.log(count) // 20,没有变化
console.log(result) // 30
// 例2 向参数传递引用类型 (将该引用类型在内存中的地址复制给局部变量,这个局部变量的变化会反映在函数的外部。)
// demo1
function setName(obj){
obj.name = "Nicholas"
}
var person = new Object()
setName(person)
console.log(person.name) // "Nicholas"
//demo2
function setName(obj){
obj.name = "Nicholas"
obj = new Object()
obj.name = 'Hello'
}
var person = new Object()
setName(person)
console.log(person.name) // "Nicholas"
10、ECMAScript
函数的一个重要特点:命名的参数只提供便利,但不是必须。参数可通过 arguments
对象访问(一个与数组类似的对象)
11、return
语句默认返回值是 undefined
(在此之前一只没有注意过。。。。。。)
12、switch
语句在比较值时使用的是全等操作符,因此不会发生类型转换(例如:“10”和10是不等的)
感谢你的阅读,可能未完待续,不定期更新