JavaScript数据类型
2016-02-20 18:10
603 查看
ECMAscript 中有5种简单的数据类型,也被称为基本数据类型:Undefined、Null、Boolean、Number和String。还有一种复杂的数据类型——Object。
Undefined 类型
在使用var 声明变量但未对其进行初始化时,这个变量的值就是undefined。如:
?
如果没有声明变量则会出现下面这种错误。如:
?
但是用typeof对其进行执行时,不管有没有声明都会返回undefined 值。如:
?
Null 类型
使用typeof检测null 时会返回"object"。如:
?
实际上undefined 值是派生自null 值的,因此他们相等都会返回true。如:
?
这里要注意的是,只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存null 值,此举有助于区分null 和 undefined。如:
?
Boolean 类型
要将一个值转换为其对应的Boolean 值,可以使用转型函数Boolean()。如:
?
《JavaScript高级编程设计》一书中的3.4.4中给出了关于各种数据类型及其对应的转换规则表格。大概有以下几种:
数据类型为String 时,任何非空字符串都会转换为true;
数据类型为Number 时,除了0 和NaN 会被转换为false 之外,其他都会转换为true;
数据类型为Object 时,除了null 之外,都会转换为true;
数据类型为Undefined 时,n/a 会被转换为true,undefined 会被转换为false;
这里要注意的是,if 语句经常使用自动执行响应的Boolean 转换作为条件。如:
?
Number 类型
除了可以以十进制表示之外,整数还可以通过八进制或者十六进制的字面值来表示,其中八进制字面值的第一位必须是0,然后是八进制数字序列(0~7)。如:
?
十六进制字面值的前两位必须是0x,后面跟任何十六进制数(0~9 及 A~F)。如:
?
浮点数值
这里要注意的是,永远不要比较特定的浮点数值。如:
?
数值范围
ECMAScript 能够表示的最大和最小数值保存在Number.MAX_VALUE 和Number.MIN_VALUE 之中。要想确定一个数值是不是有穷的,可以使用isFinite()函数。如:
?
NaN
0 除以0 会返回NaN,正数除以0 会返回Infinity,复数则会返回-Infinity。其次,NaN 与任何数值都不相等,包括它本身。另外函数isNaN()可以帮助我们确定这个参数是否“不是数值”。如:
?
数值转换
有三个函数可以把非数值转换为数值:Number()、parseInt()、parseFloat()。
Number()的转换规则如下:
如果是Boolean 值,true 和false 会被转换为1 和0。
如果是数字值,则不变。
如果是null 值,则转换为0。
如果是undefined,返回NaN。
如果是字符串则遵循下列规则:
如果只有数字,则转换为十进制数值。
如果是浮点格式,则将其转换成对应的浮点数值。同样也会忽略前导零。
如果是十六进制格式则会转换成十进制数。
如果字符串是空的,则会转换成0。
其他情况则会转换为NaN。
具体看下面的例子:
?
parseInt()的转换规则如下:
如果第一个字符不是数字字符或者符号,parseInt()会返回NaN。
用parseInt()转换空字符串会返回NaN。
如果第一个字符是数字字符,它会继续解析第二个字符,直到遇到了一个非数字字符.
下面是具体的例子:
?
另外需要注意的是,ECMAScript 5已经不具备解析八进制值的能力了所以为了消除这个问题,可以为这个函数提供第二个参数:转换时使用的基数(多少进制),具体如下:
?
多数情况下,最好默认设置成10进制。
parseFloat()的转换规则如下:
与parseInt()类似,不同的是字符串第一个小数点是有效的,而从第二个小数点开始包括第二个小数点是无效的。
他不能解析十六进制数值!!!
他只能解析十进制数值!!!
他没有用第二个基数来指定进制的用法。
下面是具体的例子:
?
String 类型
要把一个值转换成字符串有两种方式。第一种是使用几乎每个值都有的toString()方法。如下:
?
另外需要注意的是,null 和 undefined 不能转换。
?
如果不知道需要转换的数值是否是null 或者undefined 则应该使用转型函数String(),如果是null 会返回"null"如果是undefined 会返回"undefined"。如下:
?
复杂的数据类型
object
该类型实例化的对象,是一组数据和功能(函数)的集合。
实例化对象的过程有两种,一种是通过new操作符,一种是通过对象字面量表示法。
object类型是最基本的类型,我们可以在其基础上继承出更多的类型,像我们知道的Array()、Date()、还有有意思的function()类型,都是从object继承的,而且这些类型都在程序员使用前被默认设置了属性和方法,供程序员调用。
而以上类型又有一个笼统的称呼为引用类型。为什么是引用类型呢?
在学习C的时候,知道“ int a; int &ra=a;”,所以ra是a的引用,ra的类型为引用类型,系统并不为引用类型分配内存空间。
但是,js所指的引用类型,在《js高级程序设计》这本书里,也确实是这样的概念,obj只是引用类型,是堆内存中一个对象的别称,本身并不占用内存。
如图1
但是这本书里,也说对引用类型的访问是按照引用访问,但是当
这样将obj的值复给obj2时,会将堆内存中object的地址赋给obj2,这句话,又貌似是在说,在声明一个引用类型时,是会将实例化对象地址存到栈内存中,然后通过地址访问堆内存。
如图2
还有一个难点,也是我在学习引用类型的时候困惑的地方,C的时候,引用是可以做参数传递的,而且,引用不能被赋值,即不能改变引用的值。但是js中,函数的参数都是值传递的,而对于js内的引用类型,其值,也就默认为栈内存中的地址。
JS基本数据类型和引用数据类型的区别
JS基本数据类型的变量存放的是基本类型数据的实际值;而引用数据类型的变量保存对它的引用,即指针。
JS基本数据类型:null undefined number boolean
string比较特殊
引用数据类型:function object array
var a = 11;
var b = 1;
b = 12;
console.log(a); //11 a的值不会随b值得改变而改变
var a = [1,2,3];
var b = a;
a[0] = 2;
console.log(b[0]) //2, b的值随着a的值改变而改,因为他们指向同一个内存地址
var a = [1,2,3];
var b = a;
b = [11, 12, 13];//b指向了另一个内存地址,与a断开关联
a[0] = 2;
console.log(b[0]) //11,b的值不随a的值改变而改变
比如说 var a = 1; 1是基本数据类型,因此变量a存放的就是1这个值
var b = [1,2,3],[1,2,3]是引用数据类型,[1,2,3]是放在内存中的,而变量b存放的是[1,2,3]的地址,而不是[1,2,3]这个值
当使用b这个变量时,js解释器会通过b存放的内存地址,找到内存中的相应地址,将其中的值取出来返回
From:http://my.oschina.net/u/1992917/blog/359825
Undefined 类型
在使用var 声明变量但未对其进行初始化时,这个变量的值就是undefined。如:
?
?
?
使用typeof检测null 时会返回"object"。如:
?
?
?
要将一个值转换为其对应的Boolean 值,可以使用转型函数Boolean()。如:
?
数据类型为String 时,任何非空字符串都会转换为true;
数据类型为Number 时,除了0 和NaN 会被转换为false 之外,其他都会转换为true;
数据类型为Object 时,除了null 之外,都会转换为true;
数据类型为Undefined 时,n/a 会被转换为true,undefined 会被转换为false;
这里要注意的是,if 语句经常使用自动执行响应的Boolean 转换作为条件。如:
?
除了可以以十进制表示之外,整数还可以通过八进制或者十六进制的字面值来表示,其中八进制字面值的第一位必须是0,然后是八进制数字序列(0~7)。如:
?
?
这里要注意的是,永远不要比较特定的浮点数值。如:
?
ECMAScript 能够表示的最大和最小数值保存在Number.MAX_VALUE 和Number.MIN_VALUE 之中。要想确定一个数值是不是有穷的,可以使用isFinite()函数。如:
?
0 除以0 会返回NaN,正数除以0 会返回Infinity,复数则会返回-Infinity。其次,NaN 与任何数值都不相等,包括它本身。另外函数isNaN()可以帮助我们确定这个参数是否“不是数值”。如:
?
有三个函数可以把非数值转换为数值:Number()、parseInt()、parseFloat()。
Number()的转换规则如下:
如果是Boolean 值,true 和false 会被转换为1 和0。
如果是数字值,则不变。
如果是null 值,则转换为0。
如果是undefined,返回NaN。
如果是字符串则遵循下列规则:
如果只有数字,则转换为十进制数值。
如果是浮点格式,则将其转换成对应的浮点数值。同样也会忽略前导零。
如果是十六进制格式则会转换成十进制数。
如果字符串是空的,则会转换成0。
其他情况则会转换为NaN。
具体看下面的例子:
?
如果第一个字符不是数字字符或者符号,parseInt()会返回NaN。
用parseInt()转换空字符串会返回NaN。
如果第一个字符是数字字符,它会继续解析第二个字符,直到遇到了一个非数字字符.
下面是具体的例子:
?
?
parseFloat()的转换规则如下:
与parseInt()类似,不同的是字符串第一个小数点是有效的,而从第二个小数点开始包括第二个小数点是无效的。
他不能解析十六进制数值!!!
他只能解析十进制数值!!!
他没有用第二个基数来指定进制的用法。
下面是具体的例子:
?
要把一个值转换成字符串有两种方式。第一种是使用几乎每个值都有的toString()方法。如下:
?
?
?
object
该类型实例化的对象,是一组数据和功能(函数)的集合。
实例化对象的过程有两种,一种是通过new操作符,一种是通过对象字面量表示法。
object类型是最基本的类型,我们可以在其基础上继承出更多的类型,像我们知道的Array()、Date()、还有有意思的function()类型,都是从object继承的,而且这些类型都在程序员使用前被默认设置了属性和方法,供程序员调用。
而以上类型又有一个笼统的称呼为引用类型。为什么是引用类型呢?
var obj=new Object();
在学习C的时候,知道“ int a; int &ra=a;”,所以ra是a的引用,ra的类型为引用类型,系统并不为引用类型分配内存空间。
但是,js所指的引用类型,在《js高级程序设计》这本书里,也确实是这样的概念,obj只是引用类型,是堆内存中一个对象的别称,本身并不占用内存。
如图1
但是这本书里,也说对引用类型的访问是按照引用访问,但是当
var obj2=obj;
这样将obj的值复给obj2时,会将堆内存中object的地址赋给obj2,这句话,又貌似是在说,在声明一个引用类型时,是会将实例化对象地址存到栈内存中,然后通过地址访问堆内存。
如图2
还有一个难点,也是我在学习引用类型的时候困惑的地方,C的时候,引用是可以做参数传递的,而且,引用不能被赋值,即不能改变引用的值。但是js中,函数的参数都是值传递的,而对于js内的引用类型,其值,也就默认为栈内存中的地址。
JS基本数据类型和引用数据类型的区别
JS基本数据类型的变量存放的是基本类型数据的实际值;而引用数据类型的变量保存对它的引用,即指针。
JS基本数据类型:null undefined number boolean
string比较特殊
引用数据类型:function object array
var a = 11;
var b = 1;
b = 12;
console.log(a); //11 a的值不会随b值得改变而改变
var a = [1,2,3];
var b = a;
a[0] = 2;
console.log(b[0]) //2, b的值随着a的值改变而改,因为他们指向同一个内存地址
var a = [1,2,3];
var b = a;
b = [11, 12, 13];//b指向了另一个内存地址,与a断开关联
a[0] = 2;
console.log(b[0]) //11,b的值不随a的值改变而改变
比如说 var a = 1; 1是基本数据类型,因此变量a存放的就是1这个值
var b = [1,2,3],[1,2,3]是引用数据类型,[1,2,3]是放在内存中的,而变量b存放的是[1,2,3]的地址,而不是[1,2,3]这个值
当使用b这个变量时,js解释器会通过b存放的内存地址,找到内存中的相应地址,将其中的值取出来返回
From:http://my.oschina.net/u/1992917/blog/359825
相关文章推荐
- 2、JavaScript常用互动方法
- JavaScript中异步编程
- javascript变量声明提升(hoisting)
- JSON.parse()和JSON.stringify()
- 1、JavaScript入门篇
- [BZOJ1031][JSOI2007]字符加密Cipher 做题笔记
- 自己动手丰衣足食之Easyform表单验证插件&validate.js实时验证
- JS触发<a>,JS事件模拟
- js 不可变的原始值和可变的对象引用
- JavaScript基本语法、Console用法和Up&Going书籍总结
- Javascript作用域和变量提升
- XML,JSON文件解析
- javascript Date()
- JavaScript 实现Map
- javascript getTime()
- AutoComplete.js输入智能提示插件
- js中的arguments
- js中的小问题
- JSP九九乘法表打印和杨辉三角打印
- jsp if else c标签 总结