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. LeetCode(21. 合并两个有序链表)

    问题描述 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1-& ...

  2. docker修改容器信息,打包等

    https://blog.csdn.net/x6_9x/article/details/72891404

  3. Thinkphp3.2.3加载外部类并调用类里面的方法 获取token

    例如:加载七牛上传类(thinkphp自带的) $qiniu = new \Think\Upload\Driver\Qiniu\QiniuStorage($setting['driverConfig' ...

  4. PropertyEditor、Formatter、Converter的应用

    @ResponseBody @RequestMapping("date.do") public String data(Date date) { return date.toStr ...

  5. VMware workstation --虚拟机静态ip设置

    背景介绍 我在本机win10上安装VMware workstation软件,新建两台centos7虚拟机,最近在配服务,每天虚拟机重启后,ip总会变,服务配置文件又要修改,很麻烦,便需要将其ip由dh ...

  6. vue菜鸟从业记:没准备好的面试,那叫尬聊

    最近我的朋友王小闰参加了一场面试,在他填写简历表的时候,排在他前面的应聘者正在旁边邻桌接受来自面试官的检验. 王小闰边写边想,这不就是一会儿要面试自己的前端leader么,现在面试官提问的一些面试题会 ...

  7. 一次Spring Bean初始化顺序问题排查记录

    最近在使用Springboot的时候需要通过静态的方法获取到Spring容器托管的bean对象,参照一些博文里写的,新建了个类,并实现ApplicationContextAware接口.代码大致如下: ...

  8. ASP.NET Core 集成测试中结合 WebApplicationFactory 使用 SQLite 内存数据库

    SQLite 内存数据库(in-memory database)的连接字符串是  Data Source=:memory: ,它的特点是数据库连接一关闭,数据库就会被删除.而使用  services. ...

  9. django上传excel文件

    def uploadGrade(request): ''' 班级信息导入 :param request: :return: ''' if request.method == 'POST': f = r ...

  10. Visual Studio Code for mac 设置中文

    1,mac系统VScode设置中文 macOS 快捷键:command + shift + p 输入搜索 configure language       1.Ctrl+Shift+P 打开命令 2. ...