第2章 JavaScript数据类型--1(概述和基本数据类型)—读书笔记

目录

2.1 JavaScript数据类型

2.2  Undefined类型和Null类型

2.3 Boolean类型

2.4 Number类型

2.5 String类型


2.1 JavaScript数据类型

1 数据类型

基本数据类型(五种):Undefined、Null(空对象的引用)、Boolean(布尔值)、Number(数值)、String(字符串)

一种复杂数据类型:Object

备注:ES6中添加数据类型Symbol

2 扩展

对象是最复杂的数据类型,又可以分成三个子类型:

狭义的对象(object)

数组(array)

函数(function)

注意:除非特别声明,本教程的“对象”都特指狭义的对象。

2.2  Undefined类型和Null类型

1 概念

Undefined类型:只有一个值undefined,表示未定义

Null类型:只有一个值null,表示对空对象的引用。

2 对于尚未声明的变量,只能执行typeof操作符检测其类型(虽然也能执行delete,但无意义),且返回undefined

3 注意

1)在if语句中undefined和null会被自动转换成false

2)在相等(==)运算符中,两者相等

"use strict"//表示严格模式
if (undefined){      //if语句中undefinednull会被自动转换成false
   
console.log("true");   //不执行
} else {
   
console.log("false");   //执行,返回false
}

if (null){   //if语句中undefinednull会被自动转换成false
   
console.log("true");   //不执行
} else {
   
console.log("false");  //执行,返回false
}

console.log(null == undefined);  //true

 

4 返回“undefined”场景,一共四种。

"use strict"//表示严格模式
var i;
console.log(i);    //undefined。变量i声明但是没有赋值,所以返回undefined

function  myF(x) {
   
return x;
}

console.log(myF()); //undefined。调用函数时,应该提供的参数没有提供,该参数等于 undefined

var obj = new Object();
console.log(obj.p);  //undefined。对象没有赋值的属性

function myFun() {
   
//没有return语句时。
}
console.log(myFun());//undefined。函数没有返回值时,默认返回 undefined

2.3 Boolean类型

1 两个值:true 和false

2 Boolean:调用函数Boolean()可以将任何值转换为Boolean值。其中转换为false规则:

Undefined:undefined

Object :null

Boolean:false

Number:0和NaN

String:””(空字符换)

"use strict"//表示严格模式
var a = false;
var b = undefined;
var c = " "//一个空格
var d = "";   // 空字符串
var f = 0;
var g = NaN;
var h = null;

console.log(Boolean(a));  //false
console.log(Boolean(b));  //false
console.log(Boolean(c));  //true
console.log(Boolean(d));  //false
console.log(Boolean(f));  //false
console.log(Boolean(g));  //false
console.log(Boolean(h));  //false

3 注意

空数组([])和空对象({})对应的布尔值,都是true

2.4 Number类型

1 JavaScript 内部,所有数字都是以64位浮点数形式储存,即使整数也是如此。所以,1与1.0是相同的,是同一个数。容易造成混淆的是,某些运算只有整数才能完成,此时 JavaScript 会自动把64位浮点数,转成32位整数,然后再进行运算

"use strict"//表示严格模式

  console.log(1 === 1.0) //true

  console.log(2 === 2.00) //true

2 浮点数值

表示方法:小数点和科学计数法

注意:永远不要测试某个特定浮点数值(0.1+0.2不等于0.3

"use strict"//表示严格模式
var a = 0.1;
var b = 0.2;
console.log(a+b === 0.3);  //false,并不是bug,而是因为采用了IEEE754格式来表示浮点数,存在误差

var c = 0.05;
var d = 0.25;
console.log(c + d === 0.3);   //true

console.log(0.3 / 0.1); //2.9999999999999996

3 数值精度

根据国际标准 IEEE 754,JavaScript 浮点数的64个二进制位,从最左边开始:

第1位:符号位,0表示正数,1表示负数。决定正负

第2-12位(共11位):指数部分,大小为0-2047。决定数值的大小

第13-64位(共52位):小数部分(即有效数字),决定数值的精度

注意:精度最多只能到53个二进制位,这意味着,绝对值小于2的53次方的整数,即-253到253,都可以精确表示。

4 数值范围

则 JavaScript 能够表示的数值范围为21024到2-1023(开区间),超出这个范围的数无法表示。

1)最小值保存在:Number.MIN_VALUE

2)最大值保存在:Number.MAX_VALUE

3)超出数值范围就会自动变为Infinity,正数变为Infinity,负数变为-Infinity。

注意:使用isFinite()判断是否为正负无穷,如果是数值范围内,则返回true

5 数值表示法

1)字面表示法

十进制:如165

十六进制:如Ox2f

2)科学计数法

JS自动将数值转换成科学计数法情况:小数点前的数字多于21位。小数点后的零多于5个。

6 数值的进制(四种)

十进制

八进制:前缀为“0o”或者“0O”。(另外也用“0”,严格模式和ES6废除这种方式)

十六进制:前缀为“0x”或“0X”

二进制:前缀为“0b”或“0B”

