重学JS(二)— 语法细节
2020-02-18 本文已影响0人
尹东方
1. 变量提升
变量可以先使用稍后再声明,声明前使用返回undefined
console.log(v); // undefined
var v = 1;
console.log(v); // 1
尽量将var
放在最顶部便于阅读
2. 暂存死区
相对于var
,let
,const
不存在变量提升,在声明前引用会抛出引用错误ReferenceError
,程序开始到变量声明这一段就是暂时性死区。
3. 函数提升
对于函数来说,只有函数声明会被提升到顶部,而函数表达式不会被提升。
/* 函数声明 */
foo(); // "bar"
function foo() {
console.log("bar");
}
/* 函数表达式 */
baz(); // 类型错误:baz 不是一个函数
var baz = function() {
console.log("bar2");
};
其实可以理解为变量提升,所以声明前baz === undefined
4. 数组字面量声明
多余的逗号会视为添加undefined
var myList = ['home', , 'school', ];
console.log(myList); // ['home', undefined, 'school', undefined]
5. ES6 对象字面量声明
- 提供创建时指定原型
-
foo:foo
可以缩写为foo
- 提供父函数调用(或是类似重写)
- 提供表达式动态属性名
var obj = {
// 指定原型
__proto__: theProtoObj,
// 缩写
handler,
// 父函数调用
toString() {
return "d " + super.toString();
},
// 表达式动态计算属性名
[ 'prop_' + (() => 42)() ]: 42
};
6. ES6 模板字符串
var name = "Bob";
var time = "today";
var str = `Hello ${name}, how are you ${time}?`;
7. 函数调用自身(3种方法)
var foo = function bar(){
// 以下三种效果相同
foo();
bar();
arguments.callee();
}
8. 剩余参数(将多余不确定数量参数表示为数组)
function multiply(multiplier, ...theArgs) {
return theArgs.map(x => multiplier * x);
}
var arr = multiply(2, 1, 2, 3);
console.log(arr); // [2, 4, 6]