javascript学习-基本类型
javascript学习-基本类型
1.概述
javascript的数据类型大体上分两种:基本类型和对象类型。简单的区分就是基本类型是无法再分的原子级类型;对象类型是容器,可以容纳基本类型和对象类型。
javascript的在基本类型划分上,秉持最小化的原则:
- number类型表示数据(不管什么整数,浮点数,有符号,无符号的,都不需要区分了,只有一种数字)
- string类型表示字符串(还要什么字符,都有字符串了,还要那玩意干吗?)
- boolean类型表示布尔(只有true和false,整个类型就这两个就够了)
- null类型表示空(估计是从C/C++语言和java语言中的null指针借鉴过来的,就表示空值,整个类型只有一个值null)
- undefined类型表示声明了却未定义的特殊情况(整个类型只有一个值undefined)
学习一门语言的数据类型必须区分两个概念:
- 变量,类似于代数中的x,y,z,在计算机语言中代表一个具体的存储空间地址,可被赋值
- 字面量,类似于代数中的1,2,3,在计算机语言中代表直接写在代码中的数据,不可被赋值
本篇文章不打算搞什么绕脑筋的高深玩意,只打算把基本类型的分类和相应的字面量分清楚就够了,已经基础的不能再基础了吧。当然了,光说不练假把式,一堆堆的assert测试用例那是必须地。
2.typeof
javascript是一门动态语言,变量声明后没有任何类型信息,必须靠运行时进行判断,因此需要有一种手段来检测给定变量的数据类型,这就是typeof操作符的用意。
在需求上我们希望可以通过typeof来区分5种基本类型,即:
- typeof number === "number"
- typeof string === "string"
- typeof boolean=== "boolean"
- typeof null=== "null"
- typeof undefined === "undefined"
实际上javascript的typeof也恰恰就是这么设计的。
2.number
尽管javascript中的一切number本质上都是浮点数,但是作为字面量还是要区分整数和浮点数的。
整数的测试组:
test("整数字面量", function() { // 标准的0 // 至于+0,-0,其实基本用不上,权当好玩吧 assert(0 === 0, "0"); assert(+0 === 0, "+0"); assert(-0 === 0, "-0"); // 正整数,注意进制 assert(+12 === 12, "正整数十进制"); assert(+012 === 10, "正整数八进制"); assert(+0x12 === 18, "正整数十六进制"); // 负整数,注意进制 assert(-12 === -12, "负整数十进制"); assert(-012 === -10, "负整数八进制"); assert(-0x12 === -18, "负整数十六进制"); });
浮点数的测试组:
test("浮点数字面量", function() { // 这玩意也是0 assert(0.00000 === 0, "0"); assert(+0.00000 === 0, "+0"); assert(-0.00000 === 0, "+0"); // 正浮点数数,注意科学计数法 assert(3.14 === 3.14, "正浮点数"); assert(3.14e1 === 31.4, "正浮点数"); // 正浮点数数,注意科学计数法 assert(-3.14 === -3.14, "负浮点数"); assert(-3.14e1 === -31.4, "负浮点数"); // 因为浮点数精度的问题,一般是不能直接比较的, // 对于javascript的浮点可以直接比较的问题, // 我只能归结为当字面量转换为浮点数格式后,其二进制内容恰巧一致吧 assert(3.14 !== 3.1400000000000000000001, "浮点数比较,无论放多少个0,其实也是不相等的"); // 不推荐的字面量写法 // 都什么年代了,不是计算机内存极端匮乏了时候了, // 不用为代码中省了0而斤斤计较了 assert(.42 === 0.42, ".42不推荐"); assert(42. === 42.0, "42.不推荐"); });
补充几点:
- 浮点数值的最高精度是17位小数,采用标准的双精度浮点数格式存储
- 在默认情况下,ECMASctipt 会将那些小数点后面带有6 个零以上的浮点数值转换为以e 表示法表示的数值(例如,0.0000003 会被转换成3e-7)
Javascript的Number中还有一些特殊的数:
- Infinity,表示由于内存的限制,超出了JavaScript数值范围的值,但是它仍然是number
- NaN,表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)
test("特殊数字", function() { // 正无穷,其实是表示比Number.MAX_VALUE还大, // 和高数中的正无穷是两码事,所以是可以比较的 assert(Infinity === Infinity, "Infinity"); // 负无穷,其实是表示比Number.MIN_VALUE还小, // 和高数中的负无穷是两码事,所以是可以比较的 assert(-Infinity === -Infinity, "-Infinity"); // NaN(not a number)却还是一个number类型,这个有点绕, // 但是更绕的是这家伙自己既然不等于自己, // 好吧,这家伙是生活在另外一个宇宙空间里的 assert(NaN !== NaN, "NaN"); });
3.string
javascript中的string类型底层是用16位Unicode字符表示的,所以自然支持中文了。想想也是,在网页上用的,你敢不支持unicode?谁还敢用你?
test("字符串字面量", function() { assert("abc" === "abc", "'abc'"); assert('abc' !== "Abc", "'abc'"); });
按照惯例,字符串还支持转义字符:
test("转义字符", function() { assert("\n" === "\n", "换行"); assert("\t" === "\t", "制表"); assert("\b" === "\b", "空格"); assert("\r" === "\r", "回车"); assert("\f" === "\f", "进纸"); assert("\\" === "\\", "斜杠"); assert("\'" === "\'", "单引号"); assert("\"" === "\"", "双引号"); assert("\x41" === "A", "以十六进制代码nn表示的一个字符(其中n为0~F)"); assert("\u03a3" === "Σ", "以十六进制代码nnnn表示的一个Unicode字符(其中n为0~F)"); });
补充几点:
- javascript的字符串是不可变的
4.boolean
只有两个值true和false。
test("字面量", function() { assert(true, "true"); assert(!false, "false"); });
5.null
只有一个值null。
test("字面量", function() { var obj = null; assert(obj === null, "null"); });
6.undefined
只有一个值undefined。
test("undefined和变量", function() { // 声明未赋值默认为undefined var p; assert(p === undefined, "var p"); // 未声明变量不能直接使用 // assert(q === undefined, "q"); // 未声明未赋值的成员变量,会被自动声明和添加 assert(this.x === undefined, "this.x"); });
应区未定义和为声明的区别:
test("undeclared", function() { if (typeof DEBUG == "undefined") { assert(true, "undeclared DEBUG"); } var DEBUG; if (typeof DEBUG == "undefined") { assert(true, "declared DEBUG"); } });