JavaScript 数据类型
编程语言都有内置的数据结构,但各种编程语言的数据结构常有不同之处。本文试图列出JavaScript语言中内置的数据结构。
1.动态类型
JavaScript 是一种弱类型或者说动态语言。这意味着你不用提前声明变量的类型,在程序运行过程中,类型会被自动确定。这也意味着你可以使用同一个变量保存不同类型的数据
var data = 42; // data is a Number now
var data = "JavaScript"; // data is a String now
var data = true; // data is a Boolean now
2.数据类型详解
首先,我们要明确一点JavaScript的数据类型即为值的数据类型。JavaScript中有7种数据类型(6种基本数据类型,1种引用类型)
哪7种数据类型
最新的 ECMAScript 标准定义了 7 种数据类型:
- Boolean
- Null
- Undefined
- Number
- String
- Symbol (ECMAScript 6 新定义)
- Object
基本类型详解
- undefined 类型
undefined型只有一个值,即特殊的undefined。使用var 或者 let 声明变量但未对其加以初始化时,这个变量的值就就是undefined。例如
var a;
console.log(a === undefined);// true
let b;
console.log(b === undefined);// true
- null 类型
null型也只有一个值,即null,使用typeof操作符检测返回object。如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null而不是其它值。这样只要直接检测null值就可以知道相应的变量是否已经保存了一个对象的引用了。
let a = null;
console.log(typeof a); // "object"
实际上,ECMAScript中,可以认为undefined值是派生自null值的,所以undefined==null但是undefined!==null(不推荐这样比较和使用)
console.log(undefined==null);//true
console.log(undefined===null);//false
- boolean 类型
boolean型只有两个字面值true,false。但是这两个值和数字值不是一回事,因此true不一定等于1,而false也不一定等于0。
要将一个值转为boolean型等价的值,有两种方案:
一种是显式转换-调用类型转换函数Boolean()
一种是自动转换-如if(value)中的value就会自动转化成为boolean值
- number 类型
number类型用来表示整型和浮点数字,还有一种特殊的数值(NaN- not a number,这个数值用于表示一个本来要返回数值的操作数未返回数值得情况-防止抛出错误)。
比如在其它语言中数值÷0都会导致错误,停止运行,但是在JS中。0/0、NaN/0会返回NaN,其它数字/0会返回Infinity,不会报错。
任何涉及与NaN的操作都会返回NaN,JS有一个isNaN()函数,可以判断接收的参数是否为NaN,或者参数转化为数字后是否为NaN
console.log(NaN + 1); // NaN,任何涉及到NaN的操作都会返回NaN
console.log(NaN === NaN); // false,NaN与任何值都不相等,包括NaN本身
console.log(isNaN(NaN)); // true,是NaN
console.log(isNaN('10')); // false,被转为数字10
console.log(isNaN(true)); // false,被转为数字1
console.log(isNaN(null)); // false,被转为数字0
console.log(isNaN(undefined)); // true,返回NaN
console.log(isNaN('hello')); // true,无法转换为数字
console.log(0/0);// NaN,0/0返回NaN
console.log(NaN/0);// NaN,NaN/0返回NaN
console.log(1/0);// Infinity,其它数字/0返回Infinity
console.log('1'/0);// Infinity,'1'成功转为数字
console.log('1a'/0);// NaN,'1a'转为数字失败,变为NaN
console.log(Infinity/0);// Infinity,其它数字/0返回Infinity
- string 类型
string类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。字符串可以由单引号(')或双引号(")表示。任何字符串的长度都可以通过访问其length属性取得。
- symbol 类型
ES5 的对象属性名都是字符串,这容易造成属性名的冲突。ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。它是 JavaScript 语言的第七种数据类型,这样就可以解决这个问题。Symbol 值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。
let s = Symbol();
typeof s
// "symbol"
上面代码中,变量s就是一个独一无二的值。typeof运算符的结果,表明变量s是 Symbol 数据类型,而不是字符串之类的其他类型。
注意,Symbol函数前不能使用new命令,否则会报错。这是因为生成的 Symbol 是一个原始类型的值,不是对象。也就是说,由于 Symbol 值不是对象,所以不能添加属性。基本上,它是一种类似于字符串的数据类型。
Symbol函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。
let s1 = Symbol('foo');
let s2 = Symbol('bar');
s1 // Symbol(foo)
s2 // Symbol(bar)
s1.toString() // "Symbol(foo)"
s2.toString() // "Symbol(bar)"
上面代码中,s1和s2是两个 Symbol 值。如果不加参数,它们在控制台的输出都是Symbol(),不利于区分。有了参数以后,就等于为它们加上了描述,输出的时候就能够分清,到底是哪一个值。
- 引用数据类型
复杂 类型即引用型,也就是我们常说的JS对象(包括普通的object型对象和function型对象)
对象其实就是一组数据和功能的集合。对象可以通过执行new操作符后跟要创建的对象类型的名称来创建。而创建Object的实例并为其添加属性和(或)方法,就可以创建自定义对象。如
var o = new Object();//创建一个新的自定义对象{}
也就是说,除去基本类型,剩余的就是引用型(包括内置对象,自定义对象等)都是基于Object进行拓展的
更多有用成长信息请关注我的个人公众号:指尖的宇宙 您也可以搜索:supreme_mindest 找到我。
用文字记录生命,践行终生成长。