JavaScript

来源:互联网 发布:简易衣柜 知乎 编辑:程序博客网 时间:2024/05/16 17:53

原文链接

一:数据类型


  1. JavaScript定义变量时统一用“var 变量名”,也可以省略var这个关键字。

  2. 数据类型分为基本数据类型(数值类型、布尔类型、字符串类型、nullundefined)和复合的数据类型(数组、对象)。

  3. NullNull类型只有一个专用值 null,值 undefined实际上是从值 null 派生来的,因此 ECMAScript把它们定义为相等的。尽管这两个值相等,但它们的含义不同。undefined是声明了变量但未对其初始化时赋予该变量的值,null则用于表示尚未存在的对象(typeof运算符对于 null 值会返回 "Object"。)。如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是 null

  4. Undefined:值undefined并不同于未定义的值。但是typeof运算符并不真正区分这两种值。假设变量oTemp2从未被声明过。如果对oTemp2使用除 typeof 之外的其他运算符的话,会引起错误,因为其他运算符只能用于已声明的变量上。当函数无明确返回值时,返回的也是值 "undefined"。当声明的变量未初始化时,该变量的默认值是 undefined

  5. 引用类型是可以添加属性,基本类型虽然也可以添加属性,也不会报错,经测试添加完之后却是无法访问的。比如String它是基本数据类型,添加属性后,添加的属性是不可以访问的。


二:函数基本概念


  1. 函数的分类:自定义函数即自己编写的函数(function funName(){})和系统函数即JavaScript自带的函数(alert函数)。

  2. 函数的调用方式:普通调用:functionName(实际参数...)和通过指向函数的变量去调用:var myVar=函数名; myVar(实际参数...);

  3. 函数返回值:当函数无明确返回值时,返回的值就是"undefined"。当函数有返回值时,返回值是什么就返回什么。

  4. 可变参数:函数的参数列表可以是任意多个,并且数据类型可以是任意的类型,JavaScript的函数天然支持可变参数,JavaScript有一个arguments变量可以访问所有传到函数内部的参数。

  5. JavaScript创建动态函数:JavaScript支持创建动态函数,动态函数必须用Function对象来定义(Functionjavascript中的一个对象,是固定不变的,规定Function对象的"F"必须大写,当是function的时候,我们知道是定义函数的时候所使用的一个关键字:function funName(xy),当是Function的时候(F大写的时候),我们知道是javascript中的对象)创建动态函数的基本格式:var变量名 = new Function("参数1""参数2""参数n""执行语句");使用new关键字(newjavascript中一个关键字,也是固定的,我们在定义动态函数的时候必须要使用new来创建这个Function对象),我们先定义一个变量: var 变量名,在这里,变量名是随便的,然后我们再使用new关键字创建一个Function对象,然后再把这个对象赋值给这个任意的变量,Function后面的括号里先是传递给函数的参数,然后用一个逗号(,)隔开然后是这个函数要执行的功能的代码。

  6. 匿名函数:alert(function(i1,i2) { return i1 + i2; }(10,10));直接声明一个匿名函数,立即使用。用匿名函数的好处就是省得定义一个用一次就不用的函数,而且免了命名冲突的问题,js中没有命名空间的概念,因此很容易函数名字冲突,一旦命名冲突以最后声明的为准。

  7. JavaScript不支持函数重载:JavaScript没有方法重载的说法,如果两个方法名字一样,即使参数个数不一样,那么后面定义的就会覆盖前面定义,调用方法时永远是调用后定义的那个。JS引擎调用一个函数时,是根据函数名来调用的,如果有多个函数名相同的函数,那么JS引擎则只认最后定义的那个,调用时以最后定义的那个函数为准!JS的函数没有专门的函数默认值的语法,但是可以不给参数传值,不传值的参数值就是undefined


三:数组


  1. 常规方式声明:

    1.1var arrName = new Array();//创建一个数组

    1.2var arrName = new Array([size]); //创建一个数组并指定长度,注意不是上限,是长度

    1.3var arrName =new Array("孤傲苍狼","白虎神皇","灭世魔尊");//创建一个数组,并初始化数组的内容注意:虽然var arrName = new Array([size]);指定了长度,但实际上所有情况下数组都是变长的,也就是说即使指定了长度为2,仍然可以将元素存储在规定长度以外的,注意:这时长度会随之改变。Array的简化声明1、普通数组初始化:var arr = [3, 5, 6, 8, 9];

    1.4、常用函数:

    JS中的数组提供了四个操作:


  • shift:从集合中把第一个元素删除,并返回这个元素的值。

  • unshift: 在集合开头添加一个或更多元素,并返回新的长度。

  • push:在集合中添加元素,并返回新的长度。

  • pop:从集合中把最后一个元素删除,并返回这个元素的值。

  • javascript splice()

    1.删除-用于删除元素,两个参数,第一个参数(要删除第一项的位置),第二个参数(要删除的项数)。

    2.插入-向数组指定位置插入任意项元素。三个参数,第一个参数(其实位置),第二个参数(0),第三个参数(插入的项)。

    3.替换-向数组指定位置插入任意项元素,同时删除任意数量的项,三个参数。第一个参数(起始位置),第二个参数(删除的项数),第三个参数(插入任意数量的项)。

  • concat()连接两个或多个数组,并返回结果,但是值得注意的是该方法并不改变数组本身,而仅仅返回一个数组连接的副本。

  • reverse()倒序函数,其中是对数组元素进行倒序并返回倒序后的数组。

  • join()将数组放在一个字符串中,并以某种分割符进行分割。

  • valueOf()返回数组对象的原始值。


