你的位置:首页 > Java教程

[Java教程]JS源码(条件的判定,循环,数组,函数,对象)整理摘录


 ---
title: JS学习笔记-从条件判断语句到对象创建
date: 2016-04-28 21:31:13
tags: [javascript,front-end]
---
JS学习笔记——整理自《JavaScript高级程序设计》

1)条件的判定

在if,swtich条件判断语句,do-while,while,for三种循环判断语句中会用到条件的判断,其目的是为了判定某种条件的达成与否来控制语句的执行。

e.g. 

 1   if(condition) 2  3   do{} while(condition) 4  5   for(initialization;condition;post-loop-expression){} 6  7   switch(expression){ 8   case condition: 9   break;10   default:11   break;12   }

 



以上例子中的condition就是条件的判断的语句。condition语句可以是任意表达式,ES会自动将表达式的结果转为布尔值。

另外,switch的expression如写成true,可以在之后的condition中写入表达式,以此可以模仿if的判断行为。
s.e.g.

1   switch(true){2   case (i>0):3     i++;4   }

 


2)循环

一.do-while语句是一种后测试循环语句,循环体内的代码至少会循环一次。
e.g.

1   var I =0;2   do {3     i+2;4   }while(i<10);

 


二.While语句是前测试循环语句,循环体的代码可能一次也不会执行。
e.g.

1   var I = 0;2   while (i <10) {3   i+2;4   }

 


三.for语句也是前测试循环语句,但是它具备while所没有的初始化变量和定义循环后要执行代码的能力。for 和 while 的循环功能是一样的,while 做不到for也做不到。
e.g.

1   var count=10;2   for(var i=0;i<count;i++){3     alert(i);4     i++;5   }

 



四.for-in 语句用来循环枚举对象的属性。循环会持续到对象的所有属性都被枚举一遍为止。单次循环时会将枚举到的一个属性名赋予in前的变量。
e.g.

1   for (var proName in window) {2     document.write(propName);3   }

 

3)数组

Array是数据的有序列表,数组的每一项可以保存任意类型的数据,而且数组的长度可以随时变化。
创建数组的方法:
1.使用Array 构造函数:

  var colors = new Array(20);

 


声明了一个拥有20长度的colors数组。

  var colors = new Array(“red”,”blue”,”green”);

 


声明了一个拥有3长度的colors数组,并把三个颜色值写入了数组的前三项。

2.使用数组字面量:

  var colors = [“red”,”blue”,”green”];

 


声明了一个拥有3长度的colors数组,并把三个颜色值写入了数组的前三项。

各种属性值与方法:

    .length属性可写入。
    instance of Array 可判断对象是否是数组。ES5之后的版本可用.is Array()判断对象是否是数组。
    .toString(),toLocalString() 会返回逗号分隔的字符串,其中toLocalString()对每一项数值调用的是toLocalString()方法。
    .valueOf() 返回的是数组。
    .join()方法可以通过传递的指定的字符来分隔原数组,返回的是分隔后的字符串。

栈方法:
后进先出。

    .push()接受任意数量的参数,逐个添加到数组末尾,返回的是修改后数组的长度。
    .pop()不接受参数,每次调用pop()都会移除数组的最后一项并作为pop()的值返回。

队列方法:
先进先出。

    .shift()移除数组的第一项,并作为值返回,与pop()对应。
    .unshift()在数组开头添加任意项,并返回修改后的数组长度,与push()相对应。

重排序方法:

    .sort():
        能将数组内的各项按顺序重新排序,默认为按照ASCII码进行升序排序。
        能接受一个比较函数作为参数,比较函数内的两个参数进行比较:

        e.g.

1       function compare(value1,value2){2         if (value1 < value2){3         return 1;4       }else if (value1 > value2){5         Return -1;6       }else{7         Return 0;8       }9       }

 


