资讯专栏INFORMATION COLUMN

【JS. ES5重点笔记】数据类型

Yu_Huang / 3060人阅读

摘要:是最特殊的类型,表示没有意义的数,例如。十六进制数八进制数十进制数十六进制数对于部分情况,和存在分歧。例如,表示希腊字符关于字符串的转换,其实核心就是函数,如果是数字型,还可以添加参数,使之变为二进制八进制十进制十六进制数。

虽然目前已经算是ES6的时代,然是ES5的尾巴仍在众多框架中出现,JS我虽然通过视频等方式学习,曾经做过项目,但是仍对部分细节和原理不了解,通过阅读这本书,希望能对ES5有更加完整的了解。

为什么我要选择这个做专题

数据类型相信对JS有所了解的人都不陌生,但是具体的细节我还是想做好笔记,方便复查,有时候,这种细节问题出bug你要是不知道是根本无法排除的。另外,面试的时候很可能遇到。

数据类型 简单数据类型

ES5中有5中简单数据类型,Undefined, Null, Boolean, Number, String.

Undefined类型

一种特殊的数据类型,只有一个值undefined。

var message;
alert(message==undefined);  // true

已经声明但是没有初始化的变量默认都是Undefined类型的。但是需要强调的是,Undefined类型的默认是在已经声明的前提下,未声明的变量是直接报错而并非Undefined。

var message;

// var news; 
// news未声明

alert(message==undefined);  // true
alert(news==undefined);     // 报错
Null类型

Null类型同样很特殊,只有一种值,那就是null,他更像是一个空指针,所以其typeof会显示为object类型。另外,当不清楚变量的初始值时,将变量初始为null更加合适,这样一来,只要直接检查 null 值就可以知道相应的变量是否已经保存了一个对象的引用。

if (car!=null){
    // some possible operation
}

还需要注意的是,Null类型和Undefined类型的相等操作符运算返回值为“true”。

Boolean类型

布尔型只有两个值,true和false,他不是简单的1和0的对应关系,而是真假,但是,简便地,数据类型的转换会十分灵活,如下面所示。

数据类型 转换为True 转换为False
Boolean true false
String 任何非空字符串 空字符串
Number 任何非0数值,包括无穷大 0和NaN
Object 任何对象 null
Undefined n/a undefined
Number类型

Number类型还能细分整数和浮点数值。

// 整数
var intNum=55;

// 八进制
var octalNum1=070;
var octalNum2=079;
var octalNum3=08;

// 十六进制
var hexNum1=0xA;
var hexNum2=0x1f;

// 浮点数
var floatNum1=1.1;
var floatNum2=10.; // 会解析为整数
var floatNum3=3.14e10; // 科学计数法

js在计算中存在精度问题的内容我多带带写一篇文章解释,是解决JS浮点数精度问题。由于精度问题的复杂性,自己变成解决成本太高,有人已经组件化实现了。Big.js

计算机中的数值是存在范围的,最小值精度表示为Number.MIN_VALUE,值为5e-325,最大值表示为Number.MAX_VALUE,值为1.7976931348623157e+308。超过最大值会被解析为Infinity,小于最小值精度-Infinity

NaN是最特殊的类型,表示没有意义的数,例如10/0。而且有下面的特殊规则。

alert(NaN == NaN);          //false

alert(isNaN(NaN));          //true
alert(isNaN(10));           //false( 10 是一个数值)
alert(isNaN("10"));         //false(可以被转换成数值 10)
alert(isNaN("blue"));       //true(不能转换成数值)
alert(isNaN(true));         //false(可以被转换成数值 1)

数值转换成其他类型规则和案例如下:

如果是 Boolean 值, true 和 false 将分别被转换为 1 和 0。

如果是数字值,只是简单的传入和返回。

如果是 null 值,返回 0。

如果是 undefined,返回 NaN。

如果是字符串,遵循下列规则:

如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即"1"

会变成 1, "123"会变成 123,而"011"会变成 11(注意:前导的零被忽略了);

如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(同样,也会忽略前导零);

如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整数值;

如果字符串是空的(不包含任何字符),则将其转换为 0;

如果字符串中包含除上述格式之外的字符,则将其转换为 NaN。

如果是对象,则调用对象的 valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是 NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串值。

var num1 = Number("Hello world!"); //NaN
var num2 = Number(""); //0
var num3 = Number("000011"); //11
var num4 = Number(true); //1

由于Number()比较复杂,处理整数的时候parseInt()函数,规则不用多说,直接看例子。

var num1 = parseInt("1234blue"); // 1234
var num2 = parseInt(""); // NaN
var num3 = parseInt("0xA"); // 10(十六进制数)
var num4 = parseInt(22.5); // 22
var num5 = parseInt("070"); // 56(八进制数)
var num6 = parseInt("70"); // 70(十进制数)
var num7 = parseInt("0xf"); // 15(十六进制数)

对于部分情况,ES3和ES5存在分歧。

//ECMAScript 3 认为是 56(八进制), ECMAScript 5 认为是 70(十进制)
var num = parseInt("070");
alert(num)

为了防止上述问题,这个函数有了双参数形式。双参数形式的主要目的其实是规定解析的进制。

