变量类型

来源:互联网 发布:js皮肤哪个好 编辑:程序博客网 时间:2024/06/01 21:42

JavaScript中有七中内置类型:number(数字)、string(字符串)、boolean(布尔)、null(空值)、undefined(未定义)、object(对象)、symbol(符号,ES6中才有)。

注意:变量没有类型,但它们持有的值有类型

null 空值

null 属于空值类型。

任何值我们都可以通过typeof来确定它的类型,但是也有特殊情况。

typeof undefined === 'undefined'; // truetypeof true === 'boolean'; //truetypeof 123 === 'number'; // truetypeof 'abcd' === 'string'; // truetypeof [1, 2, 3] === 'object'; //truetypeof Symbol() === 'symbol'; // truetypeof null === 'object'; // true

根据上面这7中类型查看,问题出现了,null属于空值类型,正确来说,typeof null === 'null', 为什么typeof 值的类型是object呢? 这就是属于JavaScript的一个bug了,并且存在了20多年,已经无法修复,我们只要记着就好了。

undefined 未定义

undefined 属于未定义类型。

undefined 与 null 的区别

通常情况下我们会将undefinednull 混淆, 但是它们传达的意思都差不多,但是也还是有些细微差别。

undefined 值从未赋值null指曾赋过值,但是目前没有值

undefined 与 undeclared

var a;console.log(a); // undefinedconsole.log(b); // ReferenceError: b is not undefined

变量在未持有值的时候为undefined , 而 undeclared 表示b is not undeclared, 变量没有被定义。注意:undefinedis 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 的情况:

nullundefined0-0''NaNfalse

除了上面这几种情况外,其他都将为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; // symbolvar 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()。

0 0