JavaScript程序设计--读书笔记

Object类型:对象创建可以通过new后跟要创建对象类型的名称。建object类型实例为其添属性和方法可以创建自定义对象。var a=new Object();意义不大,但是object类型是所有实例的基础。如果构造函数没有参数,则可以省略圆括号(不推荐)。

         Object属性:hasOwnProperty(propertyName):检查给定属性在当前对象实例中(不是实例原型)是否存在,propertyName必须以字符串形式。例:o.hasOwnProperty(“name”)

         isPrototypeof(object):检查传入对象是否是传入对象的原型。

         propertyIsEnumerable(propertyName):检查给定属性是否能够使用for-in语句来枚举。参数名是字符串形式

         toLocalString();返回对象的字符串表示,该字符串与执行环境的地区对应。

         toString()返回对象的字符串表示

         valueOf():返回对象的字符串、数值、布尔值表示。通常与toString()方法返回值相同。

 

         for-in语句:枚举对象属性。

                  for(property in expression) statement

demo

         for(var propName in window){

                   console.log(propName);

}

如果迭代对象变量值为null或者undefined时候会抛出错误,ECMAScript5已经更正了,但是建议在使用for-in前先检查对象的值是不是null或者undefined。

     函数—任何语言都很重要

         函数可以封装任意多语句,可以在任何时候任何地方调用执行。ECMAScript使用function声明,后跟一组参数以及函数体,语法:

         functionfunctionName(arg0,arg1,…argN){

                   statements

}

函数不必指定返回值,可以在任何时候通过return语句后跟要返回的值来实现返回值。return之后不会执行,也可以用if使用多个return语句。Return后也可以不跟返回值,这样可以提前停止函数执行而又不需要返回值。

ECMAScript不介意传多少参数,也不在乎什么类型,即便定义的函数只接受两个参数,在调用函数时也未必一定要传两个参数。可以传一个、三个、0个都可以。原因:在ECMAScript中的参数在内部用一个数组来表示。函数接受的是这个数组,并不关心数组中包含哪些参数。在函数体内可以通过arguments对象来访问这个参数数组,获得传递给函数的每个参数。

因此,命名的参数不是必须,只是方便了。arguments对象也可以与命名参数一起使用。如果只传了一个参数,arguments[1]设置的值不会反映到命名参数中,因为arguments对象长度由传入的参数个数决定,不是有定义函数时的命名参数的个数决定。没有传递值的命名参数将自动被赋予为undefined,跟定义没有初始化一样。

ECMAScript函数没有重载。如果函数名称以及参数个数一样,则,会调用最后一个定义的函数。

变量、作用域、内存

         ECMAScript变量包含两种数据类型的值:基本类型(undefined、null、Boolean、number、String)和引用类型(由多个值构成的对象,保存在内存中的对象,JavaScript不允许直接访问内存中位置,不能直接操作对象的内存空间。在操作对象时,实际上是操作对象的引用而不是实际对象)(引用同一块内存空间,改变一个指向同一块的都会改变)。String在ECMAScript中是值类型。

         可以给对象增删改查属性(实际上是操作的是对象)和方法,却不可给基本类型添加属性。ECMAScript所有参数都是按值传递(参数内改变不影响外边改变)。

         var count = 20;

var result = addTen(count);

alert(count); //20,没有变化

alert(result); //30

 

functionsetName(obj) {

obj.name ="Nicholas";

}

var person = newObject();

setName(person);

alert(person.name);//"Nicholas"

 

functionsetName(obj) {

obj.name ="Nicholas";

obj = new Object();

obj.name = "Greg";

}

var person = newObject();

setName(person);

alert(person.name);//"Nicholas"

这个例子与前一个例子的唯一区别,就是在setName()函数中添加了两行代码:一行代码为obj重新定义了一个对象,另一行代码为该对象定义了一个带有不同值的name 属性。在把person 传递给setName()后,其name 属性被设置为"Nicholas"。然后,又将一个新对象赋给变量obj,同时将其name属性设置为"Greg"。如果person 是按引用传递的,那么person 就会自动被修改为指向其name 属性值为"Greg"的新对象。但是,当接下来再访问person.name 时,显示的值仍然是"Nicholas"。这说明即使在函数内部修改了参数的值,但原始的引用仍然保持未变。实际上,当在函数内部重写obj 时,这个变量引用的就是一个局部对象了。而这个局部对象会在函数执行完毕后立即被销毁。

         instanceof操作符:变量是给定引用类型的实例instanceof结果会返回true。语法如下:

         result=variable instanceof constructor

demo

         alert(person instanceof Object) //始终未true,如果检测基本类型的值,则返回false,因为基本类型不是对象。

