function foo({ a, b, c }) {
// 不再需要这样:
// var a = obj.a, b = obj.b, c = obj.c
console.log( a, b, c );
}
foo( {
c: [1,2,3],
a: 42,
b: "foo"
} ); // 42 "foo" [1, 2, 3]
JS 没有 else if
if (a) {
// ..
}else if (b){
// ..
}
//会转换成下面的
if (a) {
// ..
}else {
if (b) {
// ..
}else {
// ..
}
}
运算符优先级
&& 运算符先于 || 执行 而且执行顺序并非我们所设想的从左到右
自动分号
自动分号 实际上是一个“纠错”(error correction)机制。这里的错误 是指解析器错误。
建议在所有需要的地方加上分号,将对 ASI 的依赖降到最低。
TDZ(暂时性死区)指的是由于代码中的变量还没有初始化而不能被引用的情况。
{
a = 2; // ReferenceError!
let a;
}
{
typeof a; // undefined 对未声明变量使用 typeof 不会产生错误
typeof b; // ReferenceError! (TDZ)
let b;
}
JSON-P(将 JSON 数据封装为函数调用, 比如 foo({"a":42}))通过将 JSON 数据传递给函数来实现对其的访问。
{ .. }也可用于“解构赋值”
JS 没有 else if
运算符优先级 && 运算符先于 || 执行 而且执行顺序并非我们所设想的从左到右
自动分号
自动分号 实际上是一个“纠错”(error correction)机制。这里的错误 是指解析器错误。 建议在所有需要的地方加上分号,将对 ASI 的依赖降到最低。
TDZ(暂时性死区)指的是由于代码中的变量还没有初始化而不能被引用的情况。
函数参数
try catch finally 中的代码总是会在 try 之后执行,如果有 catch 的话则在 catch 之后执行。也可以将 finally 中的代码看作一个回调函数,即无论出现什么情况最后一定会被调用。
switch
通常 case 语句中的 switch 都是简单值 匹配与 ===相同 类型不发生转换 注意被忘了break; 否则会从匹配条件渗透执行 直到遇到break 为止。
混合环境下的JS 注意点
由于浏览器演进的历史遗留问题,在创建带有 id 属性的 DOM 元素时也会创建同名的全局变量不要扩展原生原型
绝大部分网站 /Web 应用程序的代码都存放在多个文件中,通常可以在网页中使用来加载这些文件,或者使用来包含内 联代码(inline-code)。
这些文件和内联代码是相互独立的 JavaScript 程序还是一个整体呢? 答案(也许会令人惊讶)是它们的运行方式更像是相互独立的 JavaScript 程序,但是并非总是如此。
它们共享 global 对象(在浏览器中则是 window),也就是说这些文件中的代码在共享的命名空间中运行,并相互交互。
JavaScript 规范对于函数中参数的个数,以及字符串常量的长度等并没有限制