1.变量
1.1 var
1.1.1 函数作用域
function test() {var message = 'hi'; // 局部变量}test();console.log(message); // 出错!// 虽可以省略var定义,变成全局变量,但不推荐使用,难以维护function test() {message = 'hi'; // 全局变量}test();console.log(message); // "hi"
1.1.2 变量提升
使用var声明的变量会自动提升到函数作用域顶部
function foo() {console.log(age);var age = 26;}foo(); // undefined// age变量提升,相当于function foo() {let age;console.log(age);age = 26;}foo(); // undefined
1.1.3 可重复声明
var age = 16;var age = 26;var age = 36;console.log(age); // 36
1.1.4 全局属性
var a = 'ming';console.log(window.a); // ming
1.2 let
1.2.1 块级作用域
if (true) {var name = 'ming';console.log(name); // ming}console.log(name); // mingif (true) {let age = 23;console.log(age); // 23}console.log(age); // ReferenceError: age 没有定义
1.2.2 没有变量提升,暂时性死区
// var声明,name 会被提升console.log(name); // undefinedvar name = 'ming';// let声明,age 不会被提升console.log(age); // ReferenceError:age 没有定义let age = 23;
1.2.3 不能重复声明,不能条件声明
// 混用 let 和 var 声明,结果一样let age;let age; // SyntaxError;标识符 age 已经声明过了if (typeof name === 'undefined') {let name;}// name 被限制在 if {} 块的作用域内// 因此这个赋值形同全局赋值name = 'ming';
1.2.4 for循环中的let声明
for (var i = 0; i < 5; ++i) {setTimeout(() => console.log(i), 0); // 5、5、5、5、5}for (let i = 0; i < 5; ++i) {setTimeout(() => console.log(i), 0); // 0、1、2、3、4}
1.3 const
与let基本相同,唯一区别声明时必须同时初始化变量、且不可修改
const age = 23;age = 36; // TypeError: 给常量赋值
1.4 声明风格及最佳实践
**
2.1 typeof
// 使用var let声明过且未经初始化的值都会被赋予undefinedlet nameconsole.log(name == undefined) // true// 等同于let name = undefined// 识别所有值类型let a; typeof a // 'undefined'const str = "abc"; typeof str // 'string'const num = 100; typeof num // 'number'const boo = true; typeof boo // 'boolean'const sym = Symbol('s'); typeof sym// 'symbol'typeof null // 'object
2.2 字符串拼接
const a = 100 + 10; // 110const b = 100 + '10'; // '10010'const c = true + '10'; // 'true10'
3.运算符
3.1 ==
/ == 运算符100 == '100'; // true0 == ''; // true0 == false; // truefalse == ''; // truenull == undefined;// true// 除了 == null 之外,其他一律用 ===const obj = { x: 100 };if (obj.a == null) {}// 相当于:// if (obj.a === null || obj.a === undefined) {// }
3.2 truly和falsely
// 以下是 falsely 变量 除此之外都是 truly 变量!!0 === false;!!Nan === false;!!'' === false;!!null === false;!!undefined === false;!!false === false;
3.3 短路运算符
// 逻辑判断console.log(10 && 0); //0 前为false直接跳过console.log('' || 'abc'); //'abc' 前为true直接跳过console.log(!window.abc); //true
