JavaScript中有七中内置类型:number(数字)、string(字符串)、boolean(布尔)、null(空值)、undefined(未定义)、object(对象)、symbol(符号,ES6中才有)。
注意:变量没有类型,但它们持有的值有类型。
null 空值
null
属于空值类型。
任何值我们都可以通过typeof来确定它的类型,但是也有特殊情况。
typeof undefined === 'undefined'; // true
typeof true === 'boolean'; //true
typeof 123 === 'number'; // true
typeof 'abcd' === 'string'; // true
typeof [1, 2, 3] === 'object'; //true
typeof Symbol() === 'symbol'; // true
typeof null === 'object'; // true
根据上面这7中类型查看,问题出现了,null属于空值类型,正确来说,typeof null === 'null'
, 为什么typeof 值的类型是object呢? 这就是属于JavaScript的一个bug了,并且存在了20多年,已经无法修复,我们只要记着就好了。
undefined 未定义
undefined
属于未定义类型。
undefined 与 null 的区别
通常情况下我们会将undefined
和 null
混淆, 但是它们传达的意思都差不多,但是也还是有些细微差别。
undefined 值从未赋值
null指曾赋过值,但是目前没有值
undefined 与 undeclared
var a;
console.log(a); // undefined
console.log(b); // ReferenceError: b is not undefined
变量在未持有值的时候为undefined
, 而 undeclared
表示b is not undeclared
, 变量没有被定义。注意:undefined
与 is not undeclared
是两回事儿。
string 字符串
string
属于字符串类型。
在JavaScript中字符串是不可变的。不可变是指字符串的成员函数是不会改变其原来的值,而是会创建一个新的字符窜。
number 数字
JavaScript中只有一种数值类型:number
,包括“整数”和带小数的十进制数。
JavaScript中没有真正意义上的整数,目前只有数字。
定义方式:
var a = 23;
var b = 23.4;
// 数字前面的0可以省略
var c = 0.23;
var d = .23;
// 小数点最后边的0可以省略
var f = 23.0;
var g = 23.;
精确度
JavaScript中的浮点数存在一定的精确度。
0.1 + 0.2 === 0.3; // false;
从数学角度说,上例中的返回值改为true,可为什么是false呢?
二进制浮点数中0.1和0.2并不是十分精确,他们相加的结果并非刚好等于0.3,而是一个比较接近0.3 的数字0.30000000000000004, 所以结果为false。
boolean 布尔
boolean
属于布尔类型,确只有两个值true
或者 false
。
转换为false
的情况:
null
undefined
0
-0
''
NaN
false
除了上面这几种情况外,其他都将为true
。
object 对象
object
属于对象类型,对象中主要包括数组、函数、自定义对象等。
在JavaScript中函数是属于object
类型,是object
的一个子类型。
typeof function a() {...} === 'object'; //true
下面这种特殊情况注意:
var a = {};
var b = {};
a === b; // false
虽然a、b都是空对象,但是两个对象并不是同一个对象,所以不相等。
symbol 符号
symbol
属于符号类型,ES6新增的基本数据类型。符号是具有唯一性的特殊值(并非绝对)。用它来命名不容易导致重名。
var mysym = Symbol('my own symbol');
mysym; // Symbol('my own symbol')
typeof mysym; // symbol
var a = [];
a[mysym] = 'foobar';
Symbols和其它基本类型大不一样。
从创建开始就是不可变的。你不能为它设置属性(如果你在严谨模式下尝试,会报类型错误)。它可以作为属性名。这是它的类字符串性质。
var sym = Symbol('3');
'your symbol is ' + sym; // TypeError: can't convert symbol to string
`your symbol is ${sym}`; //TypeError: can't convert symbol to string
你可以通过显示地将symbol转换为一个字符串来避免这个问题,通过String(sym)或者sym.toString()。