一、基本数据类型
JavaScript 的数据类型,共有六种。(ES6 又新增了第七种 Symbol 类型的值,本阶段不涉及。)
-
数值(number):整数和小数/又称浮点数(比如
1
和3.14
) -
字符串(string):文本(比如
Hello World
)【需要通过引号引起来】 -
布尔值(boolean):表示真伪的两个特殊值,即
true
(真)和false
(假) -
undefined
:表示“未定义”或不存在,所以此处暂时没有任何值,当声明的变量没有赋值时打印结果为undefined -
null
:表示空值,即此处的值为空 -
对象(object):各种值组成的集合
(1)原始类型(primitive type)的值:通常,数值、字符串、布尔值这三种类型合称为原始类型,它们是最基本的数据类型,不能再细分了。
(2)合成类型(complex type)的值:对象则称为因为一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器。
(3)还有两个特殊值:undefined
和null
对象是最复杂的数据类型,又可以分成三个子类型。
-
狭义的对象(object)
-
数组(array)
-
函数(function)
狭义的对象和数组是两种不同的数据组合方式,除非特别声明,之后课程中提到的“对象”都特指狭义的对象。函数其实是处理数据的方法,JavaScript 把它当成一种数据类型,可以赋值给变量,这为编程带来了很大的灵活性,也为 JavaScript 的“函数式编程”奠定了基础。
①null和undefined
-null表示一个“空”的对象,转为数值时为0
-undefined表示一个“此处无定义”的原始值,转为数值时为NaN(not a number)
②boolean
-真:true (空数组[]、空对象{}...)
-假:false (undefined、null、0、NaN、""/''空字符串)
二、判断值的数据类型的方法
-typeof运算符:可以返回一个值的数据类型
- 数值、字符串、布尔值返回值分别为number、string、boolean
- 函数返回function
- undefined返回undefined
- 对象返回object
- null返回object【这是一个历史遗留问题,1995年的 JavaScript 语言第一版,只设计了五种数据类型(对象、整数、浮点数、字符串和布尔值),没考虑
null
,只把它当作object
的一种特殊值。后来null
独立出来,作为一种单独的数据类型,为了兼容以前的代码,typeof null
返回object
就没法改变了。 】
var num = 10;
var pai = 3.14;
var str1 = "1234";
var str2 = "muxiao"
var flag = "true"
var unde;
var obj = new Object();
var arr = [];
function f() {};
console.log(typeof num);//number
console.log(typeof pai);//number
console.log(typeof str1);//string
console.log(typeof str2);//string
console.log(typeof flag);//boolean
console.log(typeof unde);//undefined
console.log(typeof obj);//object
console.log(typeof arr);//object
console.log(typeof f);//function(函数的一个对象类型)
-instanceof运算符:可以判断具体对象
-Object.prototype.toString:判断是否数组类型(是返回true,不是返回false)
三、数值
(1)整数和浮点数
- JavaScript内部所有数字都是以64位浮点数形式存储(1和1.0是相同的)
-由于浮点数不是精确的值,所有在涉及小数的运算和比较要小心
(2)数值精度
- 第1位:符号位,0表示正数,1表示负数(决定数值的正负)
- 第2位到第12位(共11位):指数部分(决定数值大小)
- 第13位到64位(共52位):小数部分(有效数字,决定数值的精度)
(3)数值范围
- 如果一个数大于2的1024次方,会发生“正向溢出”
- 如果一个数小于2的-1075次方(指数部分-1023加小数部分52位)发生“负向溢出”即 JavaScript 无法表示这么小的数,这时会直接返回0。
(4)NaN
- NaN是JavaScript的特殊值,表示非数字(not a number),主要出现在将字符串解析成数字出错的场合【用isNaN(变量名)验证结果是不是NaN或者判断是否为数值】
var x = 0.1;
var y = 0.2;
console.log(x + y);// 0.30000000000000004
//三个等号是完全等于的意思,比较两边是否完全等于返回false证明不精确
console.log(0.1 + 0.2 === 0.3);// false
console.log(0.3 / 0.1);// 2.9999999999999996
console.log((0.5 - 0.4) === (0.3 - 0.2));// false
// 大于2的53次方之后,整数运算的结果开始出现错误
// 2的53次方是一个16位的10进制数值
console.log(Math.pow(2, 53));// 9007199254740992
console.log(Math.pow(2, 53) + 1);// 9007199254740992
console.log(Math.pow(2, 53) + 2);// 9007199254740994
console.log(Math.pow(2, 53) + 3);// 9007199254740996
console.log(Math.pow(2, 53) + 4);// 9007199254740996
// 大于2的53次方之后,多出来的有效数字都会无法保存,变成0
console.log(9007199254740992111);// 9007199254740992000
console.log(Math.pow(2, 1024));// Infinity(无穷大)
console.log(Math.pow(2, -1075));// 0
// 数字类型的范围:最大值和最小值
console.log(Number.MAX_VALUE);// 1.7976931348623157e+308
console.log(Number.MIN_VALUE);// 5e-324
var num;
console.log(num + 10);// NaN
// 注意:不要用NaN验证NaN
console.log(num + 10 == NaN);// false
// =赋值 ==等于 ===完全等于
// 用isNaN(变量名)验证结果是不是NaN
console.log(isNaN(num));// true --- 不是数值
var num2 = 123;
console.log(isNaN(num2));// false --- 是数值