逻辑运算符
undefined, null, NaN, "", 0, false这六个值转成布尔值均为false
&&(与)
&&
从第一个表达式依次往后看, 如果遇到的表达式转成布尔值为false
, 则暂停, 将该表达式的值返回; 如果从头到尾转成布尔值均为true
, 则将最后一个表达式的值返回
let a = 1 && 2
console.log(a) // 2
let a = 1 && ""
console.log(a) // ""
let a = 0 && ""
console.log(a) // 0
let a = 2 && "" && 4
console.log(a) // ""
....
||(或)
||
从第一个表达式依次往后看, 如果遇到的表达式转成布尔值为true
, 则暂停, 将该表达式的值返回; 如果从头到尾转成布尔值均为false
, 则将最后一个表达式的值返回
let a = 1 || 2
console.log(a) // 1
let a = 0 || 1
console.log(a) // 1
let a = 0 || ""
console.log(a) // ""
let a = 1 || "" || null
console.log(a) // 1
let a = 0 || 2 || null
console.log(a) // 2
!(非)
!
将表达式先转换成布尔值再取反
函数预编译四部曲
- 创建 AO 对象 Activation Object(执行期上下文,作用是理解的作用域,函数产生
的执行空间库) - 找形参和变量声明,将变量和形参名作为 AO 属性名,值为 undefined
相当于 AO{
a : undefined,
b : undefined
}
- 将实参值和形参统一(把实参值传到形参里)
- 在函数体里面找函数声明,值赋予函数体
(先看自己的 AO,再看全局的 GO
作用域
function a (){
function b (){
var bb = 234;
aa = 0;
}
var aa = 123;
b();
console.log(aa)
}
var glob = 100;
a();
闭包的作用
- 实现公有变量
- 可以做缓存(存储结构)
- 可以实现封装, 属性私有化
- 模块化开发, 防止污染全局变量