1、6种数据类型
1)原始类型(5种)
number
string
boolen
null
undefined
2)对象object(包括Function、Array、Date、。。。等等),其中Function是一种特殊的对象
2、隐式转换
3、包装对象(number、string、boolean这三个原始类型有包装对象)
4、类型检测
1)判断原始类型常用typeof
2)判断对象常用instanceof
3)其他判断方式
5、没有块级作用域(只有 函数作用域 和 全局作用域)
for(var i=0;i<10;i++){
}
console.log(i);
等同于
var i=0;
for(;i<10;i++){
}
console.log(i);
6、对象结构
7、创建对象(3种方式)和原型链
参考:https://www.cnblogs.com/chengzp/p/prototype.html
//字面量创建对象
var o1 = {
a:1,
b:2
};
var o2 = new Object("{a:1,b:2}");
//构造函数创建对象
var M = function(){
this.a=2;
}
var o3 = new M();
//Object.create创建对象
var p = {a:99};
var o4 = Object.create(p);//以p做为原型创建对象o4,所以o4._proto_ === p
8、数组常用方法
ie9及以上版本浏览器支持es5
9、函数
1)js的函数也是对象,js函数可以像其他对象那样操作(访问属性值)和传递(做为另一个函数的入参),所以我们常叫函数对象;
2)创建函数有3种方式
a)函数声明
function add(a,b){
return a + b;
}
b)函数表达式
//函数变量
var add = function(a,b){
return a+b;
};
//立即执行函数
(function(){
//do sth.
})();
//函数做为返回值
return function(){
//do sth.
};
//命名函数表达式
var a = function add(){
//do sth.
}
函数声明和函数表达式区别
函数声明会被前置,可以先使用函数再声明
函数表达式需要先定义,再使用
c)Function构造器
var func = new Function('a','b','console.log(a+b);');
func(1,2);//3
var func = Function('a','b','console.log(a+b);');
func(1,2);//3
d)3种方式对比
10)this
//全局this
console.log(this.document === document);
console.log(this === window);
var this.a = 33;
console.log(window.a);//33
//一般函数this
function a() {
return this;
}
window === a() // true
//做为对象方法的函数的this
var o = {
prop:77,
f:function(){
return this.prop;
}
};
console.log(o.f());//77
var o = {prop:55};
function a(){
return this.prop;//这里的this指向window
}
o.f = a;
console.log(o.f());//55
//对象原型链上的this
var o = {
f:function(){
return this.a + this.b;
}
}
var p = Object.create(o);//以o做为原型创建对象p
p.a = 8;
p.b = 9;
console.log(p.f());//17
//构造器中的this
function My(){
this.a=9;
}
var o = new My();
console.log(o.a);//9
function H(){
this.a = 9;
return {a:88};
}
var o = new H();
console.log(o.a);//88
//call,apply方法和this
//每个函数都有call和apply这两个方法(Function对象的方法)
function a(c,d){
return this.a+this.b+c+d;
}
var o = {a:1,b:2};
//call和apply把函数a中的this变为o,
//call和apply区别只是入参不同,call一个一个传,apply传数组,3传给c,4传给d
a.call(o,3,4);//1+2+3+4
a.apply(o,[3,4]);
//call和apply使用场景
function bar(){
console.log(Object.prototype.toString.call(this));
}
bar.call(8);//call把函数bar中的this修改为8
//bind和this
//每个函数都有bind方法(Function对象的方法),bind是es5才有,所以ie9+才支持
function f(){
return this.a;
}
var g = f.bind({a:99});
console.log(g);//99
var o = {
a:8,
f:f,
g:g
};
console.log(o.f);//8
console.log(o.g);//99
11)闭包
上图右边的例子,outer()函数返回一个函数,执行完outer()函数之后localVal还未释放内存,func()函数调用时可以访问到localVal,这就是一个闭包的现象
上图上面的例子就是闭包常见的错误,for循环里边的 i 是一个全局变量,点击触发点击事件函数时可以访问 i 变量,这时 i 变量的值为4
闭包可以用于封装
12)继承