JavaScript⾼级程序设计4.pdf
虽然执⾏环境的类型总共只有两种——全局和局部(函数),但还有其他⽅法延长作⽤域链,有些语句可以在作⽤域链的前端临时增加⼀个变量对象,执⾏后会被移除try-catch语句的catch块和with语句
with语句会将指定对象添加到作⽤域链中,catch会创建⼀个新的变量对象
function buildUrl ()
{
var qs="?debug=true";
with (location)
  {
  var url=href + qs;
  }
return url;
}
在此,with语句接受的是location对象,因此其变量对象就包含了location对象的所有属性和⽅法,⽽这个变量对象被添加到了作⽤域链的前端。
JavaScript没有块级作⽤域
if (true)
{
var color="blue";
}
alert(color);  //"blue"
if语句的变量声明会将变量添加到当前执⾏环境(这⾥是全局执⾏环境)
由for语句创建的变量 i 即使在for循环结束后依然存在与循环外部的执⾏环境中
1声明变量如果没有使⽤var,该变量会⾃动添加到全局环境
2查询标识符由当前执⾏环境开始搜索
出那些不再继续使⽤的变量,然后释放其占⽤的内存
常见的是标记清除进⼊环境标记,离开环境清除
引⽤计数是跟踪记录每个值被引⽤的次数
对循环引⽤使⽤⼿⼯消除的⽅式myObject.element=null;element.someObject=null;
对数据的值设置null叫做解除引⽤,适⽤⼤多数全局变量和全局变量的属性,局部变量会在他们离开执⾏环境后被解除引⽤
第5章  引⽤类型
引⽤类型的值(对象)是引⽤类型的⼀个实例,在ECMAScript中,引⽤类型是⼀种数据结构,⽤于将数据和功能组织在⼀起
新对象是使⽤new操作符后跟⼀个构造函数来创建的var person = new object();
Object的实例是存储和传输的理想选择
创建Object有两种⽅式:
第⼀种是new操作符后跟Object构造函数
var person = new Object();
person.name = "Nicholas";
person.age = 29;
另⼀种⽅式是使⽤对象字⾯量表⽰法,它是对象定义的⼀种简写形式,⽬的在于简化创建包含⼤量属性的对象的过程
var person =
{
name:"Nicholas",
age:29
};
javascript全局数组
ECMAScript中的表达式上下⽂指的是能够返回⼀个值(表达式),左花括号表⽰⼀个表达式或者代码块的开始
对象字⾯量也是向函数传递⼤量可选参数的⾸选⽅式
function displayInfo (args)
{
  var output="";
  if(typeof args.name=="string")
    {
    output +="Name: "+args.name+ "\n";
    }
  if(typeof args.age=="number")
    {
    output +="Age: "+args.age+ "\n"
    }
  alert(output);
}
displayInfo({
    name:"Ncholas",
    age:29
    });
displayInfo({
    name:"Greq"
    });
⼀般来说,访问对象的属性都是点表⽰法,也是很多⾯向对象语⾔中通⽤的语法,在JavaScript中也可以使⽤⽅括号表⽰法来访问对象的属性,将访问的属性以字符串的形式放在⽅括号中
alert(person.name)  //"Nicholas"
alert(person.["name"])  //"Nicholas"
⽅括号语法主要优点是可以通过变量来访问属性
var propertyName="name";
alert(person[propertyName]);//"Nicholas"
如果属性名中包含会导致语法错误的字符,或者属性名使⽤的是关键字或保留字,也可以使⽤⽅括号表⽰法
person["first name"]="Nicholas";  //由于"first name"包含⼀个空格,所以不能使⽤点表⽰法来访问
创建数组的基本⽅式有两种,第⼀种是使⽤Array构造函数
var colors= new Array();
如果预先知道数组的要保存的项⽬数量
var colors= new Array(20); //⾃动创建length值为20的数组
也可以向Array构造函数传递数组中应该包含的项
var colors= new Array("red","blue","green");
创建数组的第⼆种基本⽅式是使⽤数组字⾯量表⽰法由⼀些包含数组项的⽅括号表⽰,多个数组项之间以逗号隔开
var colors= ["red","blue","green"];
var name= [];
var value= [1,2,]    //在最后⼀个数组项加逗号会导致创建⼀个包含2或3项的数组
在读取和设置数组的值时,要⽤⽅括号并提供基于0的数字的索引
var color= ["red","blue","green"];  //定义
alert(colors[0]);    //读取
color[1]="black";    //修改
color[3]="gray";    //新增
数组的length是可读写的,通过设置这个属性可以向数组移除或者添加新项
var colors=["red","blue","green"];
colors.length=2;
alert(colors[2]);    //undefined
var colors=["red","blue","green"];
colors[colors.length]="black";    //添加第3项
colors[colors.length]="gray";    //添加第4项
var colors=["red","blue","green"];
colors[99]="black";
alert(colors.length);    //100
检测数组
⼀般可以使⽤if (value instanceof Array)
{
//对数组的操作
}
instanceof操作符的问题在于,它假定单⼀的全局执⾏环境,如果⽹页包含多个框架就有多个不同的执⾏环境,就有多个不同版本的Array构造函数
为了解决这个问题ECMAScript5新增了Array.isArray()⽅法,这个⽅法能确定某个值到底是不是数组,⽽不管是在哪个全局执⾏环境中创建的
if(Array.isArray(value))
{
//对数组的操作
}
转换⽅法
所有对象都具有toLocaleString()、toString()、valueOf()⽅法
var colors=["red","blue","green"];
Strings());  //red,blue,green
alert(colors.valueOf());  //red.blue,green
alert(colors);  //red,blue,green
var person1=
{
  toLocaleString:function()
    {
      return "Nikolaos";
    },
  toString:function()
    {
      return"Nicholas";
    }
};
var person2=
{
  toLocaleString:function()
    {
      return"Grigorios";
    },
   toString:function()
    {
      return"Greg";
    }
};
var people = [person1,person2];
alert(people);
String());
LocaleString());
join()⽅法可以使⽤不同的分隔符来构建这个字符串
var colors=["red","blue","green"];
alert(colors.join(","));  //red,green,blue
alert(colors.join("||"));  //red||green||blue
栈是⼀种LIFO(Last-In-First-Out后进先出)数据结构,栈中项的推⼊和移除只在栈的顶部发⽣,ECMAScript为数组提供push()和pop()⽅法实现类似的功能
var colors=new Array();
var count=colors.push("red","green");  //推⼊两项
alert(count);  //2
count=colors.push("black");  //推⼊另⼀项
alert(count);  //3
var item=colors.pop();
alert(item);  //"black"
alert(colors.length);  //2
-------------------------------------------今天任务没完成,⽋债的感觉不好受,还要付出更多的时间才⾏呐,好惆怅好忧伤-------------------------------------
----------------

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。