`

2、原始类型

阅读更多
  • 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",如下所示:

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

 

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,它只有一个专用值 null,即它的字面量。值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的

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


尽管这两个值相等,但它们的含义不同。undefined 是声明了变量但未对其初始化时赋予该变量的值,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 中的一个十六进制数字)

 

  • 大小: 3.7 KB
分享到:
评论

相关推荐

    Life:使用2D数据结构(数组)和原始类型模拟Conway的生命游戏

    生活 使用2D数据结构(数组)和原始类型模拟Conway的生命游戏

    JAVA程序员面试宝典

    原始类型封装类booleanBoolean charCharacter byteByte shortShort intInteger longLong floatFloat doubleDouble 引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和...

    JAVA实例原始文档

    JAVA实例教材原始文档: 第1章 幻灯片播放程序——布局 第2章 计算器程序——数据类型、运算符和表达式

    javascript原始类型转换

    let a = '5' + '2'; let b = '5' - '2'; console.log(a, b); //52 3 let a = '' - 1; let b = true + false; let c = null + 1; let d = undefined + 1; let e = [] + []; console.log(a, b, c, d, e) /...

    2数组.rar数组(array)是相同类型变量的集合,可以使用共同的名字引用它。数组可被定义为任何类型,可以是一维或多维。数组中的一个特别要素是通过下标来访问它。数组提供了一种将有联系的信息分组的便利方法。

    数组(array)是相同类型变量的集合,可以使用共同的名字引用它。数组可被定义为任何类型,可以是...2、数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。

    java笔试题大汇总

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    java考试题大总结

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    ByteMe:Java中原始类型集合的探索

    java泛型和原始类型不能很好地结合,因此类容器数据结构往往不支持原始类型(除非通过自动装箱的解决方法)。 我在这里试图回答的问题是,从后备存储的规范中完全分离集合接口可以获得多少里程。 特别是,是否有...

    上传功能修正已知安全bug(限制上传文件类型)2.自动生成缩略图(大小可在config.php中设置)3.多种排序方法4.限制原始图的大小和宽高

    上传功能修正已知安全bug(限制上传文件类型)2.自动生成缩略图(大小可在config.php中设置)3.多种排序方法4.限制原始图的大小和宽高

    java程序员面试技巧

    Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为 int提供的封装类。Java为每个原始类型提供了封装类。 原始类型封装类 booleanBoolean charCharacter byte...

    史上最全Java面试题目大集合

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    2-3-python编程基础知识-基本数据类型PPT课件.pptx

    以字母r或R引导的表示原始字符串 字节串 bytes b'hello world' 以字母b引导,可以使用单引号、双引号、三引号作为定界符 列表 list [1, 2, 3],['a', 'b', ['c', 2]] 所有元素放在一对方括号中,元素之间使用逗号...

    Java程序员面试宝典

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    Java2游戏编程.pdf

    2.2 比特和字节:原始的Java类型 2.2.1 基本的整数类型 2.2.2 浮点类型 2.2.3 Char类型 2.2.4 布尔型 2.2.5 String类型 2.2.6 强制转换变量类型 2.2.7 Java数据类型、数组和标识符需要记忆的要点 2.3 Java中的运算符...

    2. 基本数据类型1

    基本数据类型整数有符号rune类型为int32类型无符号byte类型为uint8类型,强调原始数据尽管Go提供了无符号整数,但是在绝大部分时刻,依然会选择使用有

    java面试笔试题大汇总

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    【JavaScript源代码】JavaScript高级程序设计之基本引用类型.docx

     目录 1、Date2、RegExp3、原始包装类型 1、Date 2、RegExp 3、原始包装类型 前言: 引用值(对象)都是某个特定的引用类型的实例对象,例如 Date类型、Function类型,RegExp 正则表达式类型等等。...

    C#与.NET技术平台实战演练.part2

    3使用名称空间的好处8-10-4名称空间存取控制8-11完全区别名称8-12使用using前置命令建立阶层式类结构8-13使用别名8-14使用命名空间的准则第9章参考类型变量9-1使用参考类型变量9-2参考类型与实值型9-2-1实值类型9-2-...

    原始音频pcm文件manman

    原始音频流文件pcm,适用于FFmpeg编码为其他格式的音频文件 字符类型:16 通道:2 采样率:44100

    重构 NSGA2,非支配排序遗传算法_C语言_代码_下载

    NSGA2Type类型已被定义为携带NSGA2算法的所有必要参数。这将减少外部变量的数量,并减少在另一个例程中使用时可能发生的冲突。 从 main() 函数中提取了三个函数,之前在nsga2r.c中。 ReadParamters:通过输入文件或...

Global site tag (gtag.js) - Google Analytics