内建类型
- string
- nubmer
- boolean
- undefined
- object (包括null)
- symbol (ES6+)
类型转换
Truthy&Falsy
Boolean(NaN) === false
Boolean([]) === true
Boolean({}) === true
等价1
2
3
4
5
6
7
8
9var a = [1,2,3]
var b = [1,2,3]
var c = "1,2,3"
a == c // true
b == c // true
a == b // false
[1,2,3].toString() // "1,2,3"
不等价1
2
3
4
5
6
7
8var a = 42
var b = "foo"
a < b // false
a > b // false
a == b // false
Number("foo") // NaN
NaN既不大于其他值,也不小于其他值
变量
标识符必须以a-z,A-Z,$,或_开头。它可以包含任意这些字符外加数字0-9。
Strict模式
使代码符合一组更安全和更合理的指导方针,代码对引擎有更强的可优化性。
立即调用表达式IIFE
1 | (function IIFE(){ |
闭包
1 | function makeAdder(x) { |
模块
模块让你定义对外面世界不可见的私有实现细节(变量,函数),和对外面可访问的公有API。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15function User() {
var username;
var password;
function doLogin(user,pw) {
username = user;
password = pw;
}
var publicAPI = {
login: doLogin
};
return publicAPI;
}
// 创建实例
var fred = User();
fred.login('jack', '123');
this标识符
1 | function foo() { |
foo()
最终在非strict模式中将this设置为全局对象;在strict模式中this将会是undefined
obj1.foo()
将this设置为对象obj1foo.call(obj2)
将this设置为对象obj2new foo()
将this设置为一个新的空对象
原型
1 | var foo = { |
作用域
LHS查询 var a
RHS查询 a = 2
欺骗
eval
1
2
3
4
5
6function foo(str, a) {
eval( str );
console.log( a, b );
}
var b = 2;
foo( "var b = 3;", 1 ); // 1 3with
1
2
3
4
5
6
7
8
9
10
11
12
13function foo(obj) {
with (obj) {
a = 2; // o2时,隐式 var a
}
}
var o1 = { a: 3 };
var o2 = { b: 3 };
foo( o1 );
console.log( o1.a ); // 2
foo( o2 );
console.log( o2.a ); // undefined
console.log( a ); // 2 泄漏到了全局作用域
性能
eval
和 with
都不建议使用,且受严格模式限制。引擎不会优化eval
和 with
,使用多会卡。
函数与块级作用域
1 | function doSomething(a) { |
b
和 doSomethingElse(..)
对任何外界影响都是不可访问的,而是仅仅由 doSomething(..)
控制。它的功能和最终结果不受影响,但是这种设计将私有细节保持为私有的,这通常被认为是好的软件。
命名空间
1 | var MyReallyCoolLibrary = { |
匿名函数命名
1 | setTimeout( function timeoutHandler(){ |
IIFE
1 | var a = 2; |
UMD模块1
2
3
4
5
6
7
8var a = 2;
(function IIFE( def ){
def( window );
})(function def( global ){
var a = 3;
console.log( a ); // 3
console.log( global.a ); // 2
});
def
函数表达式在这个代码段的后半部分被定义,然后作为一个参数(也叫 def
)被传递给在代码段前半部分定义的 IIFE
函数。最后,参数 def
(函数)被调用,并将 window
作为 global
参数传入。
块级作用域
With
try/catch
1
2
3
4try { throw 2 } catch(a) {
console.log( a ); // 2
}
console.log( a ); // ReferenceErrorlet
const
垃圾回收
1 | // bad |
提升
1 | // 函数优先 |
闭包
1 | // 错误 1 |
基于闭包的模块
1 | function CoolModule() { |