javascript学习-基本类型

javascript学习-基本类型

1.概述

javascript的数据类型大体上分两种:基本类型和对象类型。简单的区分就是基本类型是无法再分的原子级类型;对象类型是容器,可以容纳基本类型和对象类型。

javascript的在基本类型划分上,秉持最小化的原则:

  1. number类型表示数据(不管什么整数,浮点数,有符号,无符号的,都不需要区分了,只有一种数字)
  2. string类型表示字符串(还要什么字符,都有字符串了,还要那玩意干吗?)
  3. boolean类型表示布尔(只有true和false,整个类型就这两个就够了)
  4. null类型表示空(估计是从C/C++语言和java语言中的null指针借鉴过来的,就表示空值,整个类型只有一个值null)
  5. undefined类型表示声明了却未定义的特殊情况(整个类型只有一个值undefined)

学习一门语言的数据类型必须区分两个概念:

  • 变量,类似于代数中的x,y,z,在计算机语言中代表一个具体的存储空间地址,可被赋值
  • 字面量,类似于代数中的1,2,3,在计算机语言中代表直接写在代码中的数据,不可被赋值

本篇文章不打算搞什么绕脑筋的高深玩意,只打算把基本类型的分类和相应的字面量分清楚就够了,已经基础的不能再基础了吧。当然了,光说不练假把式,一堆堆的assert测试用例那是必须地。

2.typeof

javascript是一门动态语言,变量声明后没有任何类型信息,必须靠运行时进行判断,因此需要有一种手段来检测给定变量的数据类型,这就是typeof操作符的用意。

在需求上我们希望可以通过typeof来区分5种基本类型,即:

  1. typeof number === "number"
  2. typeof string === "string"
  3. typeof boolean=== "boolean"
  4. typeof null=== "null"
  5. 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");
                }
            });

 

posted @ 2017-02-16 06:34  oowgsoo  阅读(205)  评论(0编辑  收藏  举报