书中第3章 基本概念摘要(一) java
3.3 变量
使用var操做符定义的变量将成为定义该变量的做用域中的局部变量。也就是说,若是在函数中使用var定义一个变量,那么这个变量在函数退出后就会被销毁,例如:
function test(){
var message = "hi";
}
test();
alert(message);//出错,undefined
所以能够省略var操做符,从而建立一个全局变量:
function test(){
message = "hi";
}
test();
alert(message);//"hi"
虽然省略var操做符能够定义全局变量,但这也不是推荐作法,由于在局部做用域中定义的全局变量很难维护,并且若是有意地忽略了var操做符,也会因为相应变量不会立刻就有定义而致使没必要要的混乱。
3.4 数据类型
ECMAScript中有5种简单数据类型(也称为基本数据类型):Undefined、Null、Boolean、Number和String。还有一种复杂数据类型——Object,Object本质上是由一组无序的名值对组成的。
3.4.1 typeof 操做符
typeof用于检测给定变量的数据类型,对一个值使用typeof操做符可能返回下列某个字符串:
"undefined"——若是这个值未定义;
"boolean"——若是这个值是布尔值;
"string"——若是这个值是字符串;
"number"——若是这个值是数值;
"object"——若是这个值是对象或null;
"function"——若是这个值是函数;
使用typeof操做符的例子:
var message = "some string";
alert(typeof message); //"string"
alert(typeof(message)); //"string"
alert(typeof 95); //"number"
这几个例子说明,typeof操做符的操做数能够是变量(message),也能够是数值字面量。注意,typeof是一个操做符而不是函数,所以例子中的圆括号不是必需的(尽管可使用)。
从技术上讲,函数在ECMAScript中是对象,不是一种数据类型。然而,函数也确实有一些特殊属性,所以经过typeof操做符来区分函数和其余对象是必要的。
3.4.2 Undefined 类型
Undefined类型只有一个值,即特殊的undefined。在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined,例如:
var message;
alert(message == undefined); //true
var message = undefined;
alert(message == undefined); //true
通常而言,不存在须要显示地把一个变量设置为undefined值的状况。字面值undefined的主要目的是用于比较区分空对象指针与未经初始化的变量。
var message; //这个变量声明以后默认取得了 undefined 值
// 下面这个变量并无声明
// var age
alert(message); //"undefined"
alert(age); //产生错误
对于还没有声明的变量,只能执行一项操做,即便用typeof操做符检测其数据类型。
然而,使人困惑的是,对未初始化的变量执行typeof操做符返回 undefined 值,而对未声明的变量执行typeof 操做符一样也会返回undefined值。例如:
var message; //这个变量声明以后默认取得了 undefined 值
// 下面这个变量并无声明
// var age
alert(typeof message); //"undefined"
alert(typeof age); //"undefined"
3.4.3 Null类型
Null类型是第二个只有一个值的数据类型,这个特殊的值是null。从逻辑角度来看,null值表示一个空对象指针,而这也正是使用typeof操做符检测null值时会返回"object"的缘由,以下面的例子所示:
var car = null;
alert(typeof car); //"object"
undefined值是派生自null值,所以ECMA-262规定对它们的相等性测试要返回true;
alert(null == undefined); //true
3.4.4 Boolean类型
Boolean类型是ECMAScript中使用得最多的一种类型,该类型只有两个字面值,true和false。这两个值与数字值很多一回事,所以true不必定等于1,而false也不必定等于0。Boolean类型的字面值true和false是区分大小写的。也就是说,True和False(以及其余的混合大小写形式)都不是Boolean值,只是标识符。
虽然Boolean类型的字面值只有两个,但ECMAScript中全部类型的值都有与这两个Boolean值等价的值。要将一个值转换为其对应的Boolean值,能够调用转型函数Boolean(),以下例所示:
var message = "Hello World!";
var messageAsBoolean = Boolean(message);
在这个例子中,字符串message被转换成了一个Boolean值,该值被保存在messageAsBoolean变量中。对任何数据类型的值调用Boolean()函数,总会返回一个Boolean值。
下表给出了各类数据类型及其对应的转换规则:
var message = "Hello World!";
if(message){
alert("Value is true");
}
运行这个示例,就会显示一个警告框,由于字符串message被自动转换成了对应的Boolean值(true)。
3.4.5 Number类型
十进制整数:
var intNum = 55; //整数
八进制字面值的第一位必须是零(0),而后是八进制数字序列(0~7)。若是字面值中的数值超出了范围,那么前导零将被忽略,后面的数值将被看成十进制数值解析。
var octalNum1 = 070; //八进制的56
var octalNum2 = 079; //无效的八进制数值——解析为79
var octalNum3 = 08; //无效的八进制数值——解析为8
十六进制字面值的前两位必须是0x,后面任何十六进制数字(0~9及A~F)。其中,字母A~F能够大写,也能够小写。
var hexNum1 = 0xA; //十六进制的10
var hexNum2 = 0x1f; //十六进制的31
虽然数值能够用八进制或十六进制来表示,但在进行算术计算时,全部以八进制和十六进制表示的数值最终都将被转换成十进制数值。
1.浮点数值
var floatNum1 = 1.1;
var floatNum2 = 0.1;
var floatNum3 = .1; //有效,但不推荐
var floatNum1 = 1.; //小数点后面没有数字——解析为1
var floatNum2 = 10.0; //整数——解析为10
var floatNum1 = 3.125e7; //等于3125000
var floatNum2 = 0.0000003; //等于3e-7
浮点数值的最高精度是17位小数,但在进行算术时其精度远远不如整数。例如,0.1加0.2的结果不是0.3,而是0.30000000000000004。这个小小的舍入偏差会致使没法测试特定的浮点数值。
例如:
if(a + b == 0.3){ //不要作这样的测试
alert("You got 0.3.");
}
2.数值范围
ECMAScript可以表示的最小数值保存在Number.MIN_MALUE中——在大多数浏览器中,这个值是5e-324;可以表示的最大数值保存在Number.MAX_VALUE中——在大多数浏览器中,这个值是1.7976931348623157e+308。
若是某次计算的结果获得了一个超出JavaScript数值范围的值,那么这个数值将被自动转换成特殊的Infinity值。具体来讲,若是这个数值是负数,则会被转换成-Infinity(负无穷),若是这个数值是正数,则会被转换成Infinity(正无穷)。Infinity不能参与计算,要想肯定一个数值是否是有穷的(是否是位于最小和最大的数值之间),可使用isFinite()函数。这个函数在参数位于最小与最大数值之间时会返回true,以下面的例子所示:
var result = Number.MAX_VALUE + Number.MAX_VALUE;
alert(isFinite(result)); //false
访问Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINITY也能够获得正和负Infinity的值。这两个属性中分别保存着-Infinity和Infinity。
3.NaN
NaN,即非数值(Not a Number),表示一个原本要返回数值的操做数返回数值的状况(这样就不会抛出错误了)。
NaN有两个非同寻常的特色。首先,任何涉及NaN的操做(例如NaN/10)都会返回NaN。其次,NaN与任何值都不相等,包括NaN自己。
alert(NaN == NaN); //false
isNaN()函数:isNaN()能够用于肯定传入参数是否"不是数值",isNaN()在接收到一个值以后,会尝试将这个值转换为数值。
alert(isNaN(NaN)); //true
alert(isNaN(10)); //false(10是一个数值)
alert(isNaN("10")); //false(能够被转换成数值10)
alert(isNaN("blue")); //true(不能转换成数值)
alert(isNaN(true)); //false(能够被转换成数值1)
4.数值转换
有三个函数能够把非数值转换为数值:Number()函数,能够用于任何数据类型,parseInt()和parseFloat()专门用于把字符串转换成数值。
Number()函数转换规则:
若是是Boolean值,true和false分别被转换为1和0;
若是是数字值,只是简单的传入和返回;
若是是null值,返回0;
若是是undefined,返回NaN;
若是是字符串,遵循下列规则:
若是字符串只包含数字,则将其转换为十进制数值,即"1"变成1,"011"变成11(忽略前导零)
若是字符串包含有效的浮点格式,则将其转换为浮点数值,即"1.1"变成1.1(忽略前导零)
若是字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整数值;
若是字符串是空的(不包含任何字符),则将其转换为0;
若是字符串中包含上述格式以外的字符,则将其转换为NaN。
若是是对象,则调用对象的valueOf()方法,而后依照前面的规则转换返回的值。若是转换的结果是NaN,则调用对象的toString()方法,而后再次依照前面的规则转换返回的字符串值。
var num1 = Number("Hello world!"); //NaN
var num1 = Number(""); //0
var num1 = Number("000011"); //11
var num1 = Number("true"); //1
parseInt()函数在转换字符串时,更多的是看其是否符合数值模式。它会忽略字符串前面的空格,直至找到一个非空字符。若是第一个字符不是数字字符或负号,parseInt()就会返回NaN;用parseInt()转换空字符串会返回NaN(Number()对空字符返回0)。若是第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完全部后续字符或者遇到了一个非数字字符。例如"12ab"会被转换为12,"22.5"会被转换为"22"。若是字符串以"0x"开头且后跟数字字符,就会将其当作一个十六进制整数;若是字符串以"0"开头且后跟数字字符,则会将其看成一个八进制数来解析。
var num1 = parseInt("1234blue"); //1234
var num2 = parseInt(""); //NaN
var num3 = parseInt("0xA"); //10(十六进制数)
var num4 = parseInt("22.5"); //22
var num5 = parseInt("070"); //56(八进制数)
var num6 = parseInt("70"); //70(十进制数)
var num7 = parseInt("0xf"); //15(十六进制数)
需注意parseInt()解析"070"和"70"的不一样方式。为了消除这种困惑,能够在parseInt()函数中加入第二个参数,转换时使用的基数(即多少进制)。
var num = parseInt("0xAF", 16); //175
若是指定了16做为第二个参数,字符串能够不带前面的"0x",以下所示:
var num1 = parseInt("AF", 16); //175
var num2 = parseInt("AF"); //NaN,此时没有加传入的基数,转换失败
指定基数会影响到转换的输出结果,因为平时使用时都是转换10进制数,因此建议使用时都加上基数10。
var num1 = parseInt("10", 2); //2(按二进制解析)
var num2 = parseInt("10", 8); //8(按八进制解析)
var num1 = parseInt("10", 10); //10(按十进制解析)
var num1 = parseInt("10", 16); //16(按十六进制解析)
var num1 = parseInt("010"); //8(按八进制解析)
var num2 = parseInt("010", 8); //8(按八进制解析)
var num1 = parseInt("010", 10); //10(按十进制解析)
parseFloat()与parseInt()相似,但字符串中的第一个小数点是有效的,而第二个小数点就是无效的了,所以它后面的字符串将被忽略,例如,"22.34.5"被转换为"22.34"。除此以外,parseFloat()始终都会忽略前导的零。parseFloat()能够识别前面讨论过的全部浮点数值格式,也包括十进制整数格式。但十六进制格式的字符串则始终会被转换成0.因为parseFloat()只解析十进制值,所以它没有用第二个参数指定基数的用法。
var num1 = parseFloat("1234blue"); //1234(整数)
var num2 = parseFloat("0xA"); //0
var num3 = parseFloat("22.5"); //22.5
var num4 = parseFloat("22.34.5"); //22.34
var num5 = parseFloat("0908.5"); //908.5
var num6 = parseFloat("2.125e7"); //21250000
var num7 = parseFloat("22.0"); //22(整数)
3.4.6 String类型
String类型表示由零或多个16位Unicode字符组成的字符序列,即字符串,能够由双引号(")或单引号(')表示。
1.字符字面量
String数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符,或者具备其余用途的字符。
3.转换为字符串
使用toString()方法,可是null和undefined值没有这个方法
var age = 11;
var ageAsString = age.toString(); //字符串"11"
var found = true;
var foundAsString = found.toString(); //字符串"true"
数值类型带参数toString(),参数为转换时使用的基数
var num = 10;
alert(num.toString()); //"10"
alert(num.toString(2)); //"1010"
alert(num.toString(8)); //"12"
alert(num.toString(10)); //"10"
alert(num.toString(16)); //"a"
在不知道要转换的值是否是null或undefined的状况下,还可使用转换函数String(),String()函数遵循下列的转换规则:
若是值有toString()方法,则调用该方法(没有参数)并返回相应的结果;
若是值是null,返回"null";
若是值是undefined,返回"undefined"
3.4.7 Object类型
ECMAScript中的对象其实就是一组数据和功能的集合。对象能够经过执行new操做符后跟要建立的对象类型的名称来建立。而建立object类型的实例并为其添加属性和(或)方法,就能够建立自定义对象。(就像Java中的java.lang.Object对象同样)Object类型是全部它的实例的基础,它所具备的任何属性和方法也一样存在于更具体的对象中。
Object的每一个实例都具备下列属性和方法:
constructor——保存着用于建立当前对象的函数; hasOwnProperty(propertyName)——用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,做为参数的属性名(propertyName)必须以字符串形式指定(例如:o.hasOwnProperty("name"));
isPrototypeOf(object)——用于检查传入的对象是不是另外一个对象的原型;
propertyIsEnumerable(propertyName)——用于检查给定的属性是否可以使用 for-in 语句来枚举。参数的属性名必须以字符串形式指定;
toString()——返回对象的字符串表示;
valueOf()——返回对象的字符串、数值或布尔值表示。一般与toString()方法返回值相同。
IE的JavaScript实如今对象方面稍有不一样。在IE中,只有开发人员定义的对象才继承自Object。并且,全部BOM和DOM对象也与这里介绍的不一样,可能不会具备object的全部属性和方法。 浏览器
以上全部内容均摘自图书《JavaScript 高级程序设计(第2版)》[美] Nicholas C.Zakas 著 李松峰 曹力 译 函数