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. Python——Redis相关知识

    一.连接 Redis import redis 连接方式:redis提供了2个方法 1:StrictRedis:实现大部分官方的命令 2:Redis:是StrictRedis的子类,用于向后兼容旧版的 ...

  2. angularjs ng-if 中的ng-model 值作用域问题

    现象:最近做了一个需求,页面上使用了ng-if 条件做判断,导致通过使用 $scope 获取不到 ng-model 的值. 问题原因: ng-if这个指令单独开了一个作用域,它只可以继承,不可以进行往 ...

  3. __http原理__03__content-type 对照表

    HTTP content-type Content-Type,内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式.什么编码读取这个文件, ...

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

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

  5. [LeetCode] Flatten a Multilevel Doubly Linked List 压平一个多层的双向链表

    You are given a doubly linked list which in addition to the next and previous pointers, it could hav ...

  6. php发送短信验证码

    业务: 手机端点击发送验证码,请求发送到php端,由php调用榛子云短信http://smsow.zhenzikj.com的短信接口,生成验证码并发送. SDK下载: http://smsow.zhe ...

  7. python语法_文件操作

    牢记“”“能调用方法的一定是对象”“” 文件的操作流程, 1 建立文件(打开文件)open('filename','模式').read() [这一步其实就是创建对象] 2 通过句柄进行操作 3 关闭o ...

  8. XAMPP 安装时 MySQL 无法启动,且提示端口占用。

    今天安装XAMPP时遇到了几个坑,忙活了一上午才搞定,写下来分享给同样遇坑的盆友们. MySQL 点击start 提示端口3306被占用,我改了端口号,又改了注册表,将注册表地址改为xampp中mys ...

  9. jQuery效果-----fadeIn()、fadeOut()、fadeToggle()、fadeTo()

    fadeIn(),fadeOut(),fadeToggle(),fadeTo() fadeIn()-----淡入已经隐藏的元素(把隐藏的被选元素渐渐显示出来). 语法:$(selector).fade ...

  10. C# Collection 排序

    Collection<int> aa = new Collection<int>(); aa.Add(1); aa.Add(2); aa.Add(3); aa.Add(1); ...