用这个比较函数返回给.sort()的话,数组会按照数值的从小到大进行排序,将上述的return值互调的话,数组会按照数值的从大到小排序。
    
    .reverse():将数组所有项的顺序取反并返回取反后的数组。


操作方法
    .concat():将接受的参数连接在原数组的后面。如果接受的参数是一个数组,将会把数组中的每一项提取后单独加入到原数组中。

    .slice():接受一到两个参数,创建一个新的数组,包含从第一个参数为止到第二个参数为止的所有数据项,不包含第二个参数位置的项。如果没有第二个参数,则执行到数组最末尾。

    .splice():拼接方法,第一个参数表示起始位置,第二个参数表示要删除的数组项数,之后的参数表示要从第一个参数的位置开始要插入的数据。通过第一第二个参数的变化,可以模拟push,pop,shift,unshift的四种方法达到同样的效果,本身的意义在于在数组中插入数据。

位置方法
    .indexOf():查找指定的项,第一个参数表示要查找的数据项,第二个参数表示要开始查询的位置。lastIndexOf()则是从数组的后面开始。

##4)函数
声明式:

    function functionName(){  };

表达式:

    var functionName = function(){  }

声明式会提升该段代码的优先级,解析器会在所有代码之前读取函数声明。
表达式不会提升优先级,函数名只是指向函数的指针,将函数名赋予一个变量只是赋予了引用类型。
JS中函数没有重载的概念,后定义的函数会覆盖之前的函数。
    arguments指代了函数的所有参数,是一个数组,arguments.callee方法指向arguments的调用函数。
    .caller方法指向了调用当前函数的函数。
    .apply() 和.call()两个方法的作用是让函数在特定的作用域中调用函数。
    this指代了当前执行环境的主体。
##5)对象
ES中的对象就是一组数据和功能的集合,创建Object类型的实例并给它添加属性和方法,就可以自定义对象。
除Object外,Array,Date,RegExp,Function,Boolean,Number,String,Global,Math等这些也都是对象。
创建Object的两钟基础方法:

e.g.
 

  var person = new Object();  Person.name = “Peter”;

 


这种方法是使用new操作符加Object构造函数。

对象字面量:
e.g.

  Var person = {  Name : ”Peter”,  Age:29;  };

 


使用对象字面量法定义对象,不会调用Object的构造函数,更常使用。

为了解决使用同一个接口创建很多对象,产生大量重复代码的问题,出现了后面几种创建对象的方法:

·工厂模式

 1   function createPerson(name,age,job){ 2    var o =new Object(); 3    o.name = name; 4    o.age = age; 5    o.job = job; 6    o.sayName = function(){ 7     alert(this.name); 8    }; 9    return o;10   }

 



解决了创建多个相似对象的问题,但没有解决对象识别的问题。

·构造函数模式

1   function createPerson(name,age,job){2    this.name = name;3    this.age = age;4    this.job = job;5    this.sayName = function(){6     alert(this.name);7    };8   }

 


构造函数模式可以将它的实例识别为一种特定的类型,解决了对象识别的问题。但是每个方法都要在每个实例上重新创建一边。

·原型模式
通过调用每个函数都有的prototype原型属性来创建共享属性和方法的实例。

1   function Person(){2   }3   Person.prototype.name ="Peter";4   Person.prototype.age = 20;5   Person.prototype.sayName =function(){6     alert(this.name);7   }8 9   var person1 = new Person();

 


原型模式下,实例中创建的属性会屏蔽原型中的属性,而对原型对象所做的任何修改都能立即从实例上反应出来。

·组合使用构造函数和原型模式

 1   function Person(name,age){ 2    this.name =name; 3    this.age = age; 4   } 5   Person.prototype = { 6    constructor:Person, 7    sayName : function(){ 8     alert(this.name); 9    }10   }11 12   var person1 = new Person("Peter",20);

 


实例属性在构造函数中定义,实例共享的属性和方法在原型中定义,这种方法可能最适合。