还是从基础开始吧,一直处于似懂非懂的状态,基础不够扎实!
1.传递方式有按值传递和按引用传递,按引用传递实际上传递的是复制这个引用类型的指针,按值传递,传递这个值的副本,
按函数是按值传递,且js没有重载,并且任何时候都会返回值,如果未指定,则返回undefided,使用argumes[]来访问变量
function a(obj){
obj.name="1";
obj=new Object();
obj.name="2";
alert(obj.name);
return obj;
}
//1
var aa=new Object();
aa.name="3";
var bb=a(aa);
alert(bb.name);//2
alert(aa.name);//1
2.基本数据类型为undefined、null、bool、number、string,一种复杂数据类型Object
①object就是一组数据和功能的组合,object动态属性添加删除;
②bool类型
然后引申出平常做的if判断:
http://blog.youkuaiyun.com/zhangchuccc/article/details/6073217
再查看一下博客文章关于bool的解读:
http://blog.youkuaiyun.com/gudanyehai/article/details/6089255
一个值为 true 或者 false 的表达式。如果需要,非 Boolean 表达式也可以被转换为 Boolean 值,但是要遵循下列规则:
- 所有的对象都被当作 true。
- 当且仅当字符串为空时,该字符串被当作 false。
- null 和 undefined 被当作 false。
- 当且仅当数字为零时,该数字被当作 false。
- "0"会被当做true,但是下面这个问题就来了:
if("0"){
console.log("aa");
}else{
console.log("bb")
}//输出aa
console.log("0" == true);//输出false
console.log("0" == false);//输出true
3.typeof和insistantof检测数值类型
typeof用于检测基本数据类型,insistance用于检测引用类型。
typeof 1 number
function a(){}
var b={1,2,3}
typeof a function
typeof b object
4.操作符
a++和++a的区别,++a先执行加法再往下运算
位操作符 ~、|、>>、<<、>>>、<<<、^、
补码、反码、
5.作用链,可以使用with和try--catch延长作用于链
6.执行环境,分为全局和函数执行环境
7.对象的创建
创建:记住前提是引用类型。
在js中,对象是指无序键值对的组合。
说是对象的创建,倒不如说是类的定义和实例化。
不要混淆对象和对象实例。
首先别被这些模式吓到,无非就是基于Object的、把函数自身当做构造函数的(constructor)、原型(prototype)的这几种。
基于object的无法解决对象识别的问题;
基于构造函数的,无法解决类方法复用的问题;
基于原型,无法解决
①自定义对象Object实例
对象属性进行赋值操作,其实js引擎内部会进行一次get和set操作,当然你也可以自定义这种get和set操作。
var obj={
name:"Greg"
};
var obj=new Object();
obj.name="Greg";
这是创建对象的一种方式,但是无法解决对象识别的问题,以为使用instanseof时,返回都是Object
以下是工厂模式:
function creatPerson(){
var o=new Object();
o.name="Greg";
return 0;
}
var person1=cretPerson();
②构造函数模式
构造函数也可以像普通函数一样使用。
fucntion Person(){
this.name="Greg";
}
var person1=new Person();
console.log(person1.name);
创建对象的过程:
(1)先创建一个对象;
(2)将构造函数的作用域赋给新对象;
(3)执行构造函数的代码,给对象添加属性
(4)返回新对象
③原型模式
我们创建的每一个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,
prototype就是通过调用构造函数的那个对象实例的原型对象,这里请区分函数的原型属性和函数的原型属性指向的原型对象。
关于这种属性的添加问题,先从自身找属性,如果没有,则到原型对象中去找。
function Person(){}
Person.prototype.name="Greg";
var person1=new Person();
var person2=new Person()
person1.name=“Lily”;
console.log(person2.name) //Lily
p1和p2共有一个Prototype对象
要查看原型对象,可以chorme中看_proto_
//下面这种写法重写了这个原型对象
Person.prototype={
name:“Greg”
}
//所以要把constructor属性加回来并使得他指向正确。
Person.prototype={
constructor:Person,
name:“Greg”
}
④构造函数原型模式
这是默认方式,也是最佳。
funciton Person(){
this.name="Greg";
}
Person.prototype.say=function(){
alert(this.name);
}
这样既解决了属性对于实例的私有和方法的共有。
8.继承的实现
原型链,利用原型让一个引用类型继承另一个引用类型的属性和方法。
构造函数、原型和实例的关系:
每个构造函数都有一个原型对象(他的prototype属性指向原型对象),原型对象都包含一个指向构造函数的指针(他的constructor属性指向构造函数),而实例都包含一个指向原型对象的内部指针([[proto]]).
①原型链继承
function Super(){
this.name="Greg";
}
function Sub(){}
Sub.prototype=new Super();
var sub1=new Sub();
sub1.name="lili";
var sub2=new Sub();
console.log(sub2.name)//lili
因为sub集成了super,super的name属性给了sub的原型对象,所以导致实例共有一个sub1的原型对象的属性name;
⑤构造函数继承
function Super(){
this.name="Greg";
}
function Sub(){
Super.call(this);//这样sub就有了super的name属性,但是父类的方法都要写在函数内部,函数复用无从谈起。
}
var sub1=new Sub();
sub1.name //Greg
③构造函数原型继承集合
function Super(){
this.name="Greg";
}
Super.prototype.say=function(){
alert(this.name);
}
function Sub(){
Super.call(this);//这样sub就有了super的name属性,但是下面sub的原型对象中其实还有name属性,只是没有访问罢了
}
Sub.prototype=new Super();
var sub1=new Sub();
sub1.name="lili";
var sub2=new Sub();
console.log(sub2.name)//lili
9.函数
js中命名函数的地位最高,在js加载时,会先找到函数,加到作用域连最前,比定义变量要高
所以可以理解
var a=1;
function a(){
alert(2);
}
a();
运行时报错“Number is not function”的问题,因为a重写了a()函数
闭包是指有权访问另一个函数作用域中的变量的函数;