再读《js高级程序设计》

来源:互联网 发布:php ajax传值 编辑:程序博客网 时间:2024/06/08 00:18

还是从基础开始吧,一直处于似懂非懂的状态,基础不够扎实!


1.传递方式有按值传递和按引用传递,按引用传递实际上传递的是复制这个引用类型的指针,按值传递,传递这个值的副本,

按函数是按值传递,且js没有重载,并且任何时候都会返回值,如果未指定,则返回undefided,使用argumes[]来访问变量

function a(obj){obj.name="1";obj=new Object();obj.name="2";alert(obj.name);return obj;}
//1var aa=new Object();aa.name="3";var bb=a(aa);alert(bb.name);//2alert(aa.name);//1


2.基本数据类型为undefined、null、bool、number、string,一种复杂数据类型Object


①object就是一组数据和功能的组合,object动态属性添加删除;

②bool类型

然后引申出平常做的if判断:

http://blog.csdn.net/zhangchuccc/article/details/6073217

再查看一下博客文章关于bool的解读:

http://blog.csdn.net/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")}//输出aaconsole.log("0" == true);//输出falseconsole.log("0" == false);//输出true



3.typeof和insistantof检测数值类型

typeof用于检测基本数据类型,insistance用于检测引用类型。

typeof 1   numberfunction a(){}var b={1,2,3}typeof  a  functiontypeof 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()函数


闭包是指有权访问另一个函数作用域中的变量的函数;


0 0