执行环境-简称环境

         环境定义了变量和函数有权访问的其他数据,决定了各自的行为。每个执行环境都有一个相关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。编码时无法访问,解析器在处理数据时会在后台使用它。

         全局执行环境是最外围的一个执行环境。宿主环境不同,执行环境对象也不同。在web浏览器中,全局执行环境被认为是window对象,因此所有全局变量和函数都是作为window对象的属性和方法创建的。某个执行环境中所有代码执行完毕,该环境被销毁,保存在其中的所有变量和函数也被销毁(全局执行环境知道application退出,如关闭ie或网页时被销毁)

         每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境被推入环境栈中,函数执行完毕,栈将该环境弹出,把控制权返回给之前的执行环境。ECMAScript程序中的执行流就是有这个方便的机制在控制。

         当代码在一个环境中执行,会创建变量对象的一个作用域链(保证对执行环境有权访问的所有变量和函数的有序访问)。作用域链的前端,始终都是当前执行的代码所在环境的变量对象。如果这个环境是函数,将其活动对象作为变量对象。活动对象在最开始时候只包含一个变量,即arguments对象(在全局环境中是不存在)。作用域链中的下个变量对象来自包含(外部)环境,而再下一个变量对象则来自下一个包含环境。这样一直延续到全局执行环境;全局执行环境变量始终都是作用域链中的最后一个对象。

         标识符解析:沿着作用域链一级一级的搜索标识符的过程。搜索过程始终从作用域链的前端开始,逐级向后回溯,直至找到标识符为止(找不到报错)。

         也就是最内层的可以任意的访问外部变量,因为外部的环境是他的父执行环境,但是在外层不能访问内部变量。内部环境可以通过作用域链访问所有的外部环境,但

外部环境不能访问内部环境中的任何变量和函数。即每个环境都可以向上搜索作用域链,以查询变量和函数名,但是任何环境都不能向下搜索作用域链而进入另一个执行环境。

         延长作用域链:可以在作用域链的前端临时增加一个变量对象,该变量对象会在代码执行后被移除(try-catch中的catch块和with语句)

         function buildUrl() {

var qs = "?debug=true";

with(location){

var url = href + qs;

}

return url;

}

With接收的是location对象,其变量对象就包含了location对象的所有属性和方法,而这个变量对象呗添加到了作用域链的前端,。buildUrl()函数中定义了一个变量qs。当在with 语句中引用变量href 时(实际引用的是location.href),可以在当前执行环境的变量对象中找到。

没有块级作用域

         其他语言{}封闭的代码块会有自己的作用域(自己的执行环境)

         if(true) {

var color = "blue";

}

alert(color);//"blue"

在JavaScript 中,if 语句中的变量声明会将变量添加到当前的执行环境(在这里是全局环境)中。

for (var i=0; i< 10; i++){

doSomething(i);

}

alert(i); //10

对于JavaScript 来说,由for 语句创建的变量i 即使在for 循环执行结束后,也依旧会存在于循环外部的执行环境中。

         使用var声明的变量会自动添加到最接近的环境中。在函数内部,最接近的环境就是函数的局部环境。在with中,最接近的环境是函数环境。

         functionadd(num1, num2) {

var sum = num1 + num2;

return sum;

}

var result =add(10, 20); //30

alert(sum); //由于sum 不是有效的变量,因此会导致错误,如果去掉var,add执行完毕后,sum也将也可以访问到。于是,当调用完add()之后,添加到全局环境中的变量sum 将继续存在;即使函数已经执行完毕,后面的代码依旧可以访问它。

垃圾收集

         垃圾收集机制:按照固定的时间间隔(或代码执行中预定义的收集时间)找出不再继续使用的变量,然后释放其占用的内存。

         标记清除:例如通过反转某个特殊的位记录一个变量何时进入(离开)环境或者使用一个“进入环境的”变量列表跟踪那个变量发生变化。

         引入计数:跟踪记录值被引用的次数,相互引用会遇到问题(会造成内存泄露

性能问题:管理内存:优化内存占用的最佳方式,就是为执行中的代码只保存必要的数据。一旦数据不再有用,最好通过将其值设置为null 来释放其引用——这个做法叫做解除引用(dereferencing)。这一做法适用于大多数全局变量和全局对象的属性。局部变量会在它们离开执行环境时自动被解除引用。

引用类型(和类相似,但不是同一个概念)

引用类型:在ECMAScript中引用类型是一种数据结构,将数据和功能组织在一起,通常称为类。尽管ECMAScript是一门面向对象语言,但是不具备传统面向对象支持的类和接口。引用类型也称为对象定义,因为描述的是一类对象所具有的属性和方法。

         对象是对某个特定引用类型的实例。新对象使用new操作符后跟一个构造函数实现。

         varperson=new Object();使用构造函数object,为新对象定义了默认的属性和方法。

object类型

         Object的实例对于在应用程序中存储和传输数据而言,是很好的选择。

         创建Object的实例的方式有两种:

1、  new后跟Object构造函数,如下:

var person=newObject(); person.name=”gyl”;person.age=20;

2、  使用对象字面量(对象定义的简写形式),简化创建包含大量属性的对象的过程,如下:和第一种方式一样效果。

var person={

         name : “gyl”,

         age : 20  //最后一个属性后面尽量不要加逗号,ie7以前版本会报错

};

                            varperson={};

                            person.name=”gyl”;

                            person.age=20;//效果一样

                   以上三种方式,尽量用第二种第一个即对象字面量,代码少,给人以封装感觉。实际上,对象字面量也是向函数传递大量可选参数的首选方式。

         访问属性时尽量用点表示法除非必须使用变量来访问。即person.name,但是还有方括号表示法,即person[“name”],方括号里面要加双引号。方括号访问好处:属性可以通过变量名来访问;属性名中有非法字符、关键字、保留字等。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值