js数据类型

来源:互联网 发布:aop切面编程 android 编辑:程序博客网 时间:2024/06/03 16:29

概述

JavaScript语言的每一值,都属于某一种数据类型。JavaScipt的数据类型,共有六种。

  1. 数值(number) : 整数和小数(比如1和3.14)
  2. 字符串(string) : 字符组成的文本(比如”hello world”)
  3. 布尔值(boolean) : true(真)和false(假)两个特定的值
  4. undefined:表示未定义或者不存在,即由于目前没有定义,所以此处暂时没有值
  5. null : 表示无值,即此处的值是”无”的状态
  6. object :各种值组成的集合

通常,我们将数值、字符串、布尔值称为原始类型(primitive type)的值,即它们是最基本的数据类型,不能再细分了。而将对象称为合成类型(complex type)的值,因为一个对象往往是过个原始类型的值的合成,可以看成是一个存放各种值的容器。至于undefined和null,一般将它们看成两个特殊值。

对象又可以分成三个子类型

狭义的对象(object)
数组(array)
函数(function)

狭义的对象和数组是两种不同的数据组合方式,而函数其实是处理数据的方法。JavaScript把函数当成一种数据类型,可以像其他的数据类型一样,进行赋值和传递,这位编程带来很大的灵活性,此后除非特别声明,本教程的随想都指狭义的对象。

typeof运算符

JavaScript有三种方法,可以确定一个值是什么类型。

typeof运算符
instanceof运算符
Object.prototype.toString方法

typeof运算符可以返回一个值的数据类型,可能有一下结果。

原始类型

数值、字符串、布尔值分别返回number、string、boolean。

typeof 123 //"number"typeof '123' //"string"typeof false //"boolean"

函数

函数返回function

function f(){}typeof f// "function"

undefined

undefined返回undefined

typeof undefined//"undefined"

利用这一点,typeof可以检查一个没有声明的变量,而不报错

v//  ReferenceError: v is not definedtypeof v// "undefined"

上面代码中,变量v没有用var命令声明,直接使用就会报错。但是,放在typeof后面,就不会报错了,而是返回undefined。

实际编程中,这个特点通常用在判断语句。

//错误的写法if(v){    //...}// ReferenceError: v is not defined//正确的写法if(typeof v === "undefined"){    //...}

其他

除此之外,其他情况都返回object。

typeof windwo //"object"typeof {} //"object"typeof [] //"object"typeof null //"object"

从上面的代码可以看到,空数组([])的类型也是object,这表示在JavaScript内部,数组本质上只是一种特殊的对象。

另外,null的类型也是object,这是由于历史原因造成的。1995年JavaScript语言的第一版,所有值都设计成32位,其中最低的3位用来表述数据类型,object对应的值是000。当时,只设计了五种数据类型(对象、整数、浮点数、字符串和布尔值),完全没考虑null,只把它当作object的一种特殊值,32位全部为0。这是typeof null返回object的根本原因。

为了兼容以前的代码,后来就没法修改了。这并不是说null就属于对象,本质上null是一个类似于undefined的特殊值。

既然typeof对数组(array)和对象(object)的显示结果都是object,那么怎么区分它们呢?

instanceof运算符可以做到。

var o = {};var a = [];o instanceof Array //falsea instanceof Array //true

null和undefined

概述

null和undefined都可以表示“没有”,含义非常相似。将一个变量赋值为undefined或null,老实说,语法效果几乎没有区别。

var a = undefined;//或者var a = null;

上面代码中,a变量分别被赋值为undefined和null,这两种写法的效果几乎等价。

在if语句中,它们都会被自动转换为false,相等运算符(==)甚至直接报告两者相等。

if(!undefined){    console.log('undefined is false');}//undefined is falseif(!null){    console.log('null is false');}//null is falseundefined == null;//true

从上面代码可见,两者行为是何等相似!谷歌公司开发的JavaScript语言替代品Dart语言,就明确规定只有null,没有undefined!

既然含义与用法都差不多,为什么要同时设置两个这样的值,这不是无端增加复杂度,令学者困扰吗?这与历史原因有关。

1995年JavaScript诞生时,最初像Java一样,只设置了null表示”无”的值。根据C语言的传统,null被设计成可以自动转化为0;

Number(null) //05 + null //5

但是,JavaScript的设计者Brendan Eich,觉得这样做还不够,有两个原因。首先,null就像Java一样,被当成一个对象。但是,JavaScrip的值分成原始类型和合成类型两大类,Brendan Eich觉得表示无的值最好不是对象。其次,JavaScript的最初版本没有包括错误处理机制,发生数据 类型不匹配时,往往是自动转换类型或者默默的失败。Brendan Eich觉得,如果null自动转换为0,很不容易发现错误。

因此,这样的区分在实践中很快就被证明不可行。目前null和undefined基本是同义的,只有一些细微的差别。

null的特殊之处在于,JavaScript把它包含在对象类型(obejct)之中。

typeof null //"obejct"

注意,JavaScript的标识名区分大小写,所以undefined和null不同于Undefined和Null,后者只是普通的变量。

用法和含义

对于null和undefined,可以大致像下面这样理解。

null表示空值,即该处的值为空。调用函数时,某个参数未设置任何值,这时可以传入null。比如,某个函数接受引擎抛出的错误作为参数,如果运行过程中未出错,那么这个参数就会传入null,表示未发生错误。

undefined表示未定义,下面返回undefined的典型场景。

//变量声明了,但没有赋值var i;i //undefined//调用函数时,应该提供对的参数没有提供,该参数等于undefinedfunction f(x){    return x;}f() //undefined//对象没有赋值的属性var o = new Object();o.p //undefined//函数没有返回值,默认返回undefinedfunction f(){}f() //undefined

布尔值

布尔值代表”真”和“假”两个状态,”真”用关键字true表示,“假”用关键字false表示。布尔值只有这两个值。

下面的运算符会返回布尔值:

两元逻辑运算符 : &&(And),|| (Or)
前置逻辑运算符:!(Not)
相等运算符:=== , !==,==,!=
比较运算符 :>,>=,<,<=

如果JavaScript预期某个位置应该是布尔值,会将给位置上现有的值转换为布尔值。转换规则是除了下面六个值被转换为false,其他值都视为true。

undefined
null
false
0
NaN
“”或”(空字符串)

if(''){    console.log(true)}//没有任何输出

上面代码的if命令后面的判断条件,预期应该是一个布尔值,所以JavaScript自动将空字符串,转为布尔值false,导致程序不会进入代码块,所以没有任何输出。

需要特别注意的是,空数组([])和空对象({})对应的布尔值,都是true。

if ([]) {  console.log(true);}// trueif ({}) {  console.log(true);}// true

摘自 http://javascript.ruanyifeng.com

原创粉丝点击