1. ![未命名图片.png](https://cdn.nlark.com/yuque/0/2019/png/168000/1567690989896-1fe0092c-a239-47ec-94ab-612858d08fcb.png "未命名图片.png")


类型判断 typeof

Javascript是弱类型语言,定义变量时不需要显示的指定数据类型

不初始化变量时,默认会被初始化为Undefined类型

  1. var a; //相当于var a = undefined;

有初始化情况下,变量的类型则会根据初始化的值改变而改变

  1. var a = 1; //此时a为数值类型
  2. a = '1'; //此时a为字符串类型
  3. a = false; //此时a为布尔类型

typeof 操作符可以用于判断这些变量的类型

  1. var a = 1;
  2. typeof a; //number
  3. var b = 'a';
  4. var c = "a";
  5. typeof b; //string
  6. typeof c; //string;
  7. var d = true;
  8. var e = false;
  9. typeof d; //boolean
  10. typeof e; //boolean
  11. var f = null;
  12. typeof f; //object
  13. var h = function() {};
  14. typeof h; //function
  15. var a;
  16. typeof a; //unfined

基本数据类型

Undefined类型

该类型的值只有一个值,即undefined。
在变量被定义时未初始化的时候,默认情况下,该变量被赋予了Undefined类型,即undefined。

  1. var a;
  2. a == undefined //true
  3. typeof a; // undefined

需要注意的是,对于未定义的变量,使用typeof操作符也同样返回undefined,但是访问未定义的变量会报语法错误

  1. typeof b; //假设b是未定义的变量,使用typeof依然返回undefined
  2. alert(b); //这样使用b,则会产生语法错误

**

Null类型

该类型的值只有一个值,即null。
它是一个空指针对象,是一个对象类型,因此使用typeof检测返回的是object。
一般情况下,需要将变量初始化或者赋值为null,该变量的类型才算是null。

  1. var b = null;
  2. typeof b; //object
  3. var a = 1;
  4. typeof a; //number
  5. a = null; //重新赋值
  6. typeof a; //object

与Undefined类型的区别:

  • undefined是从null类型派生出来的,使用==做比较总是返回true

Boolean类型

该类型的变量只有两种值:truefalse

  1. var isA = true;
  2. var isB = false;

需要注意的是:Boolean类型的变量赋值是区分大小写的,即初始化为TrueFalse是不合法的定义。
这时候True 和 False 会被作为变量名解析,这样使用会产生语法错误

  1. var isA = True; //错误
  2. var isB = False; //错误

Number类型

定义

通常情况下,Number类型用于表示数字,即整型(整数)和浮点型(带小数点)
实际上,Javascript还可以使用Number类型来表示八进制十六进制的数值,八进制和十六进制在进行数值运算时会自动转换成十进制数。

八进制数

  • 第一位数字必须为0
  • 紧跟第一位数字的是0~7
  • 如果设置的数值超出了八进制的范围,第一位的0则被忽略,后面的数值自动转换为十进制数
    1. var octalNum1 = 070; //有效的八进制数,对应十进制的56
    2. var octalNum2 = 079; //无效的八进制,解析为79
    3. var octalNum3 = 08; //无效的八进制,解析为8

*需要注意的是:在严格模式下,八进制的数值是不允许的,Javascript引擎会抛出异常

十六进制数

  • 必须以0x开头
  • 后面紧跟十六进制数值,即0~9、a-z、A-Z
    1. var hexNum1 = 0xA; //十六进制数的10
    2. var hexNum2 = 0x1f; //十六进制数的31

浮点数值

即带小数点的数字,需要包含一个小数点,且小数点后面至少有一位数字

  1. var a = 1.0;
  2. var b = 1.1;
  3. var c = .1;

如果小数点后面没有数字或者只有一个0,则会被解析成整数

  1. var a = 1. //解析成1
  2. var b = 1.0 //解析成1

对于那些较大或者较小的数字,采用科学计数法来表示数字,即e表示法。

  1. var a = 3.14e10; //3.14乘以10的10次方
  2. var a = 2*e-2; //2乘以10的负2次方,即2/100

浮点数进行计算时,由于精度较高(最多17位小数点),因此会产生误差
例如0.1 + 0.2 = 0.3,实际结果是0.30000000000000004,
因此在做比较判断时会得到意想不到的结果

  1. 0.1+0.2 === 0.3 //返回false,因为0.3实际的值是0.30000000000000004

数值范围

由于内存的限制,Number类型并不能保存所有的数值,因此定义了最大值和最小值来限制取值的访问

  • 最大值,使用Number.MAX_VALUE表示,其值为1.7976931348623157e308
  • 最小值,使用Number.MIN_VALUE表示,其值为5e-234;

如果计算的数值已超出了取值范围,自动转换为Infinity(无穷)类型

  • 小于Number.MIN_VALUE,转换为-Infinity,即负无穷
  • 大于Number.MAX_VALUE,转换为Infinity,即正无穷

被转换为Infinity类型的数值,是不能进行数值计算的。可以通过isFinite()函数来判断一个数值是否为Infinity类型

  1. var largeNum = Number.MAX_VALUE + Number.MAX_VALUE;
  2. isFinity(largeNum); //true,超出了最大值范围,返回Infinity类型

NaN,非数值

用于表示一个本来返回数值的变量未返回数值(这样就不会返回错误)。
在其他编程语言中,进行数值计算时,除以0都会报错,而Javascript则返回NaN

NaN有两个特点:

  • 任何与NaN操作相关的都会返回NaN
  • NaN不等于任何的值(包含它自己)
    1. NaN == NaN //false

isNaN()函数可以用于判断一个值是否不能返回一个数值,如果不能返回true,如果可以返回false

  1. isNaN('123abc'); //true,不能转换为数字,所以非数值
  2. isNaN('blue'); //true,不能转换为数字,所以非数值
  3. isNaN('123'); //false,能转换为数字,所以为数值
  4. isNaN(123); //false,能转换为数字,所以为数值
  5. isNaN(true); //false,能转换为数字(false可以转换为0),所以为数值

String类型

定义

string类型是有零个或者多个16位Unicode字符组成的字符序列(即字符串)。
字符串由一对单引号(')或双引号(")包含起来

  1. var a = 'ken';
  2. var b = "hello";

需要注意的是,以单引号开头的字符串必须以单引号结束,以双引号开头的字符串必须以双引号结束
以下的写法都是错误的

  1. var a = 'hello";
  2. var b = "hello';

不可变性

Javascript中的字符串是不可变的,需要改变字符串的内容,首先消耗掉原来的字符串,然后在创建一个新的字符串

  1. var a = 'Hello';
  2. a += ' World'; //output:Hello World

操作流程

  1. 创建一个包含’Hello’的字符串a
  2. 修改a字符串的内容为’Hello World’,先创建一个对应字符串长度的新字符串(这里是11,包含空格)
  3. 然后再讲新的内容(即’Hello World’)填充到新的字符串中
  4. 原来的字符串(即’Hello’)就会被丢弃掉

因此,像这类型的字符串连接在一些旧的浏览器(版本较低的浏览器,如IE6)中执行起来较慢,大部分的浏览器已进行了优化。

转义序列

字符串中的特殊字符,有些特殊字符串,虽然在代码书写中占用2个或两个以上的字符,最终还是被解析成一个字符串,比较常见的有:

字符 含义
\n 换行
\t 制表符,对应键盘上的tab
\b 空格,对应键盘上的空格
\r 回车,对应键盘上的回车
\\ 斜杠
\‘ 单引号,用于单引号字符串中的转义,如:’\‘fasdaf\‘’
\“ 双引号,用于双引号字符串中的转义,如:”\“fasdfasf\“”

以上的这些字符,在字符串中都被当成一个字符解析,如:

  1. let a = 'Hello\r';
  2. a.length //返回6,\r被当成一个字符解析

Object类型

复合类型,多用于定义一组数据和功能的集合

创建方式

1、使用new关键,创建一个Object空对象,并动态地设置属性和方法

  1. var obj = new Object();
  2. obj.name = 'Lilei';
  3. obj.age = 10;
  4. obj.say = function() {
  5. console.log('Hello');
  6. }

上述的代码中:

  1. 创建一个名为obj的空对象
  2. 设置一个名为name的字符串类型的属性,值为’Lilei’
  3. 设置一个名为age的数值类型的属性,值为10
  4. 设置一个名为say的方法,在控制台中打印一段文字’Hello’

2、使用一对花括号( {} ),将属性和功能包含起来,采用这个方式修改上述代码

  1. var obj = {
  2. name:'Lilei',
  3. age:10,
  4. say:function() {
  5. console.log('Hello');
  6. }
  7. };

这些属性和方法都属于obj对象的成员变量,必须使用英文字符的逗号(,)隔开,否则Javascript解析报错

关键属性

  • hasOwnProperty(propertyName),判断当前对象实例中是否存在某个属性。
  • isPrototypeof(object),检查传入的对象是否是另外一个对象的原型
  • propertyIsEnumerable(propertyName),检查属性是否可以通过(for-in)枚举的方式访问
  • toLocaleString(),返回当前地区对应的执行环境下的对象字符串
  • toString(),返回对象字符串的表示
  • valueOf(),返回对象的字符串、数值、布尔值的返回值

参考资料

《Javascript高级程序设计(第3版)》第三章数据类型