日新网培训Javascript之三.Js核心语法及对象类型
一.JS变量
1、传值与传址 数字和布尔为值类型,复制、传参、比较均针对值。对象为地址类型,复制操作默认为浅度复制,仅仅将引用复制一份。传参则为传地址,比较对象时也是比较两者地址(是否为同一对象)。字符串为特殊类型,每次对字符串操作均会重新生成该串(在串本身不变的条件下,无法修改串中某字符),任何对其的修改都会重新生成值。复制和传参为传址,比较则为值比较。
2、变量的声明 用Var声明变量如果不给初值,值为undefined。Var声明的变量是永久性的,只可以在生命周期结束后被垃圾回收,而不可以用delete手动删除。用Var声明已存在变量则为赋值语句。如果尝试读一个未声明的变量的值,注意这里是“读”而不是“写”,会引发一个异常。如果给一个未用Var声明的变量赋值,则会隐式声明这个变量为全局变量(这里是“写”)。
3、变量作用域 JS中变量作用域分为全局和局部,对于全局变量不用解释,哪里都可以直接访问到。对于局部变量,需要特别说明一下,JS没有块级作用域,意思就是说,JS中的变量不会理会像If,While之后的“{}”,而只会理会function这种函数作用域。如果在一个函数块中,套用了n层的If,而在最内层的If中Var a;,那么容易在函数开头用alert(a);仍然不会报错,而结果是undefined。
4、JS垃圾收集 JS垃圾收集使用的也是引用记数方法,每增加一个引用记数+1,每取消一个引用-1,当引用为0时自动消毁对象释放空间。
5、变量与属性的区别 在一个对象内部定义的变量,就是属性。两者没有本质区别。
6、this的使用 在顶层代码中(在函数以外),用引用全局对象,全局对象JS解释器在程序开始时创建(执行JS之前),所有全局变量都为全局对象的属性。在方法函数代码块中,使用this可以引用“调用方法的对象”(有时可以理解为所属对象),例如在A对象中的B()方法,在B中的实现可以用this来指代A对象,这种情况仅仅出现在某对象的方法中,如果某函数不是某对象的方法,而仅仅是个普通函数,那么在其内使用this会引用全局对象。其实简单的区别函数和方法,函数没有上面的对象,而方法是要通过对象调用的。而且两者声明也不一样。
7、作用域链 函数或方法中引用一个变量时,会寻着作用域链的顺序许怒找变量的定义,作用域链的最后一个节点是全局变量,如果全局没有并且是读操作,则报错。作用域链的顺序,对于嵌套函数来说,是从内到外的。
二、表达式和运算符
1、相等运算符(==)与等同运算符(===) ==采用比较宽松的比较,允许进行类型转换。而===不允许,直接检测两个运算数是否相等。对角基本类型时使用值比较,比较引用类型时使用引用比较(对象、数组、函数只有是同一个对象时才想等)。特别的就是null和undefined相等,但不等同。
2、比较运算符 大于 小于 大于等于 小于等于 这四类比较运算符只可以在数字和字符串上执行。数字比较不用说,字符串比较则逐个字符的Unicode,如果两者混合,则系统尽力转换成数字比较,如果转换不成数字,则返回FALSE。对象之间比较,如果可以转换,会优先转数字,之后String。如果两个运算数转不成String或数字,则返回FALSE。
3、in运算符 in要求左边是个字符串,右边是一个对象或数组。如果左边的字符串是右边的一个属性名,则返回TRUE,反之FALSE。
4、instanceof运算符 左边是一个对象,右边是对象类型。如果左边的对象是右边的实例,则返回T,否则F。
5、逻辑运算符 &&和|| 特性:如果A&&B,A可以“转为”F,则B不会计算,返回A的值。如果A可以“转为”T,会计算B的值,如果B为值。同理,||为或运算符,在A||B中,如果A的值可以“转为”T,则不计算后面的值,返回A。如果A的值“转为”F,则计算B,并返回B。这个特性可以用来改写if语句:if(a==b) stop();改写为(a==b)&&stop();
6、位运算符 这个应用比较少,如果需要了解,去Google下,不再详细总结。但要知道移1位就是乘2或除2。
7、=赋值运算符 只有一点需要说,表达式(A=B)的值为B。即返回=号右边的值。
8、typeof 对变量使用,返回一个代表变量类型名的字符串。同时,typeof也可以做为函数使用,参数为变量。
9、new运算符与delete运算符 new 构造函数可以返回一个对象。 delete用于删除指定对象的属性、数组元素或变量。如果删除成功,返回T,如果运算数不能删除(Var声明的不能删除,系统核心属性和浏览器属性不能删除)则返回F。注意的是,如果delete删除的是一个不存在的属性,则返回T。如果delete后面的运算数不是属性、数组或变量时,它仅仅返回true。另外,delete只影响属性值,不会影响被这些属性引用的对象,即只取消引用,跟删除对象一点关系没有,当对象的引用记数为0时,垃圾回收自动删除对象,这与delete没有关系。
10、void运算符 void A; 则会计算A的值,但整个表达式只会返回undefined,作用以后讲客户端应用时会讲,同时,这个也可以用来求undefined。
11、逗号运算符 A,B,C 会按顺序计算A、B、C的值,整个表达式返回C的值。
12、[]可以用来存取数组和对象成员。