好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

JavaScript 数据类型

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 变量

查看更多关于JavaScript 数据类型的详细内容...

  阅读:60次

上一篇

下一篇

第1节:什么是 JavaScript    第2节:学习环境准备    第3节:调试方案    第4节:JavaScript 变量    第5节:JavaScript 数据类型    第6节:JavaScript if 语句    第7节:for 语句    第8节:JavaScript 算数运算符    第9节:JavaScript 比较运算符    第10节:JavaScript 逻辑运算符    第11节:JavaScript 函数    第12节:JavaScript 表达式    第13节:JavaScript 对象    第14节:JavaScript 字符串    第15节:JavaScript 数字    第16节:JavaScript 数组    第17节:JavaScript switch 语句    第18节:JavaScript while 语句    第19节:JavaScript 的 break 与 continue    第20节:JavaScript with    第21节:document.cookie    第22节:JavaScript Function    第23节:JavaScript Math    第24节:JavaScript Date    第25节:JavaScript RegExp    第26节:JavaScript JSON    第27节:什么是 DOM    第28节:DOM 和 JavaScript 的关系    第29节:获取和操作 DOM 节点    第30节:DOM 与事件    第31节:DOM 事件绑定    第32节:DOM 事件对象    第33节:DOM 事件流    第34节:事件相关的优化    第35节:自定义事件    第36节:表单校验    第37节:什么是 BOM    第38节:常用的 BOM 相关对象    第39节:BOM 常用属性和方法    第40节:AJAX    第41节:异常处理    第42节:三元运算符    第43节:逗号操作符    第44节:void    第45节:typeof    第46节:delete 操作符    第47节:debugger    第48节:getter & setter    第49节:new 运算符与构造函数    第50节:JavaScript 原型    第51节:JavaScript instanceof    第52节:JavaScript this    第53节:严格模式    第54节:作用域    第55节:闭包    第56节:变量提升    第57节:对象包装器    第58节:Lodash    第59节:moment    第60节:swiper    第61节:ECMAScript 6    第62节:Node.js    第63节:Babel    第64节:CSS 预处理器    第65节:代码规范    第66节:TypeScript    第67节:WebComponents    第68节:Vue、React、Angular    第69节:小程序    第70节:JavaScript 关键字    第71节:分号导致的问题    第72节:对象属性访问问题    第73节:this 使用问题    第74节:浮点数精度问题    第75节:独一无二的 NaN    第76节:避免全局污染    第77节:控制台观察对象问题    第78节:根据环境选择语言特性    第79节:相关资源