zoukankan      html  css  js  c++  java
  • 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

    };

    ECMAScript中的表达式上下文指的是能够返回一个值(表达式),左花括号表示一个表达式或者代码块的开始

    对象字面量也是向函数传递大量可选参数的首选方式

    function displayInfo (args)

    {

      var output="";

      if(typeof args.name=="string")

        {

        output +="Name: "+args.name+ " ";

        }

      if(typeof args.age=="number")

        {

        output +="Age: "+args.age+ " "

        }

      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"];

    alert(colors.toStrings());  //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);

    alert(people.toString());

    alert(people.toLocaleString());

    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

    -------------------------------------------今天任务没完成,欠债的感觉不好受,还要付出更多的时间才行呐,好惆怅好忧伤-----------------------------------------------------

  • 相关阅读:
    Codeforces Round #592 (Div. 2)C. The Football Season(暴力,循环节)
    Educational Codeforces Round 72 (Rated for Div. 2)D. Coloring Edges(想法)
    扩展KMP
    poj 1699 Best Sequence(dfs)
    KMP(思路分析)
    poj 1950 Dessert(dfs)
    poj 3278 Catch That Cow(BFS)
    素数环(回溯)
    sort与qsort
    poj 1952 buy low buy lower(DP)
  • 原文地址:https://www.cnblogs.com/sdgjytu/p/3644906.html
Copyright © 2011-2022 走看看