类型转换
typeof
用于检测一个变量的类型,具体值为
typeof null = 'object'
typeof [] = 'object'
typeof NaN = 'number'
typeof 1 = 'number'
typeof '' = 'string'
typeof true = 'boolean'
typeof {} = 'object'
typeof function(){} = 'function'
复制代码
隐式类型转换一般发生于数值操作,例如:
+true = 1
+'' = 0
1 * '22' = 22
1 + '22' = '122' // 非隐式类型转换
复制代码
总的来说,对于''、false、undefined、null、NaN、0
,会在条件语句中判断为false
var x = 1;
if (function f(){}) {
x += typeof(f)
}
console.log(x); // 由于if内的函数f不会提升,所以f类型为undefined,则x值为1undefined
复制代码
运算符优先级()
运算符优先级最大
作用域和作用域链
作用域链是一个栈,越晚产生的离栈顶越近,而寻找变量时,会从栈顶向下找,即从当前作用域一直找到最外层作用域,知道变量被找到或找到全局作用域位置。
函数定义时,内部作用域会继承之前已经存在的作用域
function a (){
function b (){
var bbb = 234;
console.log(aaa);
}
var aaa = 123;
return b;
}
var glob = 100;
var demo = a();
demo();
// b定义时的作用域:a的AO和GO
// b执行时的作用域:a的AO和GO、b的AO
// 所以此题,aaa为123
复制代码
所以产生闭包时,函数的作用域即函数定义时的作用域
闭包的定义:内部的函数或变量被保存到了外部,此时就产生了闭包
function a() {
var num = 100;
function b() {
num ++;
console.log(num);
}
window.b = b; // 这种做法也会产生闭包;
return b;
}
var demo = a();
demo(); // 101
demo(); // 102
demo(); // 103
demo(); // 104
demo(); // 105
// 由于b被保存到了外部,此时产生了闭包,b会继承a的作用域,所以b此时的作用域内仍有num,所以num被保存到了外部,这样每一次返回的函数被执行时,num都会+1
复制代码
闭包的危害:导致原作用域链不被释放,造成内存泄露
闭包作用:
1、实现共有变量
2、缓存
3、实现封装,属性私有化
4、模块化开发,防止污染全局变量
function eater() {
var food = "";
var obj = {
eat: function () {
console.log("I am eating " + food);
food = "";
},
push: function (myFood) {
food = myFood;
}
}
return obj;
}
var eat = eater();
eat.push("apple")
eat.eat() // I am eating apple
复制代码
立即执行函数
只执行一次的函数叫做初始化函数,而立即执行函数是执行一个函数之后马上释放该函数,避免消耗空间。
!(function(a1, a2, a3) {
var a = 123;
var b = 234;
console.log(a + b);
console.log(a1, a2, a3);
})(1, 2, 3)
复制代码
立即执行函数有两种:
(function() {}()); // 推荐
(function() {})();
复制代码
对于函数:函数表达式能立即执行,而函数声明不可以,能被执行符号执行的函数,他的函数名字可以被忽略。这个时候这个函数就可以成为立即执行函数
var test = function() {
console.log('aaa');
}()
// 转换之后为
var test = (function(){
console.log('aaa')
}())
复制代码
所以只要能让函数声明转为表达式,都能让其成为一个立即执行函数,常见的如:逻辑的与
、或
、非
和正
、负
,以及()
+function() {
console.log('a');
}()
-function() {
console.log('a');
}()
!function() {
console.log('a');
}()
复制代码
javascript中能够让函数声明成为表达式的有如下几种:
1、定义表达式:var a = function(){}()
2、初始化表达式:{ a: function(){}() }
3、访问表达式:({a: function(){}}).a()
4、调用表达式:!function(){}()
5、实例化表达式:new function(){}
逗号表达式
逗号表达式即以逗号作为分隔符的表达式,它总会返回该表达式的最后一个值,如下所示
var a = (1, 2, 3)
,此时a
的值为3