前不久我了解了js数组相关操作,才发现我的js在
数据类型
这块的基础真的很薄弱,所以整理了些文档,重新学习了一下。
1 DEFINTION
数据类型
在数据结构
中的定义是一个值
的集合
以及定义在这个值集
上的一组操作
。
变量
是用来存储值
的所在处
,它们有名字
和数据类型
。变量
的数据类型
决定了如何将代表这些值
的位存储
到计算机的内存
中。在声明变量
时也可指定它的数据类型
。所有变量都具有数据类型
,以决定能够存储哪种数据
。
数据类型
包括原始类型
、多元组
、记录单元
、代数数据类型
、抽象数据类型
、参考类型
以及函数类型
。
2 PARAMETER
2.1 primitive type
在JavaScript
有 5 种原始类型(primitive type),即 undefined
、Null
、Boolean
、Number
和 String
。
并且JavaScript 拥有动态类型,这意味着相同的变量可用作不同的类型
1 | var temp = undefined; |
2.1.1 undefined
当声明的变量未初始化时,该变量的默认值是undefined
,即该值的数据类型和数据内容都是undefined
。
1 | var oTemp; |
但是,值 undefined
并不同于未定义的值
,typeof
运算符会将未定义
和未声明
的变量数据类型都打印为undefined
。
1 | var oTemp; |
请注意,对于未声明的变量
使用除 typeof
之外的其他运算符的话,会引起错误,因为其他运算符只能用于已声明
的变量上。
例如,下面的代码将引发错误:
1 | var oTemp; |
当函数无明确返回值时,返回的也是值 undefined
,如下所示:
1 | function testFunc() { |
2.1.2 Null
它只有一个专用值 null
,即它的字面量
。值undefined
实际上是从值null
派生来的,因此ECMAScript
把它们定义为相等的。
1 | console.log(null == undefined); //输出 "true" |
尽管这两个值相等,但它们的含义不同。undefined
是声明了变量但未对其初始化时赋予该变量的值,null
则用于表示尚未存在
的对象(在讨论 typeof 运算符时,简单地介绍过这一点)。如果函数或方法要返回的是对象
,那么找不到该对象时,返回的通常是 null
。
1 | console.log(typeof null)// "object" |
typeof
运算符对于 null
值会返回 Object
,这实际上是 JavaScript
最初实现中的一个错误,然后被 ECMAScript
沿用了。现在,null
被认为是对象的占位符
,从而解释了这一矛盾,但从技术上来说,它仍然是原始值
。
也可以通过将变量的值设置为 null 来清空变量。
1 | var temp =""; |
2.1.3 Boolean
Boolean
类型是 ECMAScript
中最常用
的类型之一。它有两个值 true
和 false
(即两个 Boolean
字面量
)。
即使 false
不等于 0
,0
也可以在必要时被转换成 false
,这样在 Boolean
语句中使用两者都是安全的。
1 | var temp = true; |
2.1.4 Number
ECMA-262
中定义的最特殊的类型是 Number
类型。这种类型既可以表示 32 位
的整数
,还可以表示 64 位
的浮点数
。
直接输入的(而不是从另一个变量访问的)任何数字都被看做 Number
类型的字面量
。例如,下面的代码声明了存放整数值的变量,它的值由字面量
86 定义:
1 | var temp = 86; |
八进制数和十六进制数
整数也可以被表示为
八进制
(以 8 为底)或十六进制
(以 16 为底)的字面量
。尽管所有整数都可以表示为八进制或十六进制的字面量,但所有数学运算返回的都是十进制结果。
八进制
的字面量
的首数字
必须是 0
,其后的数字可以是任何八进制数字
(0-7),如下面的代码所示:
1 | var temp = 070; |
要创建十六进制
的字面量
,首位数字
必须为0
,后面接字母 x
(不分大小写),然后是任意的十六进制数字
(0 到 9 和 A 到 F)。这些字母可以是大写
的,也可以是小写
的。例如:
1 | var temp = 0x1f; |
浮点数
要定义浮点值,必须包括小数点和小数点后的一位数字(例如,用 1.0 而不是 1)。这被看作浮点数字面量。例如:
1 | var temp = 5.0; |
对于浮点字面量的有趣之处在于,用它进行计算前,真正存储的是字符串
。
科学计数法
对于
非常大
或非常小
的数,可以用科学计数法
表示浮点数
,可以把一个数表示为数字(包括十进制数字)加e
(或E
),后面加乘以10
的倍数。对于极小值的浮点可以通过toFixed(number)
将指定数字截取小数点后number
位,或者是利用Math.round()
方法将一个数字舍入为最接近的整数,但是对于正整数,需要使用toPrecision(number)
将整个数字截取指定number
长度。
1 | var temp = 5.618e7; |
ECMAScript
默认把具有6 个或 6 个以上前导 0 的浮点数
转换成科学计数法
。也可用 基于IEEE 754
标准的64 位
形式存储浮点值
,这意味着十进制
值最多可以有 17
个十进制位
。17 位
之后的值将被裁去
,从而造成一些小的数学误差
。
1 | IEEE 754 标准是IEEE二进位浮点数算术标准(IEEE Standard for Floating-Point Arithmetic)的标准编号[1] ,等同于国际标准ISO/IEC/IEEE 60559。该标准由美国电气电子工程师学会(IEEE)计算机学会旗下的微处理器标准委员会(Microprocessor Standards Committee, MSC)发布。 |
特殊的 Number 值
几个特殊值也被定义为
Number
类型。前两个是Number.MAX_VALUE
和Number.MIN_VALUE
,它们定义了Number
值集合的外边界
。所有ECMAScript
数都必须在这两个值之间。不过计算生成的数值结果可以不落在这两个值之间。
当计算生成的数大于Number.MAX_VALUE
时,它将被赋予值Number.POSITIVE_INFINITY
,意味着不再有数字值
。同样,生成的数值小于Number.MIN_VALUE
的计算也会被赋予值Number.NEGATIVE_INFINITY
,也意味着不再有数字值
。如果计算返回的是无穷大值
,那么生成的结果不能再用于其他计算。
事实上,有专门的值表示无穷大
,(如你猜到的)即Infinity
。Number.POSITIVE_INFINITY
的值为Infinity
。Number.NEGATIVE_INFINITY
的值为-Infinity
。
由于无穷大数
可以是正数
也可以是负数
,所以可用一个方法判断一个数是否是有穷的
(而不是单独测试每个无穷数)。可以对任何数调用isFinite()
方法,以确保该数不是无穷大。对于数字可以调用Number.isInteger()
验证数据是否是整型数据。
1 | var temp = Number.POSITIVE_INFINITY; |
最后一个特殊值是 NaN
,表示非数
(Not a Number)。NaN
是个奇怪的特殊值
。一般说来,这种情况发生在类型(String
、Boolean
等)转换失败时。例如,要把单词 blue 转换成数值就会失败,因为没有与之等价的数值。与无穷大一样,NaN 也不能用于算术计算。NaN
的另一个奇特之处在于,它与自身不相等
。
1 | var temp = NaN; |
Number 对象
Number 对象是原始数值的包装对象。
创建 Number 对象的语法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20var temp=new Number("a");
console.log(temp);
/*
Number {[[PrimitiveValue]]: NaN}
__proto__:Number
constructor:ƒ Number()
toExponential:ƒ toExponential()
toFixed:ƒ toFixed()
toLocaleString:ƒ toLocaleString()
toPrecision:ƒ toPrecision()
toString:ƒ toString()
valueOf:ƒ valueOf()
__proto__:Object
[[PrimitiveValue]]:0
[[PrimitiveValue]]:NaN
*/
var tmp=Number("b");
console.log(tmp);//NaN
tmp=Number("");
console.log(tmp);//0参数
参数
value
是要创建的Number
对象的数值,或是要转换成数字
的值。返回值
当
Number()
和运算符new
一起作为构造函数使用时,它返回一个新创建的Number
对象。如果不用new
运算符,把Number()
作为一个函数
来调用,它将把自己的参数转换成一个原始的数值,并且返回这个值(如果转换失败,则返回NaN
)。Number 对象属性
属性 | 描述 |
---|---|
constructor | 返回对创建此对象的 Number 函数的引用。 |
MAX_VALUE | 可表示的最大的数。 |
MIN_VALUE | 可表示的最小的数。 |
NaN | 非数字值。 |
NEGATIVE_INFINITY | 负无穷大,溢出时返回该值。 |
POSITIVE_INFINITY | 正无穷大,溢出时返回该值。 |
prototype | 使您有能力向对象添加属性和方法。 |
- Number 对象方法
方法 | 描述 |
---|---|
toString | 把数字转换为字符串,使用指定的基数。 |
toLocaleString | 把数字转换为字符串,使用本地数字格式顺序。 |
toFixed | 把数字转换为字符串,结果的小数点后有指定位数的数字。 |
toExponential | 把对象的值转换为指数计数法。 |
toPrecision | 把数字格式化为指定的长度。 |
valueOf | 返回一个 Number 对象的基本数字值。 |
2.1.5 string
字符串是存储字符(比如 “Bill Gates”)的变量。
字符串可以是引号中的任意文本。可以使用单引号或双引号,也可以在字符串中使用引号,只要不匹配包围字符串的引号即可。1
2
3var answer="Nice to meet you!";
var answer="He is called 'Bill'";
var answer='He is called "Bill"';
2.2 衍生 type
2.2.1 对象
2.2.2 数组
- 直接声明并赋值
1 | var cars=["Audi","BMW","Volvo"]; |
数组下标是基于零的,所以第一个项目是 [0],第二个是 [1],以此类推。
- 利用array新建数组对象
Array 对象用于在单个的变量中存储多个值。
创建 Array 对象的语法:
1 | new Array(); |
- 参数
参数 size 是期望的数组元素个数。返回的数组,length 字段将被设为 size 的值。
参数 element …, elementn 是参数列表。当使用这些参数来调用构造函数 Array() 时,新创建的数组的元素就会被初始化为这些值。它的 length 字段也会被设置为参数的个数。
返回值
返回新创建并被初始化了的数组。
如果调用构造函数 Array() 时没有使用参数,那么返回的数组为空,length 字段为 0。
当调用构造函数时只传递给它一个数字参数,该构造函数将返回具有指定个数、元素为 undefined
的数组。
当其他参数调用 Array() 时,该构造函数将用参数指定的值初始化数组。
当把构造函数作为函数调用,不使用 new 运算符时,它的行为与使用 new 运算符调用它时的行为完全一样。