var num = parseInt("0xAF", 16); //175

var num1 = parseInt("AF", 16); //175
var num2 = parseInt("AF"); //NaN

var num1 = parseInt("10", 2); //2 (按二进制解析)
var num2 = parseInt("10", 8); //8 (按八进制解析)
var num3 = parseInt("10", 10); //10 (按十进制解析)
var num4 = parseInt("10", 16); //16 (按十六进制解析)

类似地,还有parseFloat()函数。下面是详细的例子。主要是要看清楚其解析机制。

var num1 = parseFloat("1234blue"); //1234 (整数)
var num2 = parseFloat("0xA"); //0
var num3 = parseFloat("22.5"); //22.5
var num4 = parseFloat("22.34.5"); //22.34
var num5 = parseFloat("0908.5"); //908.5
var num6 = parseFloat("3.125e7"); //31250000
String类型

字符串相信都比较熟悉,此处首先是先强调一点,JS对单双引号括起来的字符串没有区别,但是必须匹配。

下面是常见的转义字符:

转义字符 含 义
n 换行
t 制表
b 空格
r 回车
f 进纸
斜杠
" 单引号("),在用单引号表示的字符串中使用。例如: "He said, "hey.""
" 双引号("),在用双引号表示的字符串中使用。例如: "He said, "hey.""
xnn 以十六进制代码nn表示的一个字符(其中n为0~F)。例如, x41表示"A"
unnnn 以十六进制代码nnnn表示的一个Unicode字符(其中n为0~F)。例如, u03a3表示希腊字符Σ

关于字符串的转换,其实核心就是toString()函数,如果是数字型,还可以添加参数,使之变为二进制、八进制、十进制、十六进制数。

var num = 10;
alert(num.toString()); // "10"
alert(num.toString(2)); // "1010"
alert(num.toString(8)); // "12"
alert(num.toString(10)); // "10"
alert(num.toString(16)); // "a"

而对其他类型,存在一些特殊情况:

var value1 = 10;
var value2 = true;
var value3 = null;
var value4;
alert(String(value1)); // "10"
alert(String(value2)); // "true"
alert(String(value3)); // "null"
alert(String(value4)); // "undefined"
Object类型

object同样属于一种数据类型,但是属于复杂数据类型,在这本书里面专门有专题讲解,此处先不赘述。

下面是我的个人公众号,技术方面的内容以及非技术方面内容都会在此展示。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/82099.html

相关文章

  • JS. ES5重点笔记】执行环境和作用域

    摘要:作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。这样,一直延续到全局执行环境全局执行环境的变量对象始终都是作用域链中的最后一个对象。如果在局部环境中没有找到该变量名,则继续沿作用域链向上搜索。 【JavaScript.ES5】执行环境和作用域 参考文献: Nicholas C.Zakas 《JavaScript》高级程序设计 仅为个人学习参考文献的内容记录的笔记。存...

    Jeffrrey 评论0 收藏0
  • 读“js高程”笔记

    showImg(http://img3.douban.com/lpic/s8958650.jpg); 0x00 javascript组成 ECMAScript(-265)核心语言部分 DOM文档对象模型(DOM1、2、3) BOM浏览器对象模型(提供与浏览器交互的接口和方法) 0x01 async 异步加载 执行顺序不定 charset defer 延迟加载,立即下载脚本但不执行 src ...

    CollinPeng 评论0 收藏0
  • JS高程读书笔记--第六章原型继承

    摘要:高程读书笔记第六章理解对象创建自定义对象的方式有创建一个实例,然后为它添加属性和方法。创建了自定义的构造函数之后,其原型对象默认只会取得属性至于其他方法都是从继承而来的。 JS高程读书笔记--第六章 理解对象 创建自定义对象的方式有创建一个Object实例,然后为它添加属性和方法。还可用创建对象字面量的方式 属性类型 ECMAScript在定义只有内部采用的特性时,描述了属性的各种特征...

    EasonTyler 评论0 收藏0
  • JavaScript 语言核心笔记(持续更新)

    摘要:在同一个块内,不允许用重复声明变量。中为新增了块级作用域。自带遍历器的对象有数组字符串类数组对象对象的对象等和结构对象。返回一个遍历器,使遍历数组的键值对键名键值。 目录 1.语法 2.类型、值和变量 3.表达式和运算符 4.语句 5.数组 6.对象 7.函数 8.全局属性和方法 9.词法作用域、作用域链、闭包 10.原型链、继承机制 11.this的理解 12.ES5新特性 13.E...

    suosuopuo 评论0 收藏0
  • 深入理解ES6笔记(四)扩展的对象功能

    摘要:主要知识点有对象类别属性速记法方法简写需计算属性名方法方法可允许重复的属性自有属性的枚举顺序方法引用方法定义深入理解笔记目录对象类别普通对象拥有对象所有默认的内部行为。奇异对象其内部行为在某些方面有别于默认行为。所有的标准对象都是内置对象。 主要知识点有对象类别、属性速记法、方法简写、需计算属性名、Object.is()方法、Object.assign()方法、可允许重复的属性、自有属...

    awkj 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<