sailei1 / blog

1 stars 0 forks source link

你不知道的JS -语法 笔记 #79

Closed sailei1 closed 5 years ago

sailei1 commented 5 years ago
  var a, b, c;
  a = b = c = 42; //正常 
  var a = b = 42, 严格模式中这样会产生错误 ,非严格模式会创建一个全局的变量b

JSON-P(将 JSON 数据封装为函数调用, 比如 foo({"a":42}))通过将 JSON 数据传递给函数来实现对其的访问。

[] + {}; // ''+'[object Object]'= "[object Object]"
 {} + []; //  {} (空代码块) +[]= +0 = 0

{ .. }也可用于“解构赋值”

 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;
}

函数参数

//在 ES6 中,如果参数被省略或者值为 undefined,则取该参数的默认值
function foo( a = 42, b = a + 1 ) {
    console.log( a, b );
 }
foo();  // 42 43
foo( undefined ); // 42 43
foo( 5 ); // 5 6
foo( void 0, 7 ); // 42 7
foo( null ); // null 1 

//如果向函数传递 undefined 值,则 arguments 数组中会出现一个值为 undefined 的单元,而不是默认值。
function foo( a = 42, b = a + 1 ) {
         console.log(
             arguments.length, a, b,
             arguments[0], arguments[1]
         );
}
foo(); // 0 42 43 undefined undefined
foo( 10 ); // 1 10 11 10 undefined
foo( 10, undefined ); // 2 10 11 10 undefined 
foo( 10, null ); // 2 10 null 10 null

 function foo(a) {
         "use strict"; //严格模式下 a 不关联  非严格模式 a关联
            a = 42;
         console.log( arguments[0] ); //非严格模式 输出42 
     }
foo( 2 );   // 2 (not linked)
foo();      // undefined (not linked)

try catch finally 中的代码总是会在 try 之后执行,如果有 catch 的话则在 catch 之后执行。也可以将 finally 中的代码看作一个回调函数,即无论出现什么情况最后一定会被调用。

function foo() {
    try {
      return 42;
    }finally {
       console.log( "Hello" );
    }
  console.log( "never runs" );
 }
 foo()
  // Hello
  // 42

switch

通常 case 语句中的 switch 都是简单值 匹配与 ===相同 类型不发生转换 注意被忘了break; 否则会从匹配条件渗透执行 直到遇到break 为止。

混合环境下的JS 注意点

由于浏览器演进的历史遗留问题,在创建带有 id 属性的 DOM 元素时也会创建同名的全局变量不要扩展原生原型

绝大部分网站 /Web 应用程序的代码都存放在多个文件中,通常可以在网页中使用 来加载这些文件,或者使用来包含内 联代码(inline-code)。 这些文件和内联代码是相互独立的 JavaScript 程序还是一个整体呢? 答案(也许会令人惊讶)是它们的运行方式更像是相互独立的 JavaScript 程序,但是并非总是如此。 它们共享 global 对象(在浏览器中则是 window),也就是说这些文件中的代码在共享的命名空间中运行,并相互交互。

JavaScript 规范对于函数中参数的个数,以及字符串常量的长度等并没有限制