注意:默认情况下,JavaScript 内部会自动将八进制、十六进制、二进制转为十进制。如果八进制、十六进制、二进制的数值里面,出现不属于该进制的数字,就会报错

7 零:-0,+0

"use strict";
console.log(-0 === +0) ;//true
console.log(0 === +0); //true
console.log(-0 === 0); //true
console.log(1 / + 0 ); //Infinity
console.log(1 / - 0 ) ;//-Infinity
console.log(1 / + 0 === 1 / - 0 ) ; //false
console.log(-0 / ) ; //-0
console.log(-0 / 1 === +0 / 1 ) ; //true

1) 相同点

JavaScript 内部实际上存在2个0:一个是+0,一个是-0,区别就是64位浮点数表示法的符号位不同。它们是等价的。几乎所有场合,正零和负零都会被当作正常的0。

2)区别

唯一有区别的场合是,+0或-0当作分母,返回的值是不相等的。

8 NaN

1)意义:非数值,表示本来用来返回数值的操作数未返回数值的情况

"use strict";

  console.log(0 / 0) ;  //NaN

  console.log(typeof NaN) ;  //number

2)特点:

数组的indexOf方法内部使用的是严格相等运算符,所以该方法对NaN不成立;

与任何值都不相等,包括自己;

NaN与任何数(包括它自己)的运算,得到的都是NaN

NaN在布尔运算时被当作false

"use strict"//表示严格模式
console.log(NaN == NaN);   //返回false
console.log(NaN === NaN);  //false
console.log([NaN].indexOf(NaN));  //-1。数组的indexOf方法内部使用的是严格相等运算符,所以该方法对NaN不成立。
console.log(Boolean(NaN));  //false

3)isNaN()

函数确定该值是不是NaN。该函数接收到参数之后,就会尝试转换为数值,如果不能,返回false

9 Infinity(正无穷)-Infinity(负无穷)

1)Infinity大于一切数值(除了NaN),-Infinity小于一切数值(除了NaN);

2)Infinity与NaN比较,总是返回false。

3)运算规则

A 符合无穷的数学计算规则

B  0乘以Infinity,返回NaN;0除以Infinity,返回0;Infinity除以0,返回Infinity。

C Infinity加上或乘以Infinity,返回的还是Infinity。

D Infinity减去或除以Infinity,得到NaN。

E Infinity与null计算时,null会转成0,等同于与0的计算。

F Infinity与undefined计算,返回的都是NaN

"use strict";
console.log(1 / -0); //-Infinity。非0整数除以-0为负无穷
console.log(-1 / -0); //Infinity

//Infinity大于一切数值(除了NaN),-Infinity小于一切数值(除了NaN
console.log(Infinity > 10);  //true
console.log(-Infinity < -10);  //true

//Infinity
NaN比较,总是返回false
console.log(-Infinity > NaN);  //false

//
四则运算
/*
1
符合无穷的数学计算规则
2 0乘以Infinity,返回NaN0除以Infinity,返回0Infinity除以0,返回Infinity
3 Infinity加上或乘以Infinity,返回的还是Infinity
4 Infinity减去或除以Infinity,得到NaN
5 Infinitynull计算时,null会转成0,等同于与0的计算。
6 Infinityundefined计算,返回的都是NaN
*/

10 与数值相关的方法

1) Number():用于任何数据类型

转换规则

第2章 JavaScript数据类型--1(概述和基本数据类型)—读书笔记

2)parseInt()

将字符串转为整数。一个或者两个参数,第一个是需要转换的字符串str,第二个是转换时使用的基数(进制数)(可以省略)。如果parseInt()的参数不是字符串,则会先转为字符串再转换。

A) 忽略前面空格,如果第一个字符不是数字或者负号,则返回NaN。使用parseInt(“ ”)(空字符串)会返回NaN

字符串转为整数的时候,是一个个字符依次转换,如果遇到不能转为数字的字符,就不再进行下去,返回已经转好的部分。

"use strict"//表示严格模式
var str1 = "";
console.log(parseInt(str1));   //NaN

B) 无论基数是哪个,最后结果都会转换成十进制。parseInt()的返回值只有两种可能,要么是一个十进制整数,要么是NaN。

基数为十进制:

基数为八进制:

基数为十六进制:如果指定进制为16进制,则字符串可以省略“0X/0x”

基数为二进制:

对于那些会自动转为科学计数法的数字,parseInt会将科学计数法的表示方法视为字符串,因此导致一些奇怪的结果。

"use strict"//表示严格模式
var str = "0198hij"//按十进制转换
console.log(parseInt(str));   //返回198
console.log(parseInt(str,8));   //返回1
console.log(parseInt(str,16));   //返回408
//
如果字符串以0x0X开头,parseInt会将其按照十六进制数解析。
//如果字符串以0开头,将其按照10进制解析。
console.log(parseInt("0x10"));   //返回16
//
对于那些会自动转为科学计数法的数字,parseInt会将科学计数法的表示方法视为字符串,因此导致一些奇怪的结果。
console.log(parseInt(1000000000000000000000.5));    //1
console.log(parseInt(1e+21));    //1
console.log(parseInt(0.0000008));    //8

 

