js数据类型
来源:互联网 发布:aop切面编程 android 编辑:程序博客网 时间:2024/06/03 16:29
概述
JavaScript语言的每一值,都属于某一种数据类型。JavaScipt的数据类型,共有六种。
- 数值(number) : 整数和小数(比如1和3.14)
- 字符串(string) : 字符组成的文本(比如”hello world”)
- 布尔值(boolean) : true(真)和false(假)两个特定的值
- undefined:表示未定义或者不存在,即由于目前没有定义,所以此处暂时没有值
- null : 表示无值,即此处的值是”无”的状态
- 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
- js数据类型
- js数据类型
- js数据类型
- js 数据类型
- js数据类型
- JS数据类型
- js数据类型
- JS数据类型
- JS数据类型
- js数据类型
- js 数据类型
- js数据类型
- js数据类型
- js 数据类型
- js数据类型
- JS数据类型
- JS 数据类型
- js数据类型
- sql中CONCAT函数使用
- Explain详解
- 安装pip,setuptools
- BOM之navigator对象和用户代理检测
- Android中.9.png文件的设计
- js数据类型
- Jackson解析
- C++primer 第十六章笔记 初稿
- ionic生成二维码和普通页面生成二维码js
- vs2015执行vs2013程序缺少dll的问题
- Modeling and Analyzing the Influence of Chunk Size Variation on Bitrate Adaptation in DASH 名字解释0728
- |2055|来淄博旅游
- new day
- 机器学习-->集成学习-->决策树详解