• 什么是数据类型?
  • 数据类型有哪些?
  • 如何查看数据类型?
  • undefined 和 null 的区别?
  • 布尔类型

 

什么是数据类型?


 

计算机的本质是计算,计算的本质是对值进行操作,无论是参与计算的值,还是通过计算得到的值,在计算机中都统一称为数据。计算机的语言其实就是对各种数据进行处理,为了更好地处理数据,所以就把数据分门别类地归纳好,这个分类结果,叫数据类型。

 

数据类型有哪些?


 

JS 中一共有 5+1 种数据类型:数字、字符串、布尔、undefined、null、object。

前5种是基础数据类型,也叫简单数据类型或原始数据类型,而除了这5种数据类型,其他数据统一称为object(对象)。对象其实就是由不同属性组成的一个无顺序合集。例如,有一个对象 student,这个对象包含了 name, age, famous, boyfriend, hobbies 5个属性,这些属性对应的值的类型分别是字符串、数字、布尔值、undefined 和 object。其中 hobbies 是 student 对象的一个属性,而它本身也是一个对象,包含了三个数据类型为字符串的值。对象的属性值可以是任意一种数据类型,而且这些属性都是没有顺序的,可以任意调换它们的位置。

var student = {
    name: “suki”,
    age: 21,
    famous: false,
    boyfriend: undefined,
    hobbies: [“tennis”, “guitar”, “drawing”]
};

JS 非常灵活,在 JS 中,除了5种基础数据类型以外,其他所有东西都可以用对象来表示。

 

比如一支笔,它有长度、颜色、价格等属性,另外,笔还可以写字。“可以写字”这个属性是笔可以做的事情,在 JS 中,这种属性有一个特殊的名字,叫“方法”。本质上,只有对象拥有方法,其他基础数据类型是没有方法的。下面的例子说明了基础数据类型不能拥有属性。

var a = “abcd”;  // 声明一个变量a并赋值为”abcd”

a.len = 4;  // 为属于基础数据类型的a添加属性len

alert(a.len);  // undefined

当我们给基础数据a设置属性的时候,之所以没有报错,是因为 JS 解释器在这里把a转换成了对象,而在属性设置这一步结束之后,这个对象马上就被销毁了,所以在下一步我们尝试获取这个属性时失败了。同样的,基础数据类型也是没有方法的,即使我们在对 a 使用了toUpperCase 方法,但之后再去查看时,a 仍然是小写的”abcd”。

a.toUpperCase();

alert(a);  // abcd

当运行 a.toUpperCase() 时,JS 先把 a 转换成了对象,再去调用这个对象的方法,返回运行结果,但是这个结果是不会自动保存的,除非手动地把这个结果赋值给一个变量,例如 a = a.toUpperCase();(这里把方法调用的结果保存到变量 a 中,其实就相当于重新给 a 赋值了),之后这个对象就被销毁了。

 

这里引出了 JS 中另外一种数据分类方法。JS 中的数据还可以分为可变的和不可变的两种,在 JS 中,所有基础数据类型都是不可变的,只有对象是可以改变的。

var a = “abcd”;

a = “abcdef”;  // 并不是对“abcd”这个字符串进行了修改,而是把一个新的字符串“abcdef”重新赋值给 a

 

如果要对数据进行比较,基础数据类型比较的是两个“值”是否相等,而对象比较的是两个“引用”是否相等。在 JS 中任何两个独立的对象都是不相等的,即使它们的内容完全一样。

var a = 123;
var b = 123;

alert(a === b);  // true


var obj1 = {
    name: “suki”,
    age: 21
};

var obj2 = obj1;

alert(obj1 === obj2);  // true  obj1和obj2引用的是同一个对象


var obj1 = {
    name: “suki”,
    age: 21
};

var obj2 = {
    name: “suki”,
    age: 21
};

alert(obj1 === obj2);  // false  虽然obj1和obj2拥有完全相同的属性,但它们是两个独立的对象

 

如何查看数据类型?

ECMAScript 数据类型具有动态性,JS 定义一个变量仅仅是给它赋值了,并没有确定这个变量的数据类型,只有在参与计算的时候,JS 才会动态地去取对应的数据类型。在 JS 中我们可以使用typeof 去查看数据的类型。需要注意的是,typeof 的所有返回值都是字符串。

