你不知道的javaScript笔记(6)

语法

  语句表达式

      句子是完整表达某个意思的一组词,由一个或多个短语组成,他们之间由标点符号或者连接词连接起来。

      语句相当于句子,表达式相当于短语,运算符则相当于标点符号和连接词。

          JavaScript 中表达式可以返回一个结果值。

            var a = 3 * 6;
            var b = a;
              b;
             var a = 3 * 6;   var b = a;   声明语句,因为它声明了语句
                 a = 3 * 6;   b = a;    表达式语句

语句的结果值

      表达式的副作用

          var   a =  42;
           var b = a++;
           a;   // 43
           b;  // 42

           a++   首先返回变量 a 的当前值 42 (在将值赋给b),然后将 a 的值加 1;

          ++ 在前面时,如++a, 它的副作用将(a递增)产生在表达式返回结果之前而 a++ 的副作用则产生在之后。

          ++a++ 会产生 ReferenceError错误

          var a = 42;
          var b = (a++);
            a; // 43
            b; // 42

      可以使用语句系列运算符将多个独立的表达式语句串联成一个语句:

          var a = 42,b;
            b = (a++,a)
            a; // 43
            b; // 43

         delete 运算符用来删除对象中属性和数组中的元素。

        var obj = {
            a:42
        };
        obj.a;         // 42
        delete obj.a;   // true
        obj.a;              // undefined
        function vowels(str){
              var matches;
              if(str) {
                  // 提取所有元音字母
                  matches = str.match(/[aeiou]/g);
                  if(matches) {
                    return matches;
                  }
              }
            }
         vowels("Hello World"); // ["e","o","o"]

      利用赋值语句的副作用将两个if 语句合二为一

          function vomels (str){
                var matches;
                  // 提取所有元素字母
                if(str && (matches = str.match(/[aeiou]/g))){
                    return matches;
                }
          }
          vowels("Hello World");   // ["e","o","o"]

      上下文规则

           1.大括号

            对象常量

              // 假定 函数 bar() 已经定义
                var a = {
                    foo: bar()
                 }

            标签

              // 假定 函数 bar() 已经定义
                {
                  foo: bar()
                }

            代码块

              [] + {}; // "[object Object]"
              {} + []; // 0

            对象解构

              function getData() {
                    // ..
                    return {
                        a: 42,
                        b: "foo"
                    };
                }
                var { a , b } = getData();
                console.log(a,b); // 42 "foo"
                {...} 还可以用作函数命名参数的对象解构,方便隐式地对象属性赋值。
              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]

      运算符优先级

          var a = 42;
          var b = "foo";
          a && b;  // "foo"
          a || b; // 42

      短路

        对于 && 和 || 来说,如果从左边的操作数能够得出结果,就可以忽略右边的操作数,我们将这种现象称为短路。

            a && b || c ? c || b ? a : c && b : a

          因为 && 运算符的优先级高于 ||, 而 || 的优先级又高于 ? :。

            (a && b || c) ? (c || b) ? a : (c && b) : a

      关联

运算符的关联不是从左到右就是从右到左,这取决于组合是从左开始还是从右开始。

          var  a = foo() && bar();

        先执行 foo()  遵循从左到右的执行循序

          var a , b , c;
           a = b = c = 42;

        实际上是这样处理的   a = (b = ( c = 42))

             var  a  = 42;
           var b = "foo";
           var c = false;
           var d = a && b || c ? c || b ? a : c && b : a;
          d;   // 42
        ((a && b) || c) ? ((c || b) ? a : (c && b)) : a

现在来逐一执行

            1.(a && b) 结果为 “foo”.

            2."foo"  || c 结果为 “foo”.

            3,第一个 ? 中 “foo” 为真。

            4.(c || b) 结果为 "foo".

            5.第二个 ? 中, “foo” 为真值。

            6.a 的值为 42

错误

        在编译阶段发生错误叫做早期错误,语法错误是早期错误的一种,使用 try..catch来捕获

        语法错误浏览器一般报 SyntaxError

    提前使用变量

        暂时性死区  TDZ

        let 作用域块

          {
            a = 2; // ReferenceError
            let a;
          }

      函数参数

         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
    try.. finally

      finally中的代码总会在try 之后执行,如果有catch 的话则在catch 之后执行。

      可以将finally  中的代码看做一个回调函数,总是在最后一个执行。

    switch

      可以把它看做 if..else if.. else 的简化版。

        switch (a) {
            case 2:
              // 执行一些代码
              back;
            case 42:
              // 执行一些代码
              back;
            default:
              // 执行一些代码
        }

    混合环境 JavaScript

        动态创建script,标签,将其加入到页面的DOM 中。

          var greeting = "Hello World";
          var el = document.createElement("script");
          el.text = "function foo(){ alert(greeting); setTimeout(foo,1000)}";
          document.body.appendChild(el);

            如果将el.src 的值设置为 URL,就可通过<script src="">

        保留字:

          保留字不能将它用作变量名: 保留字有四类:

          “关键字”  “预留关键字” “null 常量” “true/false”

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏无所事事者爱嘲笑

关于setTimeout和setInterval的函数参数问题

1552
来自专栏每周一脱topic

彻底搞懂golang中的数组和切片slice

通过了解数组array和切片slice的使用和底层原理,可以更透彻的理解他们的使用场景,里面有什么坑。这对我们平时编写程序是极有裨益的,后面我会继续深入,有时间...

1.5K4
来自专栏小狼的世界

Javascript设计模式学习(三)更多的高级样式

if (hid != null && hid != undefined & hid != "") {

892
来自专栏程序生活

Leetcode-Easy 806. Number of Lines To Write String

给一个字符串S,从左到右将它们排列行,每行最大长度为100,,同时给定一个数组withds,widths[0]对应着 a的宽度, widths[1]对应着b的宽...

882
来自专栏Golang语言社区

【Go 语言社区】Golang 语言再谈接口

Go编程提供所谓的接口是另一种数据类型,代表了一组方法签名。结构数据类型实现这些接口对接口的方法签名,并其实现方法具体定义。 Syntax /* define ...

35815
来自专栏Golang语言社区

Goalng下的反射模块reflect学习使用

注意:我们上面的示例是使用值类型进行进行反射构造的。如果是指针类型的话,我们需要使用reflect.Struct字段进行判断接口类型的Kind()方法

1653
来自专栏王小雷

Python之NumPy实践之数组和矢量计算

Python之NumPy实践之数组和矢量计算 1. NumPy(Numerical Python)是高性能科学技术和数据分析的基础包。 2. NumPy的nda...

2468
来自专栏前端架构与工程

【译】《Understanding ECMAScript6》- 第一章-基础知识(一)

目录: 更好的Unicode编码支持 codePointAt()函数 String.fromCodePoint() 用转义序列对Non-BMP字符编码 nor...

2685
来自专栏Golang语言社区

Go语言的fmt包中文教程

Fmt包 import "fmt" 简介 ▾ Package fmt包含有格式化I/O函数,类似于C语言的printf和scanf。格式字符串的规则来源于C但更...

4037
来自专栏PhpZendo

带你入门 JavaScript ES6 (一)

ES6: 是 ECMA国际组织于 2015 年 6 月 17 日发布的 ECMAScript 第六版,正式名为 ECMAScript 2015,通常被成为 ES...

741

扫码关注云+社区

领取腾讯云代金券