基本概念(3)
数据类型
5. Number类型
Number类型使用IEEE754格式来表示整数和浮点数值。除了以十进制(intNum)表示外,整数还可以通过八进制(octalNum)或十六进制(hexNum)的字面值来表示。八进制字面值的第一位必须是零,然后八进制序列(0~7)。如果字面值中的数值超出了范围,那么前导零将被忽略,后面的数值将被当做十进制数值解析。八进制字面量在严格模式下是无效的,会导致支持的JavaScript引擎抛出错误。十六进制字面值的前两位必须是0x,后面跟任何十六进制数字(0~9及A~F)。字母A~F不计大小写。
在进行算术计算时,所有以八进制和十六进制表示的数值最终都将被转换成十进制数值。
5.1 浮点数值
由于保存浮点数值需要的内存空间是保存整数值的两倍,因此ECMAScript会不失时机的将浮点数值转换为整数值。
对于那些极大或极小的数值,可以用e表示法(科学技术法)表示的浮点数值表示。用e表示法表示的数值等于e前面的数值乘以10的指数次幂。 ECMAScript中e表示法的格式也是如此。例如:
var floatNum = 3.125e7;//等于31250000
因为浮点数计算会产生舍入误差,因此永远不要测试某个特定的浮点数值。这是基于IEEE754的通病。
5.2 数值范围
ECMAScript能表示的最小数值保存在Number.MIN_VALUE中——在大多数浏览器中,这个值是5e-324;能够表示的最大数值保存在Number.MAX_VALUE中——在大多数浏览器中,这个值是1.7976931348623157e+308.如果某次计算的结果而到了一个超出JavaScript数值范围的值,那么这个数值将被自动转换成特殊的Infinity值。
要想确定一个数值是不是有穷的(是否位于最大值和最小值之间),可以使用isFinite()函数。
5.3 NaN
NaN即非数值是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。
它本身有两个特点:首先任何涉及NaN的操作(例如NaN/2)都会返回NaN,这个特点在多步计算中可能导致问题。其次NaN与任何值都不相等,包括它本身。
因此针对这两个特点,ECMAScript定义了isNaN()函数。这个函数接受一个参数,该参数可以是任何类型,而函数会帮我们确定这个参数是否“不是数值”。isNaN()在接收到一个值后会尝试将这个值转换为数值。而任何不能被转换为数值的值都会导致这个函数返回true。
alert (isNaN(NaN));//true alert (isNaN(10));//false alert (isNaN(true));//false
10是因为本身就是数值,而true可以转换成数值1,所以函数返回"false"。
5.4 数值转换
有3个函数可以把非数值转换成为数值:Number()、parseInt()、parseFloat()。第一个函数即转型函数Number()可以用于任何数据类型,而另两个函数则专门用于把字符串转换成数值。这3个函数对于同样的输入会有返回不同的结果。
Number()h函数的转换规则如下:
如果是Boolean值,true和false将分别被转换为1和0。如果是数字值则只是简单的传入和返回。如果是null值,则返回0。如果是undefined则返回NaN。如果是字符串则遵循这些规则:字符串中只包含数字则将其转换为十进制数值,前导零忽略。如果字符串中包含有效的浮点格式,则将其转换为对应的浮点数值。若是字符串中包含有效的十六进制格式则将其转换成相等大小的十进制数值。若字符串是空的,则转换为0。若是字符串包含除上述以外的字符则转换为NaN。
示例:
var num1 Number ("Hello world!");//NaN var num2 Number (" ");//0 var num3 Number ("0011");//11 var num4 Number ("true");//1
由于Number()函数在转换字符串时比较复杂而且不够合理,因此在处理整数时更常用的是parseInt()函数。parseInt()函数在转换字符串时,更多的是看其是否符合数值模式。它会忽略字符串前面的空格,直到找到第一个非空格字符。parseInt()转换空字符串会返回NaN,如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。如果字符串中的第一个字符是数字字符,parseInt()也能识别出各种整数格式。
例如:
var num1 = parseInt("123blue");//123 var num2 = parseInt(" ");//NaN var num3 = parseInt("0xA");//10(十六进制数) var num4 = parseInt("070");//56(八进制数) var num5 = parseInt("70");//70(十进制数)
因为在使用parseInt()解析八进制字面量的字符串时,ECMAScipt3和5存在分歧。为了消除两种分歧的困惑,可以为这个函数提供第二个函数:转换时使用的基数(多少进制)。
不指定基数意味着让parseInt()决定如何解析输入的字符串,因为为了避免错误的解析,所以最好无论在什么情况下都明确指定基数。多数情况下我们要解析的都是十进制数值,因此始终将10作为第二个参数是非常必要的。
与parseInt()函数类似,parseFloat()也是从第一个字符(位置0)开始解析每个字符。而也是一直解析到字符串末尾或者解析遇到一个无效的浮点数字字符为止。parseFloat()只解析十进制。
例如:
var num1 = parseFloat("123blue");//123 var num2 = parseFloat("0xA");//0 var num3 = parseFloat("22.34.2");//22.34 var num4 = parseFloat("0908.5");//908.5 var num5 = parseFloat("3.125e7");//31250000
6. String类型
6.1 字符字面量
String数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示打印字符或者 具有其他用途的字符。
\n 换行 \t 制表 \b空格 \r回车 \f进纸 \\ 斜杠 \' 单引号 \'' 双引号
\xnn (以十六进制代码nn表示一个字符,n为0~F)
\unnn(以十六进制代码nnn表示的一个Unicode字符,n为0~F)。
这些字符字面量可以出现字符串中的任意位置,而且也将被作为一个字符来解析。
6.2 字符串的特点
ECMAScript中的字符串是不可变的,字符串一旦创建它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量。
例如:
var lang = "Java"; lang = lang + "Script";
6.3 转换为字符串
要把一个值转换为一个字符串有两种方式。
第一种是使用几乎每个值都有的toString()方法。这个方法唯一要做的就是返回相应值的字符串表现。
var age = 11; var ageAaString = age.toString();//字符串"11" var found = true; var foundAsString = found.toString();//字符串"true"
数值、布尔值、对象和字符串值都有toString()方法,但null和undefined值没有这个方法。
多数情况下,调用toString()方法不必传递参数,但是在调用数值的toString()方法时,可以传递一个参数:输出数值的基数。
在不知道要转换的只是不是null和undefined的情况下,还可以使用转型函数String(),这个函数能够将任何类型的值转换为字符串。
String()函数遵循下列转换规则:如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果;如果值是null,则返回"null";如果值是undefined,则返回"undefined"。
例如:
var value1 = 10; var value2 = true; var value3 = null; var value4; alert (toString(value1));//"10" alert (toString(value2));//"true" alert (toString(value3));//"null" alert (toString(value4));//"undefined"
7. Object 类型
ECMAScript 中的对象其实就是一组数据和功能的集合。对象可以通过执行new操作符后跟要创建的对象类型的名称来创建。而创建Object类型的实例并为其添加属性和(或)方法,就可以创建自定义对象,如:
var o = new Object();
在ECMAScript中,Object类型是所有它的实例的基础。也就是Object类型所具有的任何属性和方法也同样存在于更具体的对象中。
Object的每个实例都具有这些属性和方法:
constructor:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数就是Object()。
hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中是否存在。其中作为参数的属性名(propertyName)必须以字符串形式指定(如:o.hasOwnProperty("name"))。
isPrototypeOf(object):用于检查传入的对象是否低传入对象的原型。
propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举。与hasOwnProperty()方法一样,作为参数的属性名必须以字符串形式指定。
toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。
toString():返回对象的字符串表示。
valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()方法返回值相同。
浙公网安备 33010602011771号