当前位置: 代码迷 >> Web前端 >> 二、原始类型
  详细解决方案

二、原始类型

热度:214   发布时间:2012-10-28 09:54:44.0
2、原始类型

引用自:http://jiangzhengjun.iteye.com/blog/458868

  • ECMAScript 值

变量可以存在两种类型的值,即原始值和引用值。


原始值

存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。

引用值

存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存处。
?

在许多语言中,字符串都被看作引用类型,而非原始类型,因为字符串的长度是可变的。但JavaScript中去是原始类型。

?

如果一个值是引用类型的,那么它的存储空间将从堆中分配。由于引用值的大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址。地址的大小是固定的,所以把它存储在栈中对变量性能无任何负面影响。如下图所示:


  • ECMAScript 原始类型

ECMAScript 有 5 种原始类型(primitive type),即 Undefined、Null、Boolean、NumberString

typeof 运算符

var sTemp = "test string";
alert (typeof sTemp);??? //输出 "string"
alert (typeof 86);??? //输出 "number"

对变量或值调用 typeof 运算符将返回下列值之一:

  • undefined - 如果变量是 Undefined 类型
  • boolean - 如果变量是 Boolean 类型
  • number - 如果变量是 Number 类型
  • string - 如果变量是 String 类型
  • object - 如果变量是一种引用类型或 Null 类型或数组时

  • function - 如果变量是 Function 类型的,即函数

function test(param) {   
    alert(typeof param);//undefined    
    alert(typeof param == "undefined");//true    
    alert(param == undefined);//true    
    /* 虽然这里的param的值是undefined,但这里是可以与 !非运行一起运算的,  
    因为这里的param其实是已声明了的, 只要是已声明的变量是可以参加!运算的,  
    未声明的变量是 不能参加运算的。   
    */  
    if (!param) {   
        return 1;   
    } else {   
        return 2;   
    }   
}   
alert(!undefined);//true   
alert(test());//1    
alert(num + 1);//运行时报num未定义

?

为什么 typeof 运算符对于 null 值会返回 "Object"。这实际上是 JavaScript 最初实现中的一个错误,然后被 ECMAScript 沿用了。现在,null 被认为是对象的占位符,从而解释了这一矛盾,但从技术上来说,它仍然是原始值。

Undefined 类型

Undefined 类型只有一个值,即 undefined。当声明的变量未初始化时,该变量的默认值是 undefined。

没有初始值的变量,该变量将被赋予值 undefined,即 undefined 类型的字面量:

var oTemp;
alert(oTemp == undefined);

alert(typeof oTemp); //输出 "undefined"

?

注:值 undefined 并不同于未定义的值 。但是,typeof 运算符并不真正区分这两种值。考虑下面的代码:

var oTemp;
alert(typeof oTemp);? //输出 "undefined",即使声明过但为初始化时还是undefined
alert(typeof oTemp2);? //输出 "undefined",从未声明过的变量也是undefined

?

如果对 还未声明的变量使用除 typeof 之外的其他运算符的话,会引起错误,因为其他运算符只能用于已声明的变量上:

var oTemp;
alert(oTemp2 == undefined);

当函数无明确返回值时,返回的也是值 "undefined",如下所示:

?

?

undefined是全局对象(window)的一个特殊属性 ,其值是未定义的。但 typeof undefined 返回 'undefined' 。

虽然undefined是有特殊含义的,但它确实是一个属性,而且是全局对象(window)的属性。请看下面的代码:

?

alert('undefined'? in ?window);??? //输出:true
var ?anObj?=?{};
alert('undefined'?
in ?anObj);???? //输出:false

?

从中可以看出,undefined是window对象的一个属性,但却不是anObj对象的一个属性。

?

?

注意:尽管undefined是有特殊含义的属性,但却不是JavaScript的保留关键字。

undefined参与任何数值计算时,其结果一定是NaN。

随便说一下,NaN是全局对象(window)的另一个特殊属性,Infinity也是。这些特殊属性都不是JavaScript的保留关键字

Null 类型

?

?

null 是 JavaScript 保留关键字。

null 参与数值运算时其值会自动转换为 0 ,因此,下列表达式计算后会得到正确的数值:

    表达式:123 + null    结果值:123

    表达式:123 * null    结果值:0

Boolean 类型

它有两个值 true 和 false (即两个 Boolean 字面量)。即使 false 不等于 0,0 也可以在必要时被转换成 false,这样在 Boolean 语句中使用两者都是安全的。

Number 类型

这种类型既可以表示 32 位的整数,还可以表示 64 位的浮点数 。直接输入的(而不是从另一个变量访问的)任何数字都被看做 Number 类型的字面量。

var iNum = 86;

八进制数和十六进制数

var iNum = 070;? //070 等于十进制的 56

var iNum = 0x1f;? //0x1f 等于十进制的 31

var iNum = 0xAB; //0xAB 等于十进制的 171

注:尽管所有整数都可以表示为八进制或十六进制的字面量,但所有数学运算返回的都是十进制结果。

浮点数 ?

要定义浮点值,必须包括小数点和小数点后的一位数字(例如,用 1.0 而不是 1)。这被看作浮点数字面量。例如:

var fNum = 5.0;

