第3章 基本概念
3.1 涉及的方法和属性概览
表1:方法和属性概览
对象名称 | 拥有的方法 | 拥有的属性 |
window | isFinite()、isNaN() Number()、parseInt()、parseFloat() toString()、String() | Number.MIN_VALUE Number.MAX_VALUE |
所有Object的实例 | hasOwnProperty(propName) isPrototypeOf(Object) propertyIsEnumerable(propName) toLocaleString()、toString() valueOf() | constructor |
arguments |
| length |
3.2 内容概述
如下思维导图所示:
图1 本章内容思维导图
3.3 数据类型
3.3.1 number的小知识点
1、不要测试某个特定的浮点数值,如0.1+0.2 != 0.3。
2、ECMAScript中最小值保存在Number.MIN_VALUE中,最大值在Number.MAX_VALUE中,超出范围会被转换成(±)Infinity;isFinite()可用来测试是否在最小值与最大值之间。
3、NaN,非数值,用来表示一个本来要返回一个数值的操作数未返回数值的情况。任何涉及NaN的操作都会返回NaN;NaN与任何值都不相等,包括自己。可用isNaN()检测一个值是否为非数值。注意Boolean型与“10”这种字符串会返回false。
4、数值转换
Number():
·true、false分别返回1、0;null返回0,undefined返回NaN;
·包含非数字(除空格)的字符串返回NaN,只包含数字的会忽略前导0,若有符合十六进制格式的返回十六进制数,空字符串返回0;
·对象先调用valueOf()方法,根据规则转换,若返回NaN,再用toString()方法返回的字符串进行转换。
parseInt():从第一个非空字符开始解析,并返回第一个符合数值模式的数值,若第一个非空字符不是数字或±号,返回NaN。空字符串返回NaN。推荐使用第二个参数指定转换进制。该方法与Number()方法不同之处在于不能转换false、true和null但是可以解析不是纯数字的字符串。如“ 55lyx”。
parseFloat():只转
严格模式下禁用with。大量使用with会导致性能下降,同时给代码造成调试困难。
换十进制数,与parseInt ()解析模式相同。3.3.2 string的小知识点
1、字符字面量
String数据类型包含一些特殊的字符字面量,也叫转义序列,用于打印非打印字符或者有其他通途的祖父。如下表所示:
表2 字符字面量
字面量 | 含义 |
\n | 换行 |
\t | 制表 |
\b | 退格 |
\r | 回车 |
\f | 进纸 |
\\ | 斜杠 |
\’ | 单引号 |
\” | 双引号 |
\xnn | 以十六进制代码nn表示的一个字符 |
\unnnn | 以十六进制代码nnnn表示的一个Unicode字符 |
2、字符串的特点
ECMAScript中的字符串一旦创建就不可改变,要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用包含新值的字符串填充该变量,这个过程是在后台发生的。
3、转换字符串
·toString()
null和undefined没有这个方法;调用这个方法不必传递参数,但是调用数值的toString()方法时,可以传入一个表示多少进制的参数。
·String()
不接受参数,null返回“null”,undefined返回“undefined”。
·加号操作符与一个字符串(“”)加在一起。
3.3.3 Object类型
ECMAScript中的对象就是一组数据和功能的集合,Object类型是所有它的实例的基础,它所具有的任何方法和属性也同样存在于更具体的对象中。
Object的实例都具有下列属性和方法。
·constructor:保存着用于创建当前对象的函数。
·hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中是否存在,参数以字符串形式指定。
·isPrototypeOf(Object):用于检查传入对象是否为当前对象的原型。
·propertyIsEnumerable(propertyName):用于检查给定属性是否可用for-in语句来枚举,参数以字符串形式指定。
·toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区相对应。
·toString():返回对象的字符串表示,
·valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同。
注:ECMAScript-262中对象的行为不一定适用于JS中的其他对象。比如BOM、DOM中的对象,因为它们是由宿主环境提供实现和定义的,可能会也可能不会继承ES中的Object。
3.4 操作符
3.4.1 一元操作符
++、--、+、-、四个一元操作符在涉及到非数值的操作数时,都会进行转换,就像调用Number()方法一样。
3.4.2 位操作符
位操作符用于最基本的层次上,即按内存中的位来操作数值。ES中所有数值都以IEEE-754 64位格式存储,但位操作符不直接操作64位的值。而是先将64位值转换为32位的整数,然后执行操作。最后再转换为64位。
对于有符号的整数,第32位用于表示符号,0表示整数,1表示负数。负数使用二进制补码格式存储,计算二进制补码的三个步骤:
·求出绝对值的二进制码;
·按位取反,0换1,1换0;
·得到的反码+1。
对NaN和Infinity应用位操作时,会被当成0处理,其他非数值应用位操作时,也会自动调用Number()进行转换,再应用位操作。
1、按位非(~)
本质就是操作数的负值-1,但是按位非是在数值表示的最底层执行操作,速度更快。
2、按位与(&)
将两个操作数每一位对齐,都为1时取1,其他都为0。
3、按位或(|)
将两个操作数每一位对齐,都为0时才取0,其他取1。
4、按位异或(^)
将两个操作数每一位对齐,相同取0,不同取1(对应位上只有一个1才取1)。
5、左移(<<)
符号位不动,每一位向左移动指定位数,用0填空位。
6、有符号的右移(>>)
符号位不动,每一位向右移动指定位数,用符号位填空位。
7、无符号右移(>>>)
将32位全向右移动指定位数,以0填空位。会将负数变为极大的正数。
3.4.3布尔操作符
逻辑非(!),逻辑与(&&)、逻辑或(||)。逻辑与和逻辑或都是短路操作符,只要一个操作数能决定结果,就返回该结果,不会对之后的操作数求值。另外只有当操作数都为布尔值时才一定返回布尔值,其他情况下,根据结果返回操作数本身。
3.4.4 乘性操作符
只要算不出来以及不是infinity就是NaN。
1、乘法:0*Infinity=NaN。
2、除法。
3、取模:无穷%有限=NaN;
3.4.5 关系操作符
操作规则:
·都是字符串,比较两个字符串对应的字符编码值(大写字母的字符编码<小写字母的字符编码);
·有一个为数字则都转换成数值比较,NaN既不>=谁,也不<=谁;
·若是对象则调用valueOf()方法,没有则用toString()方法。
3.5 语句
3.5.1 for-in语句
for-in语句是一种精准的迭代语句,可用来枚举对象的属性。语法:
for( property in expression ) statement;
3.5.2 label 语句
可以在代码中添加标签,以便将来使用。语法如下:
label : statement;
加标签的语句一般要与for语句等循环语句配合使用,可由break或continue语句引用。
eg:
var num = 0;
outermost:
for( var i=0 ; i<10 ; i++ ) {
for( var j=0 ; j<10 ; j++) {
if( i==5 && j==5) {
// break outermost;结束整个循环,结果为55
continue outermost;//调到顶层循环继续执行(也就是标签处),结果为95
}
num++;
}
}
alert(num);
with语句的作用时将代码的作用域设置到一个特定对象中,语法如下:
with ( expression ) statement。
定义with语句的目的主要是为了简化多次编写同一个对象的工作,如下面例子所示:
eg:
var qs = location.search.substring(1),
hostName = location.hostname,
url = location.href;
// 可简化为:
with ( location ) {
var qs1 = search.substring(1),
hostName1 = hostname,
url1 = href;
}
alert( url==url1 )//true
严格模式下禁用with。大量使用with会导致性能下降,同时给代码造成调试困难。
3.5.4 switch语句
switch语句可以使用任何数据类型;每个case的值不一定是常量,可以是变量或者表达式。switch比较时使用的是全等操作符,不会发生类型转换。
eg:
var m = 6,
n = 5;
switch( true ){
case m > n : alert('m>n');break;
case m < n : alert('m<n');break;
case m = n : alert('m=n');break;
default:alert(null);
}
3.6 函数
ES中函数在定义时不必指定是否返回值,任何函数在任何时候都可通过return来返回值。位于return语句后的代码不会执行。可以使用不带返回值的return语句,用来提前终止函数执行,且不需要返回值。
3.6.1 理解参数
ES中函数不会在意传递多少参数以及参数的类型,因为参数在内部是用与数组类似的arguments对象来表示的。函数接受到的始终都是这个对象,不会管里面是否有参数或者参数是什么类型。
函数体内可以通过[ ]语法来访问arguments中的参数,如arguments[1]。arguments对象可以与命名参数一起使用。非严格模式下,arguments参数与命名参数的值同步更新。严格模式下不允许通过arguments重写参数,更不可能同步更新。
使用length属性来确定参数个数,arguments对象的长度是由传入参数的个数决定的,而不是由定义函数时的命名参数个数决定。
3.6.2 没有重载
在ES中,如果定义了两个名字相同的函数,那只属于后定义的函数。可以通过检查传入参数的个数、类型等做出不同的反应,来模仿方法的重载。
eg:
function doAdd(){
switch ( arguments.length) {
case 1: alert( arguments[0] + 10 ); break;
case 2: alert( arguments[0] + arguments[1] ); break;
default: alert( '100' );
}
}
doAdd(); // 100
doAdd(10); // 20
doAdd(10,20); //30