`

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
分享到:
评论

相关推荐

    原始类型 包装类 原始类型所占的字节数

    "原始类型、包装类和原始类型所占的字节数" 原始类型(primitive type)是指 Java 中最基本的数据类型,它们是 Java 虚拟机(JVM)中所支持的基本类型。每种原始类型都对应着一个包装类(Wrapper Class),包装类是...

    JAVA原始类型和引用类型有哪些区别?[定义].pdf

    Java编程语言中有两种基本的数据类型:原始类型(Primitive Types)和引用类型(Reference Types),它们在行为、存储和使用上存在显著的区别。 1. **原始类型(Primitive Types)**: - Java的原始类型包括布尔型...

    java原始数据类型的包装类

    这些原始类型在处理数据时非常高效,但它们不具备对象的特性,例如方法调用。为了使原始类型能够参与面向对象的编程,Java设计了八种对应的包装类(Wrapper Classes):Byte、Short、Integer、Long、Float、Double、...

    java 原始数组类型的String形式

    当我们需要将这些原始类型的数组转换为字符串(String)形式时,通常是为了进行日志记录、输出展示或者与JSON等格式的数据交换。本篇文章将深入探讨如何将Java的原始数组类型转换为String形式,以及这个过程中的关键...

    db2 修改表数据类型

    2. **修改表数据类型**:指的是在不删除原有表的情况下,对表中某一列的数据类型进行变更的操作。 #### 标签中的知识点解析 - **DB2 数据类型**:DB2支持多种数据类型,包括数值型、字符型、日期时间型等。了解...

    JavaScript类型系统之基本数据类型与包装类型

    JavaScript是一种动态类型语言,它的类型系统包括两种主要的数据类型:基本数据类型(原始类型)和引用类型。基本数据类型包括Undefined、Null、Boolean、Number和String,它们在内存中的存储方式不同,对性能有着...

    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) /...

    asap2SetAddress.m

    此脚本可将从.elf或者.dwarf文件中提取地址,然后更新到A2L的对应位置,原始版权属于Mathwork % Examples: % 1) Using ELF file to update ECU addresses % >> rtw.asap2SetAddress('model.a2l', 'model.elf'); % % ...

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

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

    地震SEG2格式文件读写

    在这个过程中,需要注意保持数据的原始格式和精度,以及遵循SEG2标准中的对齐要求。 在实际开发中,可以使用现成的库,如libseg2或OpenSeg2,它们提供了方便的接口来处理SEG2文件。但理解底层的工作原理对于优化...

    hppc针对Java高性能原始集合

    2. **零装箱和拆箱**:由于只处理原始类型,避免了对象创建和引用的开销。 3. **高效算法**:在内部实现中,hppc使用了高度优化的算法,比如快速哈希映射查找和插入,以及快速排序等。 4. **线程安全**:虽然hppc的...

    JAVA实例原始文档

    在本Java实例原始文档中,我们有两个主要章节,分别涵盖了基础的GUI编程和核心的编程概念。以下是这两个章节中涉及的重要知识点的详细说明: **第1章:幻灯片播放程序——布局** 在这一章中,我们将深入学习如何...

    原始套接字

    在Windows平台上,原始套接字的支持始于Windows XP,但在Windows XP Service Pack 2之后,为了提高安全性,微软限制了原始套接字的使用,限制了某些原始套接字操作可能引发的安全漏洞。 实现原始套接字编程需要较深...

    《JavaScript高级程序设计》阅读笔记(二) ECMAScript中的原始类型

    在JavaScript高级程序设计中,了解ECMAScript中的原始类型至关重要,因为它们构成了语言的基础。原始类型包括Undefined、Null、Boolean、Number和String,每一种都有其特定的特性和用途。 首先,`typeof`运算符是...

    C#中this用法系列(二) 通过this修饰符为原始类型扩展方法

    在本篇中,我们将深入探讨如何使用`this`修饰符为原始类型(如`string`)扩展方法,这将使我们能够为现有的类型添加自定义功能,而无需修改这些类型的源代码。 首先,我们要明白`this`修饰符在扩展方法中的作用。...

    Java中各个数据类型之间的转换

    在Java中,数据类型主要分为两大类:原始类型(Primitive Types)和引用类型(Reference Types)。原始类型包括布尔型(boolean)、字符型(char)、整型(byte、short、int、long)和浮点型(float、double),而...

    Java语言基础入门教程 Java实训教程 2.java简单知识 共100页.pptx

    下面将详细介绍原始类型和引用类型,包括它们的定义、用途、取值范围等,并解释如何在实际编程中应用这些概念。 ### Java中的数据类型 Java是一种静态类型语言,这意味着变量必须在编译时声明其类型。Java中的数据...

    原始套接字 原始套接字的创建

    在计算机网络领域,原始套接字(Raw Socket)是一种特殊类型的套接字,它允许应用程序直接访问并控制网络协议栈中的底层传输协议。通过使用原始套接字,开发人员可以模拟一些常用的网络工具,例如Traceroute和Ping...

    go-nnz:定义原始类型的变体,其中在使用 encodingjson 和 databasesql(反)序列化时零值表示 null

    通常,Go 语言的原始类型(如 int、string、bool 等)的零值并不是 `null`,而是它们各自的默认值(例如,int 类型的零值是 0,string 类型的零值是空字符串,bool 类型的零值是 false)。但在某些情况下,我们希望...

Global site tag (gtag.js) - Google Analytics