20180525
- 数据类型 (五种)
undefined String number null undefined boolean
+Object
(弱数据类型闭包 函数)
类型检测(5种类型)
typeof 适合函数,内置对象 和基本类型
缺点对于null 返回是Object
instanceof 适合自定义对象和检查原生对象, obj instanceof Object
判断 左边的原形链上是否相等
缺点 在不同的window下 判断会不同Object.prototype.toString
Object.prototype.toString.apply(function(){}) == [object Function]
constructor
可以会被改写,要注意!
duck type
语句
块语句 block ,{}
没有块级的作用域
声明语句 var
事实上 a 是局部变量,而b变成了全局变量;
如果要定义两个局部变量建议:var a = 1, b = 1;
function foo(){
var a = b = 1;}
foo();
console.log(typeof a);//undefined;
console.log(typeof b);//number
try-catch语句(三种形式)
try{}catch(ex){}
try{}catch(ex){}finally{}
try{}finally{}
function 函数声明 语句
//函数声明,会被预先处理
fd();//true
function fd(){
//do sth
return true;
}
//fe(); typeError
//函数表达式
var fe = function(){
};
for…in语句
执行顺序不确定,由引擎决定
enumerable为false时 不会出现
for in 对象属性时受原型链影响- with语句(不用)
严格模式
‘use strict’;
不允许with
更安全,向上兼容对象
- 对象简述
由一系列属性,是无序的,有字符串key 和value值
对象结构,创建对象 var obj={};
内置属性,writable, enumerable,configurable,value,get/set
每个对象还有一个原型[[proto]]
[[extensible]]属于哪个种类的,对象的extensible属性用于表示是否允许在对象中动态添加新的property
function foo(){}
foo.prototype.z=3;
var obj = new foo();
- 原型链
function foo{}
foo.prototype.z=3;
var obj=new foo();
obj.y=2;
obj.x=1;
obj.y;//2
obj.x;//1
obj.z;//3
'z' in obj //true
obj.hasOwnProperty('z');//false
如果是赋值z在对象上,对父类不改变,相当于java中的覆盖。
对属性的操作
删除delete obj.x
函数
函数调用的四重身份
- 作为函数
- 作为方法
- 作为构造函数
- 通过它们的apply或者call方法间接调用
函数调用模式中this指全局对象(window)
var f1 = function() {
alert("这个是函数调用");
alert(this);
};
f1();
由对象调用方法(当对象为null的时候,函数进行函数调用模式,当对象不为null的时候,函数实现方法调用模式)
在方法调用模式中 this 表示当前对象
var o = {name:"赵建宇"};
o.say = function() {
alert(this.name);
alert(this);
};
o.say();
任何一个函数放在new 后面就是构造函数,构造函数的this是构造函数返回的对象,构造函数的return发生变化,如果返回的是对象,直接返回,否则返回创建出来的对象
如
var Person = function(n) {
this.name = n;
return {sex:"男"};
// return 123;
}
var p = new Person();
语法:
函数名.apply(对象, [参数数组]);
函数名.call(对象, 参数列表);
var func = function() {
this.name = "马伦";
this.say = function(){alert(this.name + "牛逼");};
};
func.apply(null); // 等价于 func();