JavaScript 数据类型
数据类型就是 JavaScript 中可操作的数据的类型。
数据类型分为 值类型 与 引用类型 。
在 ES6 之前,主要有以下数据类型:
值类型 字符串 数字 布尔 null undefined 引用类型 对象 数组 函数
1. 为什么需要不同的数据类型
在学习自然数学的时候,所有的加法减法等操作都是针对数字的,数字 加上 操作符让他们有了意义。
在学习语文课的时候,不同的词语可以组合成句子,主谓宾语法与词语相互结合赋予了句子意义。
在 JavaScript 中也是如此,配合数据类型才能知道怎么对数据进行操作。
上一小节有提到的字符串与数字就是如此。
如 3 + 4 ,JavaScript碰到两边都是数字,就会做对应的加法操作。
程序需要不同类型的数据表示不同的 内容 ,分别做对应的处理。
2. 值类型
2.1 字符串
字符串由字符组成,字符串在使用的时候会使用双引号 (") 或者单引号 (') 包裹。
var str1 = '字符串' ; var str2 = "字符串" ; console . log ( str1 ) ; // 输出 :"字符串" console . log ( str2 ) ; // 输出 :"字符串"
上述例子中,两个变量都是字符串类型的,可以双引号和单引号包裹的结果是一样的。
但是如果需要在双引号包裹的字符串中使用双引号,或者在单引号包裹的字符串中使用单引号,需要使用 \ 进行转义,否则会报错,因为 JavaScript 无法知道字符串的结束位置。
var str1 = '使\'用\'单\'引\'号' ; var str2 = "使\"用\"双\"引\"号" ; console . log ( str1 ) ; // 输出 :"使'用'单'引'号" console . log ( str2 ) ; // 输出 :"使"用"双"引"号" // 以下 代码 会报错 var str3 = "哼" !" ; var str4 = '' 哼!' ;
大部分开发者会使用单引号包裹字符串。
因为为了网页的动态展示、复杂交互等,需要用 JavaScript 书写 HTML 模版,而 HTML 的 属性 按照习惯是使用双引号包裹的(XML 标准允许单引号和双引号,在 HTML5 的标准中甚至不需要书写引号)。
这样如果使用 JavaScript 中的字符串表示 HTML 就会变成如下情况:
var html = "<div class=\"title text-red\" style=\" dis play: inline-block;\">我是 一个 红色的 标题 </div>" ;
为了契合书写 HTML 的习惯,防止 代码 中充斥的大量的转义,就会使用如下使用单引号的形式。
var html = '<div class="title text-red" style=" dis play: inline-block;">我是 一个 红色的 标题 </div>' ;
2.2 数字
数字是最好理解的一种类型,因为生活中都会接触到。
数字可以细分为浮点数和整数,浮点数就是带有小数位的数,但事实上在 JavaScript 只有 64位的浮点数 ,具体的范围是 [-2^53 ~ 2^53] ,整数也使用浮点数表示。
数字类型也存在负数,如果数字的区间为 (0, 1) ,则可以省略小数点前的 0 。
var num1 = ; var num2 = . ; var num3 = ; var num4 = - ; var num5 = ;
以上是数字的一些表示方式。
如果数字的大小超过最大值或者最小值,那他的值在 JavaScript 中会表示为 Infinity 和 -Infinity 。
var base = ; var num1 = * base ; var num2 = - * base ; console . log ( num1 ) ; // 输出 :Infinity console . log ( num2 ) ; // 输出 :-Infinity
这两个值分别表示为 无穷大 和 无穷小 。
JavaScript 中还可以用数字表示 二进制 、 八进制 与 十六进制 。
二进制是以 0b 开头的数字。
var val10 = ; var val8 = ; console . log ( val10 ) ; // 输出 :10 console . log ( val8 ) ; // 输出 :8
在 输出 的时候还是会以十进制的结果进行 输出 。
八进制则可以用 0 开头的数字表示。
var val56 = ; console . log ( val56 ) ; // 输出 :56
十六进制使用 0x 开头表示。
var val10 = ; console . log ( val10 ) ; // 输出 :10
十六进制是比较常用的一种方式,二进制和八进制的表示使用相对较少。
2.3 布尔
布尔值表示两种状态,如同使用零和一区分状态的开关一样。
开关
布尔值两种状态对应 true 和 false 两个值。
通常 true 被称为 真值 , false 被称为 假值 ,两者也被统一称为 布尔值 。
var empty = true ; var isVIP = false ;
通常在只有两种状态的情况下会使用布尔值。
以下值在转换成布尔值的时候会转换成 false 。
null undefined NaN 0 ( 数字 0 ) 空字符串
2.4 null
null 是 一个 非常特殊的类型,表示对象的值未设置,也可以简单理解成 空 , 什么都没有 。
通常 null 会在应该 获取 到 一个 对象,但是没 获取 到的时候进行使用,结合对象会更好理解。
在初始化 一个 变量的时候,有时候类型不确定,或者应该是 一个 对象,但还有设置值的时候会使用到null。
var obj = null ;
2.5 undefined
undefined 从 中文 意思上理解就是不确定或者没有定义。
一个 变量在声明后如果没有赋值,他的值就是 undefined 。
var age ; console . log ( age ) ; // 输出 :undefined
一个 函数 在没有指定返回值的时候, 默 认就会返回 undefined 。
function fn ( ) { console . log ( '我是名字为fn的 函数 ' ) ; } var val = fn ( ) ; console . log ( val ) ; // 输出 :undefined
函数 fn 没有提供返回值,但 val 的值为 undefined 。
比较有趣的是, undefined 既是一种数据类型,在浏览器中又是作为 全局变量 存在的,也就是 window 对象下的 一个 属性 。
console . log ( 'undefined' in window ) ; // 输出 :true
使用 in 关键字可以校验某个对象下是否存在某个 属性 。这里的意思就是 undefined 属性 是否在 window对象 下存在。
控制台会 输出 布尔值 true ,为 一个 真值,表示 属性 是确实存在的。
3. 引用类型
3.1 函数
函数 其实是一段 JavaScript 代码 , 调用 函数 就会执行 函数 中的 代码 。
使用 function 关键字就可以定义 一个 函数 ,简单的 函数 语法如下:
function 函数 名 ( 参数 ) { 函数 体 ; return 返回值 ; } var ret = 函数 名 ( 参数 ) // 调用 函数
函数 名就是 函数 的名字,在 调用 函数 的时候会被使用到。
参数则是传递给 函数 的数据, 函数 内部可以访问到传进来的参数。
return 则标志着 函数 的结束,返回值会被作为结果进行返回。
function add ( arg1 , arg2 ) { var sum = arg1 + arg2 ; return sum ; } var num1 = add ( , ) ; var num2 = add ( , ) ; console . log ( num1 ) ; // 输出 :3 console . log ( num2 ) ; // 输出 :6
上面这个例子就是声明了 一个 名为 add 的 函数 ,其 功能 就是把两个参数求和并返回。
可以看到 函数 让 代码 更加有 意义 , 调用 add 函数 的地方可以很好的理解这里是在做求和操作,同时提高了 代码 的复用率。
3.2 对象
对象由 属性 和 方法 组成。
其格式如下:
var obj = { 属性 名 : 属性 值, 属性 名 : 属性 值, 方法 名 : 方法 , 方法 名 : 方法 , ' 属性 名3' : 属性 值 , } ;
属性 名和 方法 名都为字符串,如果其符合变量命名规范,则可以不使用引号包裹。
本质上 方法 也可以算作 一个 属性 ,通常在对象里 一个 属性 的 属性 值为 一个 函数 ,就会称之为 方法 。
var obj = { name : '小明' , age : , say : function ( ) { console . log ( '我叫' + this . name + ', 我的年龄是' + this . age + '岁' ) ; } , 'father-name' : '小蓝' , } ; console . log ( obj . name ) ; // 输出 :小明 console . log ( obj [ 'father-name' ] ) ; // 输出 :小蓝 obj . say ( ) ; // 调用 say 方法 ,会 输出 :我叫小明, 我的年龄是12岁
上述例子中的 obj 对象具有三个 属性 (name、age、father-name) 一个 方法 (say)。
属性 可以是任意的数据类型,格式为 属性 名: 属性 值 ,多个 属性 则由 逗号(,) 分隔, 方法 则只能为 一个 函数 ,通常会是 一个 匿名 函数 ( 函数 相关的详细 内容 可以查阅 函数 章节)。
通过 对象. 属性 就可以访问到对象 属性 的 属性 值,如果 属性 名是 一个 不符合变量命名规范的值,则可以通过 对象[' 属性 名'] 进行访问, 方法 同理,因为本质上 方法 也是 属性 。
既然 属性 可以是任意的数据类型,则也可以是 一个 对象:
var obj = { name : '小明' , colors : { hair : 'red' , eye : 'blue' , skin : 'white' , } , } ;
理论上在内存允许的情况下,可以进行无限层的对象嵌套。
以上的例子都是采用 字面量 的方式创建 一个 对象,还有许多种方式可以创建对象。
如使用 Object 构造 一个 新对象。
var obj = new Object ( ) ; obj . name = '小明' ; obj . age = ; obj . colors = { hair : 'red' , eye : 'blue' , } ; console . log ( obj . colors . hair ) ; // 输出 :red console . log ( obj . name ) ; // 输出 :小明 obj . name = '小红' ; console . log ( obj ) ; // 将会在控制台 输出 obj 对象
通过 new Object() 就可以创建 一个 新的对象。
通过 对象. 属性 = 属性 值 的方式就可以设置 一个 属性 和 属性 值,这一方式遵循以下规则:
如果要赋值的 属性 不存在,则会创建这个 属性 并赋值 如果要赋值的 属性 存在,则会 修改 这个 属性 的值
另外还可以使用 构造 函数 、 Object.create 等方式创建对象,具体请参考对象章节。
3.3 数组
数组是一组数据构成的列表。
数组由中括号包裹,每一项通过 逗号 进行分隔:
var arr = [ , '2' , , , ] ; console . log ( arr [ ] ) ; // 输出 :1 console . log ( arr [ ] ) ; // 输出 :"2"
和对象一样的是,数组的每一项也可以是任意类型的数据。
如果需要访问数组中的每一项可以通过 数组[下标] 的格式进行访问。
下标就是数组每一项的编号,这个编号从 0 开始,第一项为 0 ,第二项为 1 ,以此类推。
数组可以理解成一种特殊的对象,他原生具有一些 方法 ,如遍历数组:
var arr = [ 'a' , 'b' , 'c' ] ; arr . forEach ( function ( item , index ) { console . log ( item , index ) ; // "a" 0, "b" 1, "c" 2 } ) ;
通过 数组.forEach 的方式就可以遍历数组, forEach 方法 接受 一个 函数 ,这个 函数 在遍历到每一项的时候会被 调用 ,并将每一项的值和下标作为参数传递过来。
既然具有一些 方法 ,同样的也具有一些 属性 ,最常用的就是 length 属性 :
var arr = [ , , ] ; console . log ( arr . length ) ; // 输出 :3
数组的 length 属性 会返回数组的长度。
4. 值类型和引用类型的区分方式
从内存角度出发,值类型放在内存栈中,引用类型则放在内存堆中。
引用类型的数据长度是不固定的,如对象所占用的空间很大一部分由 属性 值决定,而 属性 值又可以是任意类型。
另外最大的区别就如 分类 名一样,引用类型的数据本身是指向内存上的一块地址,操作的时候对地址上的值进行操作。
而值类型直接操作值,不论是复制或是 修改 都是直接产生 一个 新的值。
var obj1 = { name : '小明' , } ; var obj2 = obj1 ; obj2 . name = '小红' ; console . log ( obj1 . name ) ; // 输出 :小红 var val1 = ; var val2 = val1 ; val2 = ; console . log ( val1 ) ; // 输出 :1
通过上面的例子就可以看出引用类型和值类型在 JavaScript 程序中的区别。
引用类型在进行复制的时候,其实就是多了 一个 引用,操作的值是同 一个 。
而值类型进行复制后,则是 一个 新的值。
5. 小结
数据类型是比较重要的 一个 概念,在 分类 上分为引用类型和值类型。 值类型 包括 :字符串、数字、布尔、null、undefined。 引用类型 包括 : 函数 、对象、数组。 引用类型相对复杂,每一种类型也具有很多特性,其 内容 可以参阅对应的章节。
JavaScript if 语句 ? ?JavaScript 变量