数据类型
JavaScript有六种数据类型,包括五种基本数据类型(Number、String、Boolean、Undefined、Null),和一种复杂数据类型(Object)也称引用类型。基本类型的数据是存放在栈内存中的,而引用类型的数据是存放在堆内存中的。
Number类型
JavaScript中只有一个数字类型。他在内部被表示为64位的浮点数,和Java的double数字类型一样。和其他大多数编程语言不通的是,他没有分离出整数类型,所以1和1.0的值相同。对于浮点字面量的有趣之处是用它进行计算之前,真正存储的是字符串。
八进制和十六进制
整数也可以被表示为八进制或十六进制的字面量。八进制字面量的首数字必须是0,气候数字是任何八进制数字(0-7),如下面的代码所示:
var iNum = 070; //070等于十进制的 56
十六进制的字面量首位数字必须是0,后面接字母x,然后是任意的十六进制数字(0到9和A到F)。这些字母可以是大写的也可以是小写的。例如:
var iNum = 0x1f; //0x1f 等于十进制的 31
var iNum = 0xAB; //0xAB 等于十进制的 171
注意: 尽管所有整数都可以表示为八进制或十六进制的字面量,但是所有运算返回的都是十进制结果。
科学计数法
对于非常大或非常小的数,可以用科学计数法表示浮点数,可以吧一个数表示为数字(包括十进制数)加e(或E),后面加乘以10的倍数,例如:
var fNum = 5.618e7
该变量表示的数是56180000。把科学计数法转化成计算式(5.618 x 10^7)就可以得到该值。
特殊的number值
有几种特殊的值也被定义成Number类型。前两个是Number.MAX_VALUE
和 Number.MIN_VALUE
,它们定义了 Number 值集合的外边界。事实上,有专门的值表示无穷大,(如你猜到的)即 Infinity
。Number.POSITIVE_INFINITY
的值为 Infinity
。Number.NEGATIVE_INFINITY
的值为-Infinity
。
对任何数调用 isFinite()
方法,以确保该数不是无穷大。
最后一个是NaN,表示非数(not a number)。一般来说这种情况发生在类型转换失败时。比如要把单词blue转换成数值就会失败。重要的一点,NaN与自身不相等。
alert(NaN == NaN); //输出 "false"
可以使用isNaN()来进行判断
alert(isNaN("blue")); //输出 "true"
alert(isNaN("666")); //输出 "false"
String类型
String类型字面量有双引号或单引号声明。而Java则是用双引号声明字符串,用单引号声明字符。
字符串中每个字符都有特定的位置,首字符从位置0开始,第二个字符在位置1,依此类推。
Boolean类型
Boolean 类型是 ECMAScript 中最常用的类型之一。它有两个值 true 和 false (即两个 Boolean 字面量)。
即使 false 不等于 0,0 也可以在必要时被转换成 false,这样在 Boolean 语句中使用两者都是安全的。
Undefined类型
Undefined 类型只有一个值,即 undefined。当声明的变量未初始化时,该变量的默认值是 undefined。
var oTemp;
前面一行代码声明变量 oTemp,没有初始值。该变量将被赋予值 undefined,即 undefined 类型的字面量。可以用下面的代码段测试该变量的值是否等于 undefined:
var oTemp;
alert(oTemp == undefined);
这段代码将显示 "true",说明这两个值确实相等。还可以用 typeof 运算符显示该变量的值是 undefined:
var oTemp;
alert(typeof oTemp); //输出 "undefined"
提示:值 undefined 并不同于未定义的值。但是,typeof 运算符并不真正区分这两种值。考虑下面的代码:
var oTemp;
alert(typeof oTemp); //输出 "undefined"
alert(typeof oTemp2); //输出 "undefined"
前面的代码对两个变量输出的都是 "undefined",即使只有变量 oTemp2 从未被声明过。如果对 oTemp2 使用除 typeof 之外的其他运算符的话,会引起错误,因为其他运算符只能用于已声明的变量上。
例如,下面的代码将引发错误:
var oTemp;
alert(oTemp2 == undefined);
当函数无明确返回值时,返回的也是值 "undefined",如下所示:
function testFunc() {
}
alert(testFunc() == undefined); //输出 "true"
Null类型
null类型被看做空对象指针。它只有一个专用值 null,即它的字面量。值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的。
alert(null == undefined); //输出 "true"
尽管这两个值相等,但它们的含义不同。undefined是声明了变量但未对其初始化赋予改变量的值,null则用于表示尚未存在的对象。如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是null。
typeof 运算符
typeof 运算符有一个参数,即要检查的变量或值。例如:
var sTemp = "test string";
alert (typeof sTemp); //输出 "string"
alert (typeof 86); //输出 "number"
对变量或值调用 typeof 运算符将返回下列值之一:
- undefined - 如果变量是 Undefined 类型的
- boolean - 如果变量是 Boolean 类型的
- number - 如果变量是 Number 类型的
- string - 如果变量是 String 类型的
- object - 如果变量是一种引用类型或 Null 类型的
Object类型
除了字符串、数字、true、false、null和undefined之外,javascript中的值都是对象。js中对象是一组属性与方法的集合。这里就要说到引用类型了,引用类型是一种数据结构,用于将数据和功能组织在一起。引用类型有时候也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法。
三大引用类型
1.Object类型
我们看到的大多数类型值都是Object类型的实例,创建Object实例的方式有两种。
第一种是使用new操作符后跟Object构造函数,如下所示
var person = new Object();
person.name = "Micheal";
person.age = 24;
第二种方式是使用对象字面量表示法,如下所示
var person = {
name : "Micheal",
age : 24
};
2.Array类型
数组的每一项可以用来保存任何类型的数据,也就是说,可以用数组的第一个位置来保存字符串,第二个位置保存数值,第三个位置保存对象....另外,数组的大小是可以动态调整的。
创建数组的基本方式有两种
第一种是使用Array构造函数,如下所示
var colors = new Array("red","blue","yellow");
第二种是使用数组字面量表示法,如下所示
var colors = ["red","blue","yellow"];
3. Function类型
每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。函数通常是使用函数声明语法定义的,如下所示
function sum(num1,num2){
return num1 + num2;
};
这和使用函数表达式定义函数的方式相差无几。
var sun = function (){
return sum1 + sum2;
};
也就是说,JavaScript按照存储方式分为基本类型(值类型)和引用类型。那么他们的计算有什么区别呢?
题目1:
var a = 1;
var b = a;
基本类型的复制就是在栈内存中开辟出了一个新的存储区域用来存储新的变量,这个变量有它自己的值,只不过和前面的值一样,所以如果其中一个的值改变,则不会影响到另一个。
题目2:
var object1 = new Object();
var object2 = object1;
定义了一个对象其实是在栈内存中存储了一个指针,这个指针指向堆内存中该对象的存储地址。复制给另一个对象的过程其实是把该对象的地址复制给了另一个对象变量,两个指针都指向同一个对象,所以若其中一个修改了,则另一个也会改变。
网友评论