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); // ming
if (true) {
let age = 23;
console.log(age); // 23
}
console.log(age); // ReferenceError: age 没有定义
1.2.2 没有变量提升,暂时性死区
// var声明,name 会被提升
console.log(name); // undefined
var 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声明过且未经初始化的值都会被赋予undefined
let name
console.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; // 110
const b = 100 + '10'; // '10010'
const c = true + '10'; // 'true10'
3.运算符
3.1 ==
/ == 运算符
100 == '100'; // true
0 == ''; // true
0 == false; // true
false == ''; // true
null == 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