重学JS(二)— 语法细节

1. 变量提升

变量可以先使用稍后再声明,声明前使用返回undefined

console.log(v); // undefined
var v = 1;
console.log(v); // 1

尽量将var放在最顶部便于阅读

2. 暂存死区

相对于varletconst不存在变量提升,在声明前引用会抛出引用错误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]

你可能感兴趣的:(重学JS(二)— 语法细节)