02——js基本语法 js面向对象 闭包 数组

一:Array数组:数组

1new Array();                                                               //声明数组没初使化长度

2new Array(size);                                                             //声明数组初使化工长度为size

3new Array ( item0 , item1 , … , itemN) ;             //声明数组并设置初使元素

4var array= [ ‘China’ , 2008 , true ,”hello”];          //数组字面量,推荐写法
         arr[0]=’China’
arr[1]=2008

5var arr=[];                                                 //声明一个长度为0的数组(数组字面量、推荐写法)

注意:JavaScript中没有多维数组,只能有数组嵌套数组:
         var arr=[ ‘A’ , 13 , true , [ ‘x’, ‘y’ , ‘z’]];
         var arr=[
                  [3,4,5], [ ‘x’ , ‘y’ , ‘z’ ] , [ null , ‘hello’ ,false ]

         ];


数组的使用方法

一、普通数组声明:

         vararray=['a','b','c']; var arr=[];

二、键值对集合声明(简化声明方式、json格式、对象,不严谨):

         vararrayDict={'kb':'科比','qd':'乔丹','jnt':'加内特'};

         var dict= newArray();      dict['jk']='蒋坤';dict['xl']='能丽';dict.ltl='刘天成'; alert(dict.ltl);

         此处yDict使用起来类似“键值对集合”,但本身是一个对象,在js中“键值对集合”与“对象”区分并不明确

三、遍历“键值对集合”

         1)“键值对集合”的length属性为undefined所以只能使用for-in循环:

         for(var key inarrayDict){

                   console.log(key+ '...'+arrayDict[key]);

         }


数组若干方法:

toString方法:数组内容

join方法  将字符串添加数组元素间隔

reverse方法   :反转数组中元素

concat方法:多个数组结合成一个

sort方法 ASCII字典排序排序数组

push方法

pop方法

shift方法

unshift方法

slice方法

splice方法


自定义的排序方法例子

functionfnSortAsc(arrayObject,fn) {

   var tmp, i, j;

   for (i = 0; i < arrayObject.length - 1;i++) {

       for (j = arrayObject.length - 1; j >i ; j--) {

           //if (arrayObject[j] 需要改变

           if (fn(arrayObject[j], arrayObject[j- 1]) < 0) {

               //fn(arrayObject[j], arrayObject[j- 1])是匿名函数的执行

               tmp = arrayObject[j];

               arrayObject[j] = arrayObject[j -1];

               arrayObject[j - 1] = tmp;

           }

      }

   }

}

functionfnCompareTwoValues(obj1, obj2) {

      //如果obj1大于obj2返回大于0的值,果0bj1obj2那么就返回一个小于0的值

            return obj1 - obj2;

}


数组键值对集合

1)把Array数组作为键值对集合使用:
         var pinyins =new Array();
         pinyins[“
”]=”ren”;
         pinyins[“
”]=”shou”;
         pinyins[“
”]=”kou”;
         alert(pinyins[“
”])alert(pinyins.)

2)其实Array数组本身就是一个键值对集合,“普通数组”,即通过下标来获取元素,只不过是一个“特殊的键值对集合”而已,把下标作为“键”,把数组元素作为值

 

3)注意1,当键是整数时认为是“普通数组”,length属性具有长度

注意2:当键是非整数字符串时认为是“健值对集合”

注意3:不建议将“普通数组”与“键值对数组”混用,普通的数组也可以看作一个特殊的键值对,哪怕在[]中加一个引号如['1']如果只是键值对数组,那么leng的值为0;所以无法通过for循环遍历,所以这时遍历键值对数组要使用for-in循环(类似于C#foreach)


String对象

1)  length属性:            获取客串的字符个数。(无论中文字符还是英文字符都算一个字符)

2)  charAt(index)方法:获取,指定索引位置的字符(索引从0开始)

3)  indexOf(‘字符串startIndex)方法:获取指定字符串第一次出现的位置.startIndex表示从第几个字符开始,
lastIndexOf(‘
字符串startindex) :            获取指定字符串最后一次出现的位置

4)  spilt(‘分隔符limit)                         根据分隔符将一个字符返回一个数组。Limit表示要返回的数组的最大长度(可自定义)

5)  substr(startIndex,len)                      startIndex位置开始,截取len个字符,没能len参数在startIndex位置截取后面全部

6)  substring(startIndex,stopIndex)    startIndex开始,截取到stopIndex位置(不包括stoptIndex所在的字符)

7)  toUpperCase():          转换大写、              toLowerCase():转换小写

8)  match()replate()search()方法,正则表达式相关


DateMath对象:查看javascript帮助文档


JavaScript面向对象编程

1)  由来:1虽然js都是函数,并没有像C#中那样“类”与“对象”的概念,但也是为了方便编程,并且我们习惯于使用面向对象的方式,所以在js中也需要类似于“类”和“对象”的编程方式,(js也有内置对象)2.js中的对象也都是通过维护变量的作用域等方式方法来模拟的