四:this


  1. js中定义类时使用this.属性名定义的属性就是类的公共属性,是可以被外界访问的。

  2. this不能在类定义的外部使用,只能在类定义的内部使用。

  3. 哪个对象调用this所在的函数,那么this代表的就是哪个对象实例。


五:object的主要方法:


  • hasOwnProperty(propertyName):判断对象是否有某个特定的属性。必须用字符串指定该属性,例如,obj.hasOwnProperty("name"),返回布尔值。此方法无法检查该对象的原型链中是否具有该属性;该属性必须是对象本身的一个成员。

  • isPrototypeOf(object):判断该对象是否为另一个对象的原型。obj1.isPrototypeOf(obj2);obj1一个对象的实例;obj2是另一个将要检查其原型链的对象。原型链可以用来在同一个对象类型的不同实例之间共享功能。如果obj2的原型链中包含 obj1,那么isPrototypeOf方法返回 true。如果obj2不是一个对象或者obj1没有出现在obj2中的原型链中,isPrototypeOf方法将返回 false

  • propertyIsEnumerable(propertyName)通过这个方法我们可以检测出这个对象成员是否是可遍历的,如果是可遍历出来的,证明这个对象就是可以利用for in循环进行遍历的,格式如下:obj.propertyIsEnumerable(propertyName),如果 propertyName存在于 obj中且可以使用一个 ForIn循环穷举出来,那么propertyIsEnumerable属性返回 true。如果 object不具有所指定的属性或者所指定的属性不是可列举的,那么 propertyIsEnumerable属性返回 false。典型地,预定义的属性不是可列举的,而用户定义的属性总是可列举的。

  • in运算符可以用来判断,某个实例是否含有某个属性,不管是不是本地属性。alert("name"in cat1);// true


六:编写JavaScript


  • 构造函数方式:这种方式的优点是:可以根据参数来构造不同的对象实例,每个对象的属性一般是不相同的,缺点是构造每个实例对象时,方法不能共享,Person类里面定义的那些方法,p1对象有一份,p2也有一份,那么在内存中就得开辟两块内存空间来分别存储p1的方法和p2的方法,这样就造成了内存的浪费。对于一个类的不同实例对象,这些对象的属性一般是不相同的,但是方法是相同的,所以节约内存的做法就是把方法放到内存的一块区域中存放,然后每个实例对象都从这块内存中取出方法。

  • 原型方式:原型方式的优点:所有对象实例都共享类中定义的方法,这样就没有造成内存浪费。缺点,第一,不能定义类的私有属性和私有方法,第二,给在创建对象,给对象的属性初始化时,需要额外写一个初始化对象的方法。

  • 构造函数加原型:第三种方式通过前两种方式的结合,算是达到了一个比较理想的写法了,可以通过传参构造对象实例,对象实例都共享同一份方法不造成内存浪费。第三种方式在开发中用得最多,我本人也是采用这种方式来编写JavaScript类。

  • 扩展JavaScript内置类,添加动态方法:JavaScript所有的类都可以使用prototype去扩展类的动态方法,当觉得类本身提供的方法和属性不满足实际应用需求时,就可以根据需要进行扩展,为类添加新的方法和属性,增强类的使用功能!使用这种方式给类添加的扩展方法都是动态的,动态方法是针对类的实例对象的,所以调用必须要用"对象.方法名"的形式去调用,不能用"类名.方法名"的形式去调用!

  • 扩展JavaScript内置类,添加静态方法:使用这种方式给类添加的扩展方法都是静态的,动态方法是针对类的实例对象的,所以调用必须要用"对象.方法名"的形式去调用,而静态方法是针对类的,用"类名.方法名"的形式去调用!


七:js闭包


  • 想要从外部读取局部变量可以通过在函数的内部在定义一个函数。

  • JavaScript中的函数名本身就是变量,所以函数也可以当作普通变量来使用。也就是说,不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的返回值返回。

  • 闭包的概念是JavaScript闭包就是在另一个作用域中保存了一份它从上一级函数或者作用域得到的变量,而这些变量是不会随上一级函数的执行完成而销毁。也就是说闭包是闭包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

  • 闭包的最大的用途有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。


八:JavaScript原型链



原创粉丝点击