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);

 


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

posted @ 2016-04-28 21:47  HotenHuang  阅读(559)  评论(0编辑  收藏  举报