按理说,对应 JS 的6种数据类型,typeof 也应该有对应的6种返回值,事实上虽然 typeof 有6种返回值,但它们与 JS 的6种数据类型并非一一对应。typeof 的6种返回值分别是:

“undefined”, “boolean”, “string”, “number”, “object”, “function”。

没有”null”,却多了一个”function”。

如果使用 typeof 去查看 null 的值,会返回“object”,但这其实是个小错误,因为 JS 底层把二进制前三位为0的数据判断为 object,而 null 的二进制全部是0,所以被判断为 object,但其实它是一种基础数据类型,所以判断数据类型的时候使用 typeof 并非完全靠谱。

 

typeof 其实是一个操作符,虽然可以写成 typeof (123)这种格式,但是不要误以为它是一个函数。关于要不要加括号以及在哪里加:

var a = true;
var b = true;

alert(typeof a == b);  // 是 (typeof a) == b ? 还是 typeof (a == b) ?

// 运行时其实是这种情况
alert((typeof a) == b);  // “boolean” == true ? fals

这个结果可能会与预期有出入,建议使用 typeof 时可以加上括号,

// 不是建议像这样写成像函数的样子
alert(typeof (a == b));  // “boolean”

// 而是建议在整个表达式外面加一对括号
alert((typeof a == b));  // “boolean”

(如果是特别简单的可以不加括号,但如果是比较复杂的情况可以加上括号避免误解或出错)

 

undefined 和 null 的区别?


 

相同点:

1, 这两种数据类型都只有一个值,undefined数据类型只有一个值就是undefined,null数据类型也只有一个值就是null;

2, 两者参与判断都返回 false;

3, 两者都没有方法;

 

不同点:

1,在 JS 中,null 是一个关键字,而 undefined 不是;

var null = 123;  // 报错
var undefined = 123;  // 不会报错

2,undefined 除了是一种数据类型,它还是 window 对象的一个属性,这个属性的值就是 undefined。如果使用 a === undefined 去判断一个 a 是不是 undefined,JS 首先会获取a,然后把它拿到 window 里面去,逐个与 window 的属性比较,直到比较到 undefined 为止。因为 window 里有很多属性,这种查找方法特别消耗性能,所以不建议使用这种方法;可能会在一些代码中看到自己在函数中先定义一个 undefined 的情况,就是为了解决消耗性能的问题吧;

3,undefined 代表的是未初始化,例如声明一个变量而不给它赋值,这个变量的默认值 undefined,虽然 undefined 的字面意思是“未定义”,但这个变量是已经定义了的,只是还没有初始化。但是 null 不一样,当你给一个变量赋值 null 的时候,这个变量已经经过初始化了,它的值就是空;

4,使用 typeof 查看数据类型的时候,null 会返回 “object”,undefined 会返回 “undefined”;

4, Number(undefined) 会返回 NaN,Number(null) 会返回0;

 

用法:

1, 当你声明一个变量的时候,可以不给它赋值,但如果你必须给它赋值又不知道用什么值得时候,可以把 null 赋值给它;

2, 当你一定要用全等(===)来检测某一个值是否存在的时候,使用 undefined;

3, 当你要用全等(===)来检测一个值是否为空的时候,使用 null;

 

新手建议:

1,不要在给变量赋值的时候使用 undefined ;

2,判断某个值是否存在或者为空的时候,可以使用 a == null(但存在性能问题);

3,如果明确知道需要判断某个值为undefined或者null时,使用全等,a === undefined 或 a === null;

 

布尔类型


 

可能会在一些代码中看到它的简写形式: bool;

用途: 判断或者对结果进行比较;

返回值: true 或 false;

所有数据类型都可以转换成布尔类型,可以使用 Boolean() 把其他数据类型转换成布尔类型。但只有6个数据会被转换成false:undefined,null,0,-0,NaN,““(空字符串),除此以外,其他所有数据都会被转换成true.

简单的转换方法: !!

 

 

 

记录整理from沙翼老师的#陪你读书#教程第四期(喜马拉雅)