Javascript笔记(一)

重新学习,做点笔记。

1、ES5 规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明。如下代码是非法的:

1
2
3
4
5
6
7
8
9
10
11
if(true){
function foo(){}
}

try{
function foo(){}
} catch(e){

}

// 浏览器为了兼容旧代码,不会报错

2、ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。ES6 规定,块级作用域之中,函数声明语句的行为类似于 let,在块级作用域之外不可引用。

3、考虑到环境导致的行为差异太大,应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 块级作用域内部的函数声明语句,建议不要使用
{
let a = 'secret';
function f() {
return a;
}
}

// 块级作用域内部,优先使用函数表达式
{
let a = 'secret';
let f = function () {
return a;
};
}

4、暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。(声明变量之前,都是变量的死区,不能调用)

5、ES5 只有两种声明变量的方法:var 命令和 function 命令。ES6 除了添加 letconst 命令,后面章节还会提到(《阮一峰ECMAScript 6 入门》),另外两种声明变量的方法: import 命令和 class 命令。所以,ES6 一共有 6 种声明变量的方法。

6、数组与对象结构赋值的区别:数组按顺序,对象按 key

7、对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。代码如下:

1
let { foo: foo, bar: bar } = { foo: 'aaa', bar: 'bbb' };

8、解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于 undefinednull 无法转为对象,所以对它们进行解构赋值,都会报错。

1
2
let { prop: x } = undefined; // TypeError
let { prop: y } = null; // TypeError

9、ECMAScript 中所有参数都是按值传递,不可能通过参数传递参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 例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是不等的)

感谢你的阅读,可能未完待续,不定期更新