对ECMAScript中数据类型、操作符、语句、函数、模仿重载等基本概念的总结——JS高程第3章知识总结

第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

2ECMAScript中最小值保存在Number.MIN_VALUE中,最大值在Number.MAX_VALUE中,超出范围会被转换成(±)InfinityisFinite()可用来测试是否在最小值与最大值之间。

3NaN,非数值,用来表示一个本来要返回一个数值的操作数未返回数值的情况。任何涉及NaN的操作都会返回NaNNaN与任何值都不相等,包括自己。可用isNaN()检测一个值是否为非数值。注意Boolean型与“10”这种字符串会返回false

4、数值转换

Number()
·truefalse分别返回10null返回0undefined返回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()

nullundefined没有这个方法;调用这个方法不必传递参数,但是调用数值的toString()方法时,可以传入一个表示多少进制的参数。

·String()

不接受参数,null返回“null”,undefined返回“undefined”。

·加号操作符与一个字符串(“”)加在一起。

3.3.3 Object类型

ECMAScript中的对象就是一组数据和功能的集合,Object类型是所有它的实例的基础,它所具有的任何方法和属性也同样存在于更具体的对象中。

Object的实例都具有下列属性和方法。

·constructor:保存着用于创建当前对象的函数。

·hasOwnPropertypropertyName:用于检查给定的属性在当前对象实例中是否存在,参数以字符串形式指定。

·isPrototypeOfObject:用于检查传入对象是否为当前对象的原型。

·propertyIsEnumerablepropertyName:用于检查给定属性是否可用for-in语句来枚举,参数以字符串形式指定。

·toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区相对应。

·toString():返回对象的字符串表示,

·valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同。

注:ECMAScript-262中对象的行为不一定适用于JS中的其他对象。比如BOMDOM中的对象,因为它们是由宿主环境提供实现和定义的,可能会也可能不会继承ES中的Object

3.4 操作符

3.4.1 一元操作符

++--+-、四个一元操作符在涉及到非数值的操作数时,都会进行转换,就像调用Number()方法一样。

3.4.2 位操作符

位操作符用于最基本的层次上,即按内存中的位来操作数值。ES中所有数值都以IEEE-754 64位格式存储,但位操作符不直接操作64位的值。而是先将64位值转换为32位的整数,然后执行操作。最后再转换为64位。

对于有符号的整数,第32位用于表示符号,0表示整数,1表示负数。负数使用二进制补码格式存储,计算二进制补码的三个步骤:

·求出绝对值的二进制码;

·按位取反,0110

·得到的反码+1

NaNInfinity应用位操作时,会被当成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语句等循环语句配合使用,可由breakcontinue语句引用。

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






猜你喜欢

转载自blog.csdn.net/buhuo7493/article/details/80774605
今日推荐