简单说明:
1. JavaScript中有6种数据类型,Undefined/Null/Boolean/Number/String/Object,需要注意的是不支持创建自定义类型的机制.所有值必须如上6中类型之一
2.typeof操作符可以操作变量,也可以操作字面量,虽然也可以typeof()类似函数调用使用,但是其并非内置函数,函数在Js中是对象而不是数据类型,可通过此来区分
数据类型:
Undefined
说明: undefined类型只有一个值undefined,var声明变量时,没有赋值的变量会隐式赋值为undefined,其主要作用是用于区分空对象和未经初始化的变量
//userInfo是Undefined类型 var userInfo console.log( //值默认是undefined userInfo, //类型返回的字符串是undefined typeof userInfo, //类型返回的字符串是undefined typeof userName )
注意: var声明未赋值的变量与未声明的变量通过typeof语句判断类型时都返回undefined,所以为了避免此种情况的发生,强烈建议声明的变量必须赋值
Null
说明: Null派生自Object,typeof返回object,作为一个空对象引用,如果变量准备用来保存对象,最好将变量初始化为null,这样当检查null值就知道对象是否已经创建
//空对象: 表示这个对象还未创建 var userName = undefined var userInfo = null console.log( //值为null userInfo, //Null和Undefined的值相等 userInfo == userName, //类型返回的字符串是object typeof userInfo, //类型返回的字符串是undefined typeof userName, //Null和Undefined的类型不等 userInfo === userName )
注意: undefined派生自null,因此Js规定它们相等性测试(alert(undefined==null))返回true,可通过typeof变量的类型来比较,但是还是强制大家变量要初始化
Boolean
说明: Boolean只有两个值true/false,Js中所有类型的值都有与它们等价的值,包括显式转换Boolean()或条件语句中的隐式转换
数据类型 | 转换为true | 转换为false |
Boolean | true | false |
String | 任何非空字符串 | 空字符串 |
Number | 任何非零数字值(包含无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | undefined |
//isActived是Boolean类型 var isActived = true console.log( //值为true isActived, //类型返回的字符串是boolean typeof isActived, //空字符串转换为false Boolean(''), //0转换为false Boolean(0), //NaN转换为false Boolean(NaN), //null转换为false Boolean(null), //undefined转换为false Boolean(undefined) )
Number
说明: Number类型包含整型和浮点型,输入字面值支持二进制/八进制(0开头,超出0则自动按10进制)/十进制/十六进制(0X开头,超出则报异常),输出都是十进制
//userAge的类型为Number类型 var userAge = 25 console.log( //值为25 userAge, //类型返回的字符串是number typeof userAge )
1. 整数值的字面量支持八进制/十进制/十六进制
// 整数值 - 八进制 var octNum = 0700 console.log(octNum) // 整数值 - 十进制 var intNum = 1000 // 整数值 - 十六进制 var hexNum = 0xFF console.log(hexNum)
2.浮点值的字面量支持小数,科学计数法,但是小数点前或后面必须至少有一位数字,对于那些过大或过小的数值,可以使用科学计数法来表示
var floatNum = 0.80 // 浮点值 - 有效,但不推荐此写法 var floatNum = .8 console.log(floatNum) /* 浮点值 - 隐式转换 由于保存浮点数内存占用比整数值大两倍,所以Js会自动将可以转换为整型的浮点值转换为数值 */ var floatNum = 8.0 // var floatNum = 8. console.log(floatNum) // 浮点值 - 科学计数法 var floatNum = 3.14e9 console.log(floatNum) var floatNum = 0.00000000314 console.log(floatNum)
注意:浮点数最高精度是17,但算术运算可能不准确,例如console.log(0.1+0.2),会出现0.30000000000000004,运算结果会不准确,所以做判断时要考虑这个问题(如使用整型判断)
3.数值型值有最大值(Number.MAX_VALUE)和最小值(Number.MIN_VALUE),超出最大值返回(Number.POSITIVE_INFINITY),超出最小值返回(Number.NAGITIVE_INFINITY),可通过inFinite()判断是否超出范围,没超出返回true,超出返回false
// 浮点值 - 最小值 var floatNum = Number.MIN_VALUE console.log(floatNum) // 浮点值 - 小于最小值返回-Infinity(Number.POSITIVE_INFINITY) var floatNum = -1000e1000 console.log(floatNum) // 浮点值 - 最大值 var floatNum = Number.MAX_VALUE console.log(floatNum) // 浮点值 - 超出最大值返回Infinity(Number.NEGATIVE_INFINITY) var floatNum = 1000e1000 console.log(floatNum) // 判断值 - 通过isFinite()判断是否超出范围,没有超出返回true,否则返回false console.log(isFinite())
4.NaN即非数值(Number.NaN)表示本来希望返回数值的但是没有返回数值,0/0或num/0*0都返回NaN,任何数除以0返回Infinity,
// NaN - 0除以0返回(Number.NaN) var nanNum = 0/0 console.log(nanNum) // NaN - 任何数除以0返回无穷大(Number.POSITIVE_INFINITY) var nanNum = 12/0 console.log(nanNum) // NaN - 任何数除以0再乘以0返回(Number.NaN) var nanNum = 12/0*0 console.log(nanNum) // NaN - NaN不与任何值相等 console.log(NaN==NaN) // NaN - NaN与任何值运算的结果均为NaN console.log(Number.NaN + 1) // NaN - isNaN()可以判断任意类型数据 console.log( // true isNaN(Number.NaN), // false, 250是一个数值 isNaN(250), // false, 空字符串转换为数值0 isNaN(''), // false, true转换为数值1 isNaN(true) )
注意: 由于NaN可由多种方式出现,所以NaN不与任何值相等包括它自己,任何值与其运算都返回NaN,可通过isNaN()函数来判断值是不是NaN,此函数收到一个值后会尝试转换为数值
// NaN - 测试对象在调用isNaN()时,会基于值调用toString()方法再测试返回值是否可以转换为数值 var objNaN = { toString: function(){ // 以数字开头,以字母结尾的依然返回NaN,必须是纯数字/空字符串/布尔值/定制对象才不是NaN return '521LMLZ' } } console.log(isNaN(objNaN))
扩展: isNaN()函数也适用于对象,在调用isNaN()函数中,首先会调用valueOf()方法,然后确定返回值是否能够转换为数值,如果不能,则基于这个返回值再调用toString()方法,再测试返回值
5.如果要将非数值转换为数值,可使用Number(),参数支持任意类型, parseInt(),第一个参数只支持字符串,第一个参数可选指定进制, parseFloat(),参数只支持字符串
转换数值前 | 转换方式 | 转换数值后 |
true | Number(true) | 1,Boolean类型的true/false分别转换为1和0 |
25 | Number(25) | 25,数值型直接返回 |
null | Number(null) | 0,空对象返回0 |
undefined | Number(undefined) | NaN,undefined返回NaN |
[0-9]+[a-z]+ | Number([0-9]+[a-z]+) | NaN,出现字符转换为NaN |
{toString: function(){return 521314}} | Number(...) | 对象toString方法返回值尝试转换为数值,失败则返回NaN |
注意: Number()会尝试将其它数据类型转换为数值,如果是对象,则基于这个对象的返回值调用toString方法再测试,类似'521314LZZ'这样先转换为数值或通过isNaN测试返回true转换为Number时候返回NaN
6.parseInt(string [,radix])函数在转换字符串时比Number更加合理,因此在处理整数时更加常用,parseFloat(string)只认识以整数开头和浮点数和科学计数法
// parseInt(string [,radix]) console.log( // 解析以数字开头的字面量,则只取开头数值 parseInt('521314LZ'), // 无法转换为数值则返回NaN parseInt('LMM'), // 解析浮点数,则取整 parseInt('3.14'), // 解析空字符串,则返回NaN parseInt(''), // 解析布尔值true,则返回NaN parseInt(true), // 支持解析常规进制 parseInt('AF', 16) ) // parseFloat(string) console.log( // 解析以数字开头的字面量,则只取开头数值 parseFloat('3.14LMM'), // 解析以数字加点的字面量,只认一个小数点 console.log('3.1.4'), // 支持解析科学计数法 parseFloat('3.14e10') )
String
说明: String由零或多个Unicode字符组成的字符序列,即字符串,字符串可以由双引号"/单引号'表示,
字面量 | 含义 |
\n | 换行 |
\t | 制表 |
\b | 退格 |
\r | 回车 |
\f | 翻页 |
\\ | 斜杠 |
\' | 单引号 |
\" | 双引号 |
\xnn | 以十六进制nn表示一个字符,如\x41 |
\unnnn | 以十六进制nnnn表示一个unicode字符 |
var userAge = 25 console.log( // toString方法可以将任意类型的变量转换为字符串 userAge.toString(), // .toString(radix)可通过指定进制,将数值变量转换为对应进制的字符串 userAge.toString(2), userAge.toString(8), userAge.toString(10), userAge.toString(16), // 可通过String()强制转换null为字符串null String(null), // 可通过String()强制转换undefined为字符串undefined String(undefined) )
说明:.toString([redix])是所有对象的公共方法,也就是所有对象可以转换为字符串,null和undefined直接转换为null和undefined.
Object
说明: Object其实就是一组数据和功能的集合,对象可以执行new操作符后跟要创建的对象类型的名称来创建,单创建Object实例无任何卵用,Object类型是所有它实例的基础,实例对象将自动携带它具有的属性和方法
对象属性 | |
constructor | 保存着用于创建当前对象的函数 |
对象方法 | |
hasOwnProperty(propertyName) | 用于检查给定的属性在当前对象实例中(而不是实例的原型中) |
isPrototypeOf(object) | 用于检查传入对象是否是另一个对象的原型 |
toLocaleString() | 返回对象的字符串表示,该字符串与执行的环境地区有关 |
toString() | 返回对象的字符串表示 |
valueOf() | 返回对象的字符串,数值,或布尔值表示,通常和toString()方法的返回值相同 |
/* * new Object - 创建对象 */ var newObj = new Object var newObj = new Object() /* * constructor - 获取创建对象的真实函数 */ // Object()里可以任意传参,可传数值,字符串,布尔值等,其实是对参数类型的封装,而且还可以进行对应的值计算(因为内部都有一个隐式转换为值的方法),可以使用.constructor来获取真实对象 var numObj = new Object(2) var strObj = new Object('2') var boolObj = new Object(true) alert(numObj.constructor + strObj.constructor + boolObj.constructor) /* * hasOwnProperty - 判断对象是否存在指定属性 */ var userInfo = new Object() userInfo.name = "李满满" if(userInfo.hasOwnProperty('name')){ alert('userInfo存在name属性.') }else{ alert('userInfo不存在name属性.') }