C)parseInt方法还可以接受第二个参数(2到36之间),表示被解析的值的进制,返回该值对应的十进制数。默认情况下,parseInt的第二个参数为10

如果第二个参数不是数值,会被自动转为一个整数。这个整数只有在2到36之间,才能得到有意义的结果,超出这个范围,则返回NaN。如果第二个参数是0、undefined和null,则直接忽略。

D)

"use strict";
//如果字符串包含对于指定进制无意义的字符,则从最高位开始,只返回可以转换的数值。如果最高位无法转换,则直接返回NaN
console.log(parseInt("12562", 2)); //1
console.log(parseInt("32562", 2)); //NaN

//
前面说过,如果parseInt的第一个参数不是字符串,会被先转为字符串。这会导致一些令人意外的结果
console.log(parseInt(0x11, 36)); // 43。十六进制的0x11会被先转为十进制的17,再转为字符串。
console.log(parseInt(0x11, 2));// 1

//
等同于
console.log(parseInt(String(0x11), 36));  //43
console.log(parseInt(String(0x11), 2));    //1

3) parseFloat():将一个字符串转为浮点数。

专门用于字符串,只解析十进制,只有一个参数。如果是十六进制格式的字符串转换,则返回0

"use strict"//表示严格模式
var str1 = "0x125fdh";
console.log(parseFloat(str1));   //0

如果字符串符合科学计数法,则会进行相应的转换;

如果字符串包含不能转为浮点数的字符,则不再进行往后转换,返回已经转好的部分;

parseFloat方法会自动过滤字符串前导的空格;

如果参数不是字符串,或者字符串的第一个字符不能转化为浮点数,则返回NaN

parseFloat会将空字符串转为NaN。

4) isNaN()

A)isNaN方法可以用来判断一个值是否为NaN。

B)注意:isNaN只对数值有效,如果传入其他值,会被先转成数值。比如,传入字符串的时候,字符串会被先转成NaN,所以最后返回true,这一点要特别引起注意。也就是说,isNaN为true的值,有可能不是NaN,而是一个字符串。如下:

对于对象和数组,isNaN也返回true。

对于空数组和只有一个数值成员的数组,isNaN返回false。

C)使用isNaN之前,最好判断一下数据类型。

D)判断NaN更可靠的方法是,利用NaN为唯一不等于自身的值的这个特点,进行判断。

5)isFinite()

isFinite()方法返回一个布尔值,表示某个值是否为正常的数值。返回false规则: Infinity、-Infinity、NaN和undefined这几个值会返回false

2.5 String类型

1 字符串:由0个或多个Unicode字符序列构成,用双引号和单引号括起来都行。

2 字符字面量

1)特殊的字符:转义序列“\”

其实反斜杠还有以下三种用法

\HHH:反斜杠后面紧跟三个八进制数(000到377),代表一个字符。

\xHH:\x后面紧跟两个十六进制数(00到FF),代表一个字符。

\uXXXX:\u后面紧跟四个十六进制数(0000到FFFF),代表一个字符。

2)length属性:字符串长度,该属性无法改变

var str = "aubf";
console.log(str.length);  //4
str.length = 2
console.log(str.length);   //4

注意:格

3)多行字符串

如果字符串必须分为多行,可以在每一行的尾部使用反斜杠“\”,输出还是一行。

连接运算符(+)可以连接多个单行字符串,将长字符串拆成多行书写,输出的时候也是单行。

3 字符串特点:不可变

4 字符集

JavaScript 使用 Unicode 字符集。JavaScript 引擎内部,所有字符都用 Unicode 表示。

每个字符在 JavaScript 内部都是以16位(即2个字节)的 UTF-16 格式储存。也就是说,JavaScript 的单位字符长度固定为16位长度,即2个字节JavaScript UTF-16 的支持是不完整的,由于历史原因,只支持两字节的字符,不支持四字节的字符

5 base64编码

6 转换成字符串

1)toString(),一般是某某值“.”调用

数值、布尔值、对象、字符串有该方法,但null和undefined没有。

在调用数值的toString()时,可以指定一个参数,为返回数值的基数(即进制数),默认为十进制数

"use strict"//表示严格模式
var num = 32;
console.log(num.toString());   //32
console.log(num.toString(2));   //100000
console.log(num.toString(8));   //40
console.log(num.toString(16));   //20

2)String()转型方法,传入的参数是需要转型的值

A)用于任何类型。

B)转换规则:

如果值有toString()方法,则调用该方法;

如果值是null,则返回“null”;

如果值是undefined,则返回“undefined”

"use strict";
var a = null;
console.log(String(a));  //返回null
var b = undefined;
console.log(String(b));  //返回undefined
var c = 10;
console.log(String(c));  //返回10

 

如有错,请指出,如有侵权,请联系我,谢谢!

参考资料

1 JavaScript 教程https://wangdoc.com/javascript/basic/grammar.html

2 《JavaScript高级程序设计 第3版》