JS高程-3-1:数据类型

文章为《JavaScript高级程序设计》(第三版)笔记。

本小节包括:

  • 1.typeof操作符
  • 2.Undefined类型
  • 3.Null类型
  • 4.Boolean类型
  • 5.Number类型
  • 6.String类型
  • 7.Object类型

js中有6种数据类型,分别是:Undefined、Null、Boolean、Number、String 和 Object,ES6中又新增一个 Symbol,如果再算上 BigInt 的话就是 8 种。

1.typeof操作符

对一个值使用typeof操作符可能返回下列某个字符串:

  • "undefined"——如果这个值未定义;
  • "boolean"——如果这个值是布尔值;
  • "string"——如果这个值是字符串;
  • "number"——如果这个值是数值;
  • "object"——如果这个值是对象或null;
  • "function"——如果这个值是函数;
  • "symbol"——如果这个值是Symbol。

2.Undefined类型

使用var声明变量但未对其加以初始化时,这个变量的值就是undefined;如果声明一个函数且没有返回值,则默认值为undefined。

3.Null类型

null === undefined // 返回值为 true

若我们已知一个值为对象,则最好将其初始值设置为null,这样有利于我们区分null和undefined。

4.Boolean类型

该类型只有两个字面量:true和false。ECMAScript中所有类型的值都有与这两个Boolean值等价的值。可以是使用转型函数Boolean()。

5.Number类型

js中这种类型用来表示整数和浮点数值。除了用来表示十进制外,我们还可以表示八进制和十六进制。

其中,八进制字面量的第一位必须是零(0),然后是八进制数字序列(0~7)。

var octalNum1 = 070 // 八进制的56
var octalNum2 = 079 // 无效的八进制数值————解析为79

十六进制字面量的前两位必须是0x,后跟任何十六进制数字(0~9及A~F),字母也可小写

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

在进行算数计算时,所有八进制和十六进制表示的数值最终都将被转为十进制数值。

070 + 0xA  // 66

1)浮点数值

浮点数,即含有小数点的数。

var floatNum1 = 1.1;
var floatNum2 = 0.1;
var floatNum3 = .1;  // 有效,但不推荐

由于保存浮点数值需要的内存空间是保存整数值的两倍,因此ECMAScript会不失时机地将浮点数值转为整数值。

var floatNum1 = 1.;  // 小数点后没有数字————解析为1
var floatNum2 = 1.0; // 整数————解析为1

对于极大或极小的数值,可以用e表示法(即科学计数法)表示的浮点数值表示。

var floatNum = 3.125e7; // 等价于3.125乘以10的7次方,即31250000

浮点数的最高精度是17位小数,但在进行算数计算时其精度远远不如整数。例如,0.1加0.2的结果不是0.3。

0.1 + 0.2 == 0.3 // false

所以,我们永远不要测试某个特定的浮点数值。

2)数值范围

由于内存有限,ECMAScritp并不能保存所有的数值,其能表示的最小数值保存在 Number.MIN_VALUE中——多数浏览器中,这个值为5e-324;能表示的最大数值保存在 Number.MAX_VALUE中,这个值是1.7976931348623157e+308。如果这个值超过了js的数值范围,那么将被自动转为Infinity值。若是负数,则会被转为-Infinity(负无穷);若是正数,则会被转为Infinity(正无穷)。我们可以通过 isFinite()函数判断一个数值是不是有穷的。

3)NaN

NaN,即非数值,这个用于表示一个本来要返回数值的操作数未返回数值的情况。

NaN有两个特点。首先,任何涉及NaN的操作(如NaN/10)都会返回NaN;其次,NaN与任何值都不相等,包括NaN本身。

NaN == NaN; // false

js中,我们可以用isNaN()函数判断某个数是否不是数值。

4)数值转换

有三个函数可以把非数值转换为数值:Number()、parseInt()和parseFloat()。第一个转型函数Number()可以用于任何数据类型,而另两个函数则专门用于把字符串转换为数值。

Number()函数

转换规则:

  • 如果是Boolean类型,true和false分别转换为1和0;
  • 如果是数字值,则返回数字值;
  • 如果是null,返回0;
  • 如果是字符串,则分为:1.字符串中只含数字(包括前面的正负号),则转换为十进制数值,“1”变为1,“011”变为11(会省略前面的0);2.字符串中含有有效的浮点格式,如“01.1”变为1.1;3.字符串中包含有效的十六进制格式,如“0xf”,则转换为相同大小的十进制数;4.如果字符串是空的,则转换成0;5.如果字符串为上述格式之外的字符,则转为NaN。

parseInt()函数

我们在转换整数时用得更多的还是parseInt()函数。它会忽略字符串前面的空格,直到找到第一个非空格字符。如果第一个字符不是数字字符或者负号,parseInt()就会返回NaN;如果第一个是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。如,“1234Bule”会转为1234,“22.5”会转为22。

parseInt()也能够识别进制格式,如

parseInt('0xA'); // 10(十六进制数)
parseInt('070'); // 56(八进制数)

在解析八进制数时,ES3和ES5存在分歧。如上例中的"070",ES3认为是56(八进制)ES5认为是70(十进制)。为了解除这个问题,可以在使用时加上第二个参数:转换时使用的基数(即多少进制)。

parseInt('10', 16); // 16(十六进制数)
parseInt('10', 10); // 10(十进制数)
parseInt('10', 8); // 8(八进制数)
parseInt('10', 2); // 2(二进制数)

我们在使用parseInt()转换十进制时,往往会省略第二个参数,但更好的习惯还是加上第二个参数10。

parseFloat()函数

与parseInt()类似,parseFloat()也是从第一个字符开始解析每个字符。字符串中的第一个小数点是有效的,而第二个小数点就是无效的了,因此后面的字符串将被忽略。另外,parseFloat()没有第二个参数,只能解析十进制。

parseFloat('1234bule'); // 1234
parseFloat('0xA');      // 0
parseFloat('22.34.5');  // 22.34

6.String类型

1)字符字面量

String数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符,或者具有其他用途的字符。

var test = '\u03a3';
test.length; // 1

2)字符串的特点

ECMAScript中字符串是不可变的,要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量。如:

var lang = 'Java';
lang = lang + 'Script';

3)转换字符串

有两种方法。第一种,使用几乎每个值都有的toString()方法。数值、布尔值、对象和字符串值都有toString()方法,但null和undefined值没有这个方法。

多数情况下,调用toString()方法不必传递参数。但在调用数值的toString()方法时,可以传递一个参数:输出数值的基数,默认值为10。

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

第二种,使用转型函数String(),其规制如下:

  • 如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果;
  • 如果值是null,则返回"null";
  • 如果值是undefined,则返回"undefined"。

如果要把某个值转为字符串,还可以使用加号操作符把它与一个字符串("")加在一起,如 10 + "",结果为"10"。

7.Object类型

对象可以用new操作符来创建。

var o = new Object(); // 这里可以省略括号,但不推荐这样做

Object的每个实例都具有下列属性和方法:

  • constructor:保存用于创建当前对象的函数。就上面例子而言,o的构造函数是Object();
  • hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中是否存在。其中参数必须为字符串形式;
  • isPrototypeOf(object):用于检查传入的对象是否是当前对象的原型;
  • propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举;
  • toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区有关;
  • toString():返回对象的字符串表示;
  • valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同。

猜你喜欢

转载自blog.csdn.net/qq_39025670/article/details/104868803
3-1