SOURCE

var myArray = [];
var myFunction = function f() {
    console.log("这里被执行了000");
}
/**
 * 通过构造函数创建,每次调用都会创建新的函数,效率低下最好不要使用
 */
var myFunction01 = new Function("myFunction01", "console.log('2222222')");
if (!myArray[0]) {
    console.log("执行了这里1111");
    myFunction();
    myFunction01();
}

var input;
if (!input) {
    console.log("input undefined");
} else {
    console.log("input defined");
}
input = "你好啊";
!input ? console.log("aaa") : console.log("bbb")

/**
 * 未初始化的数字变量进行计算会报NaN错误
 */
var num;
console.log(num+10);

/**
 * 当你对一个 null 变量求值时,
 * 空值 null 在数值类型环境中会被当作0来对待,
 * 而布尔类型环境中会被当作 false。例如:
 */
var num01=null;
console.log(num01*100);


if (true) {
  var x = 5;
}
console.log(x); // 5

if (true) {
  let y = 5;
}
// console.log(y); // ReferenceError: y 没有被声明
/**
 * 变量 i 是用 var 声明的,在全局范围内有效,所以全局中只有一个变量 i, 
 * 每次循环时,setTimeout 定时器里面的 i 指的是全局变量 i ,
 * 而循环里的十个 setTimeout 是在循环结束后才执行,所以此时的 i 都是 10。

变量 j 是用 let 声明的,当前的 j 只在本轮循环中有效,
每次循环的 j 其实都是一个新的变量,所以 setTimeout 定时器里面的 j 其实是不同的变量,
即最后输出 12345。(若每次循环的变量 j 都是重新声明的,
如何知道前一个循环的值?这是因为 JavaScript 引擎内部会记住前一个循环的值)。
 */
// 输出十个 10
for (var i = 0; i < 10; i++) {
  setTimeout(function(){
    console.log(i);
  })
}

// 输出 0123456789
for (let j = 0; j < 10; j++) {
  setTimeout(function(){
    console.log(j);
  })
}
/**
 * 
 * 变量 b 用 var 声明存在变量提升,所以当脚本开始运行的时候,b 已经存在了,
 * 但是还没有赋值,所以会输出 undefined。
 *  变量 a 用 let 声明不存在变量提升,在声明变量 a 之前,a 不存在,所以会报错。
 * 
 * 
 * 
 */

console.log(a);  //ReferenceError: a is not defined
let a = "apple";
 
console.log(b);  //undefined
var b = "banana";

/**
 * 
 * const 如何做到变量在声明初始化之后不允许改变的?
 * 其实 const 其实保证的不是变量的值不变,
 * 而是保证变量指向的内存地址所保存的数据不允许改动。
 * 此时,你可能已经想到,简单类型和复合类型保存值的方式是不同的。
 * 是的,对于简单类型(数值 number、字符串 string 、布尔值 boolean),
 * 值就保存在变量指向的那个内存地址,因此 const 声明的简单类型变量等同于常量。
 * 而复杂类型(对象 object,数组 array,函数 function),
 * 变量指向的内存地址其实是保存了一个指向实际数据的指针,
 * 所以 const 只能保证指针是固定的,至于指针指向的数据结构变不变就无法控制了,
 * 所以使用 const 声明复杂类型对象时要慎重。
 * 
 * 
 * 
 * 
 * 
 */
console 命令行工具 X clear

                    
>
console