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