对于浮点字面量的有趣之处在于,用它进行计算前,真正存储的是字符串

科学计数法

对于非常大或非常小的数,可以用科学计数法表示浮点数,可以把一个数表示为数字(包括十进制数字)加 e(或 E),后面加乘以 10 的倍数。例如:

var fNum = 5.618e7;

var fNum = 5.618e+7;

var fNum = 5.618e-7;

?

ECMAScript 默认把具有 6 个或 6 个以上前导 0 的浮点数转换成科学计数法 :

alert(0.000001); //弹出0.000001,因为前面只有五个零,所以原样显示
alert(0.0000001);//弹出1e-7,因为1前面有六个零,所以用科学计数法

?

十进制值最多可以有 17 个十进制位。17 位之后的值将被裁去,从而造成一些小的数学误差。
alert(0.123456789123456789123); //弹出0.12345678912345678 (此种情况下17后截断时不四舍五入?)
alert(0.00123456789123456789123); //弹出0.001234567891234568,
从小数点后连续的是最后一个零后面数字开始算起,最多保留17位小数
alert(123456789012345678912); //弹出123456789012345680000,17位后被截断(四舍五入 ),用零补齐
alert(1234567890123456789123); //弹出1.2345678901234568e21,17位后被截断,用零补齐,且超过21位用科学计数法表示

特殊的 Number 值

Number.MAX_VALUE 和 Number.MIN_VALUE,它们定义了 Number 值集合的外边界。所有 ECMAScript 数都必须在这两个值之间。不过计算生成的数值结果可以不落在这两个值之间。
当计算生成的数大于 Number.MAX_VALUE 时,它将被赋予值 Number.POSITIVE_INFINITY,意味着不再有数字值。同样,生成的数值小于 Number.MIN_VALUE 的计算也会被赋予值 Number.NEGATIVE_INFINITY,也意味着不再有数字值。如果计算返回的是无穷大值,那么生成的结果不能再用于其他计算。
构造函数 Number() 可以不与运算符 new 一起使用,而直接作为转化函数来使用。以这种方式调用 Number() 时,它会把自己的参数转化成一个数字,然后返回转换后的原始数值(或 NaN)。
Number有以下属性,这5 个常量是构造函数 Number() 自身的属性,而不是单独的某个 Number 对象的属性。

?

Number.MAX_VALUE??????????????? 可表示的最大的数。
Number.MIN_VALUE???????????????? 可表示的最小的数。
Number.NaN??????????????????????????? 非数字值。
Number.NEGATIVE_INFINITY?? 负无穷大,溢出时返回该值。
Number.POSITIVE_INFINITY??? 正无穷大,溢出时返回该值。
Infinity???????????????????????????????????? 代表正的无穷大的数值。(属于JavaScript全局属性)
NaN???????????????????????????????????????? 指示某个值是不是数字值。(属于JavaScript全局属性

?

isFinite() 方法,它是一个JavaScript全局函数,判断是否是有穷。

alert(Number.POSITIVE_INFINITY);//弹出: Infinity
alert(Number.NEGATIVE_INFINITY);//弹出: -Infinity
alert(Number.POSITIVE_INFINITY==Infinity);//弹出: ture
alert(Number.NEGATIVE_INFINITY==Infinity);//弹出: false
alert(Number.NEGATIVE_INFINITY==-Infinity);//弹出: true

alert(isFinite(Number.POSITIVE_INFINITY));//弹出: false
alert(isFinite(Number.NEGATIVE_INFINITY));//弹出: false
alert(isFinite(window.Infinity));//弹出: false
alert(isFinite(-window.Infinity));//弹出: false
alert(isFinite(-1));//弹出: true
alert(isFinite("a"));//弹出:false

?

最后一个特殊值是 NaN,表示非数(Not a Number)。

alert(NaN == NaN);? //输出 "false"

因为它与自身不相等, 判断某个数是否是数字,推荐用isNum() 方法,它是一个JavaScript全局函数。

alert(isNaN("blue"));? //输出 "true"
alert(isNaN("666"));? //输出 "false"

alert(isNaN("6664g"));? //输出 "true"

String 类型

是唯一没有固定大小的原始类型。组成Javascript字符串的字符都是Unicode 字符。

字符串字面量是由双引号(")或单引号(')声明的。而 Java 则是用双引号声明字符串,用单引号声明字符。但是由于 ECMAScript 没有字符类型,所以可使用这两种表示法中的任何一种。

\0nnn ??? 八进制代码 nnn(3位 ) 表示的字符(n 是 0 到 7 中的一个八进制数字)
\xnn ??? 十六进制代码 nn(2位 )? 表示的字符(n 是 0 到 F 中的一个十六进制数字)
\unnnn ??? 十六进制代码 nnnn(4位 )? 表示的 Unicode 字符(n 是 0 到 F 中的一个十六进制数字)

另一种只有一个值的类型是 Null,它只有一个专用值 null,即它的字面量。值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的

alert(null == undefined);? //输出 "true"


尽管这两个值相等,但它们的含义不同。undefined 是声明了变量但未对其初始化时赋予该变量的值,null 则用于表示尚未存在的对象

function testFunc() {
}
alert(testFunc() == undefined);? //输出 "true"

  相关解决方案