2)  1.1:创建Person构造函数(Person”函数”、Person”类”(js中没有类的概念))例如:function Person() {}      创建对象的时候,其实可以用都通过object()构造函数来创建,不同的对象,只需要在创建好的对象中,添加不同的成员即可。但是这样所有创建的对象属于同一个类型了,不便于区分不同的对象。所以创建对象的时候,可以自己先定义不同的构造函数来创建不同的对象
1.2:构建函数一般采用帕斯卡命名法(个单词的首字母都大写)
1.3:构造函数也是函数,只是调用时使用new关键字var p = new Person();过new关键字调用一个函数的时候,这个函数就叫做“构造函数”
1.4:动态为Person添加属性和方法.(js动态语言特性)
function Person(name, age, email) { this.user_name = name; this.sayHi = function () {内部函数代码  }; }     
1.5:通过 ” . ” 修饰符访问成员;通过学习 [‘索引’] 的方式访问成员p1.user_name 和 p1['user_age']是一样的

3)  2、创建带参数的Person构造函数
2.1 、js中同样支持this关键字,判断对象是否属于某个初始化成员

4)  3、instanceof关键字、判断对象是否属于某个“类型”(构造函数)并返回true或者flase
p1 instanceof Person

5)  4、通过对象字面量方式创建对象,对象也可以看作键值对集合,所以对象也是可以进行遍历        for (var key in p1){alert(key+'         '+p1[key]); } //输出键和键的值

var p1 = {

            user_name: 'xhn',

            sayhi: function () { alert('大家好'); }

};


函数对象中的prototype属性:原型

1)  prototype的中文解释:原型,雏形,蓝本

2)  强调:
一、prototype是“函数对象”的属性(回忆“函数对象”其他成员)
二、通过该属性可以实现类似C#中的“扩展方法的功能”
  
PersonString分别添加扩展方法
  
解释为什么可以这样做
三、定义在ptototype中的成员是所有对象共享的。所以一般将方法定义在prototype中,而属性则定义在构造函数中
四、通过该属性实现js中的继承
提示:不要为内置对象随便添加新成员。防止混乱,可以对自定义对象通过该方式来添加新成员,即可以通过原型实现扩展方法的功能

function Person(name, age,email) { this.user_name = name; }

//往Person对象的加一个user_name

Person.prototype.sayHi= function () { alert(this.user_name); };

//往函数对象的原型对象加一个sayHi方法

var p1 = new Person('aaa'); p1.sayHi(); //创建一个对象,调用其原型对象中的方法

原型对象中的成员(值类型)的值是只读的,是共享的,只能从普通对象中添加一个同名的成员在普通对象中来隐藏原型对象中的成员  p1.sayHi=function(){alert(‘hello’);}; p1.sayHI();若原型对象的成员是引用类型的(如数组),修改会将原型对象引用的属性修改


JavaScript中的“继承”

1)  Js中继承都是通过prototype实现的,所以一般叫做:“原型继承”. js中没有类的概念,继承是通过对象和对象(例如函数对象之间)来实现的

2)  注意:prototype属性只有函数对象才有(就像call()apply()函数一样),其它对象只有__proto__属性,没有的prototype

3)  一、创建“Person”、“Student”实现继承(注意区别继承,这里可以暂时理解为对象继承)

4)  二、通过画图说明继承原理

5)  三、子对象继承后重写父对象的方法

6)  四、通过对象字面量的方创建的对象,该对象的_proto_引用的Object.prototype(obj.__proto__===Object.prototype),换句话说通过对象字面量的方式创建的对象直接继承自Object对象

7)  五、任何类型都直接或间接继承自Object


Js中“闭包”(*了解closure)

1)什么是“闭包”
         在一个函数几个问题定义一个函数,内部函数能访问外部函数作用域范围内的变量,这时这个内部函数就叫做闭包。无论这个内部函数在哪调用都能访问到外部函数作用域范围的那些变量。

2)闭包是怎么实现的?       通过作用域实现的

3)闭包能做什么?       ①改变变量的作用域②Js中的面向对象都是用“闭包”来实现的

4)“闭包”的好处以及带来的问题

5)介绍函数中的this


函数种的this

当一个函数注册给不同的对象的时候,在调用时,函数中的this表示的是不同的对象

因为直接在页面上定义的函数其实就是注册给了window对象

所以直接调用函数()和调用和通过window.函数名()来调用是一样的

比如一个函数如f1()函数是window对象的函数,所以f1()函数内部this就是表示的window对象。也就是说:在一个函数内部,this表示的是哪个对象,取决于当前函数是哪个对象的函数,若函数单独回一个匿名函数,并没有把这个匿名函数注册给任何对象,那它就是window对象函数


JavaScript的事件

1) javaScript中也有“事件”的概念

2) 单击一个按钮显示当前时间

3) 一个特殊的地方:单击一个超链接显示当前时间
1)热点文字
2)只有超链接的href中的Javascript中才需要加“javascript:”,因为它不是理事件,而是把“javascript:”看成像”http:”、”ftp:”、”ed2k://”、”thunder://”、””、mailto””一样的网络协议,交由js解析收获引擎处理。只有href中这是一个特例。
3)文本框失去焦点弹出消息对话框。Onbllur事件

4) 超链接为“死链”时,使用#与”javascript:void(0);”的区别


——摘自传智播客javascript视频的课堂笔记(注意可能会有错误)

你可能感兴趣的:(javascript初学者)