JavaScript的语法和Java语言类似,每个语句以;结束,语句块用{…}。但是,JavaScript并不强制要求在每个语句的结尾加;,
    浏览器中负责执行JavaScript代码的引擎会自动在每个语句的结尾补上;。
    注释:
    //
    //
    JavaScript严格区分大小写
    数据类型
    JavaScript不区分整数和浮点数,统一用Number表示
    NaN; // NaN表示Not a Number,当无法计算结果时用NaN表示
    Infinity; // Infinity表示无限大,当数值超过了JavaScript的Number所能表示的最大值时,就表示为Infinity
    JavaScript在设计时,有两种 比较运算符:
    第一种是==比较,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果;
    第二种是===比较,它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,再比较。
    由于JavaScript这个设计缺陷,不要使用比较,始终坚持使用=比较。
    另一个例外是NaN这个特殊的Number与所有其他值都不相等,包括它自己:
    NaN === NaN; // false
    isNaN(NaN); // true
    判断NaN的唯一方法是用 ();方法
    JavaScript的设计者希望用null表示一个空的值,而undefined表示值未定义。事实证明,这并没有什么卵用,区分两者的意义不大
    数组:JavaScript的数组可以包括任意数据类型。
    JavaScript的对象是一组由键-值组成的无序集合
    对象
    JavaScript的对象是一组由键-值组成的无序集合
    要获取一个对象的属性,我们用对象变量.属性名的方式 ,
    如person.name; // ‘Bob’
    变量
    申明一个变量用var语句
    使用等号=对变量进行赋值
    可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量,但是要注意只能用var申明一次
    这种变量本身类型不固定的语言称之为动态语言
    使用var申明的变量则不是全局变量
    它的范围被限制在该变量被申明的函数体内
    后来就ECMA就推出了strict模式,强制通过var申明变量,未使用var申明变量就使用的,将导致运行错误
    ‘use strict’;
    不用var申明的变量会被视为全局变量,为了避免这一缺陷,所有的JavaScript代码都应该使用strict模式
    字符串
    还可以用\u####表示一个Unicode字符
    要把多个字符串连接起来,可以用+号连接
    模板字符串 alert(你好, ${name}, 你今年${age}岁了!);
    注意这里是``,Esc下面
    需要特别注意的是,字符串是不可变的,如果对字符串的某个索引赋值,不会有任何错误,但是,也没有任何效果
    数组
    JavaScript的Array可以包含任意数据类型,并通过索引来访问每个元素
    大多数其他编程语言不允许直接改变数组的大小,越界访问索引会报错。然而,JavaScript的Array却不会有任何错误
    slice()就是对应String的substring()版本,它截取Array的部分元素,然后返回一个新的Array;
    var arr = [‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’];
    arr.slice(0, 3); // 从索引0开始,到索引3结束,但不包括索引3: [‘A’, ‘B’, ‘C’]
    arr.slice(3); // 从索引3开始到结束: [‘D’, ‘E’, ‘F’, ‘G’]
    push()向Array的末尾添加若干元素,pop()则把Array的最后一个元素删除掉
    unshift()向Array的头部添加若干元素,shift()则把Array的第一个元素删除掉
    splice()方法是修改Array的“万能方法”,它可以从指定的索引开始删除若干元素,然后再从该位置添加若干元素
    sort()
    reverse()
    concat()
    join()
    对象
    JavaScript的对象是一种无序的集合数据类型,它由若干键值对组成
    访问属性是通过.操作符完成的,但这要求属性名必须是一个有效的变量名
    [‘xxx’]
    xiaohong[‘name’]; // ‘小红’
    xiaohong.name; // ‘小红’
    实际上JavaScript对象的所有属性都是字符串,不过属性对应的值可以是任意数据类型
    如果我们要检测xiaoming是否拥有某一属性,可以用in操作符:
    条件判断
    JavaScript把null、undefined、0、NaN和空字符串’’视为false,其他值一概视为true,因此上述代码条件判断的结果是true
    循环
    for循环
    for … in循环
    while
    do while
    要过滤掉对象继承的属性,用hasOwnProperty()来实现
    Array也是对象,而它的每个元素的索引被视为对象的属性.
    因此,for … in循环可以直接循环出Array的索引
    Map
    最新的ES6规范引入了新的数据类型Map,那么Number或者其他数据类型也可以作为键
    (之前键只能是字符串)
    Set
    在Set中,没有重复的key。
    iterable
    遍历Array可以采用下标循环,遍历Map和Set就无法使用下标。为了统一集合类型,ES6标准引入了新的iterable类型,Array、Map和Set都属于iterable类型.
    用for … of循环遍历集合
    for … of循环和for … in循环有何区别?
    更好的方式是直接使用iterable内置的forEach方法,它接收一个函数,每次迭代就自动回调该函数