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");
}
});

javascript学习-基本类型的更多相关文章

  1. JavaScript学习—基本类型—Number

    在JavaScript中,采用IEEE754表示整数和浮点数 整数 十进制 let num10 = 10 八进制 let num8 = 0(1~7) JavaScript中,八进制数值以0作为前导,后 ...

  2. Javascript学习1 - Javascript中的类型对象

    原文:Javascript学习1 - Javascript中的类型对象 1.1关于Numbers对象. 常用的方法:number.toString() 不用具体介绍,把数字转换为字符串,相应的还有一个 ...

  3. javascript学习-类型判断

    javascript学习-类型判断 1.类型判断的的武器 javascript中用于类型判断的武器基本上有以下几种: 严格相等===,用来判断null,undefined,true,false这种有限 ...

  4. javascript学习笔记(四) Number 数字类型

    数字格式化方法toFixed().toExponential().toPrecision(),三个方法都四舍五入 toFixed() 方法指定小数位个数  toExponential() 方法 用科学 ...

  5. JavaScript 学习笔记: 扩充类型的功能

    JavaScript 是允许给基本类型扩充功能的.例如,可以通过对Object.prototype增加方法,可以让该方法对所有的对象都可用. 这样的方式对函数,数组,字符串,数字,正则表达式和布尔值同 ...

  6. JavaScript学习总结(十八)——JavaScript获取浏览器类型与版本

    从网上找到一段使用JavaScript判断浏览器以及浏览器版本的比较好的代码,在此记录一下: 1 <script type="text/javascript"> 2 v ...

  7. JavaScript学习(2):对象、集合以及错误处理

    在这篇文章里,我们讨论一下JavaScript中的对象.数组以及错误处理. 1. 对象 对象是JavaScript中的一种基本类型,它内部包含一些属性,我们可以对这些属性进行增删操作. 1.1 属性 ...

  8. JavaScript学习11 数组排序实例

    JavaScript学习11 数组排序实例 数组声明 关于数组对象的声明,以前说过:http://www.cnblogs.com/mengdd/p/3680649.html 数组声明的一种方式: va ...

  9. JavaScript学习10 JS数据类型、强制类型转换和对象属性

    JavaScript学习10 JS数据类型.强制类型转换和对象属性 JavaScript数据类型 JavaScript中有五种原始数据类型:Undefined.Null.Boolean.Number以 ...

随机推荐

  1. TCP/IP协议、HTTP协议、SOCKET通讯详解

    1.TCP连接TCP(Transmission Control Protocol) 传输控制协议.TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握确认建立一个连接.位码即tcp标志位 ...

  2. Android数据存储引擎---SQLite数据库

    目标:是否可以在PC端桌面上使用SQLite数据库制作一个财务文件? 目录: 来源: 实践: 总结和比较: SQLite数据简介 是什么,内部结构是怎样的,数据库和表的关系是什么 有什么用 常用的操作 ...

  3. Java虚拟机-对象的创建和访问

    一.对象的创建: 创建对象在java上面是很简单的,使用new关键字就可以了,但是其实在虚拟机中,java对象的创建是一个复杂的过程. 当java虚拟机遇到一个new的指令的时候,对象创建的程序正式启 ...

  4. [Codeforces Round #508 (Div. 2)][Codeforces 1038E. Maximum Matching]

    前几天给舍友讲这题的时候感觉挺有意思的,就贴上来吧... 题目链接:1038E - Maximum Matching 题目大意:有\(n\)个棒子,每个条两端有颜色\(c1,c2\)以及他的价值\(v ...

  5. uri&url

    统一资源标志符URI就是在某一规则下能把一个资源独一无二地标识出来. 拿人做例子,假设这个世界上所有人的名字都不能重复,那么名字就是URI的一个实例,通过名字这个字符串就可以标识出唯一的一个人.现实当 ...

  6. [SDOI2009]SuperGCD

    题目链接 这题.高精度.恶心.难受. 那么高精度的gcd怎么做呢? 若a=b gcd(a,b)=a ①a偶b偶 gcd(a,b)=2*gcd(a/2,b/2) ②a偶b奇 gcd(a,b)=gcd(a ...

  7. 菜鸟详细解析Cookie注入原理

    一.SQL注入原理 我以aspx为例,现在我们来研究下Cookie注入是怎么产生的,在获取URL参数的时候,如果在代码中写成Request[“id”],这样的写法问题就出现了.我先普及下科普知识,在a ...

  8. PDF文件怎么转换成PPT

    在日常办公中大家都会发现PDF文件目前是比较常见的一种文件,有的时候大家会需要将PDF转换成PPT为了去更好的演示,毕竟PPT文件在演示方面具有着较好的特点,那如何将PDF文件转换成PPT文件呢,今天 ...

  9. 【LookLook文档】通过less 定制自己的Bootstrap 样式

    闲话 学习还是看文档最快,看文档要仔细点,不可走马观花.感谢 “Bootstrap中文网” 思路 1.早在2015开始接触,由于公司中使用的是easyui 固一直没完全使用Bootstrap,开始接触 ...

  10. body里面的onload和window.onload,window.load的区别

    区别:body里面的onload是在“页面加载完成后执行的动作”window里面的onload是在“页面加载时执行的动作” window.load这个应该只是表明事件方法,但并未执行,比如click表 ...