首页 > 网站 > WEB开发 > 正文

JavaScript 数据类型详解

2024-04-27 15:08:13
字体:
来源:转载
供稿:网友

——跟我一起学 javaScript (5)

ECMAScript 定义了 5 种简单数据类型(Undefined、Null、Boolean、Number、String)和一种复杂数据类型(Object),后续会分别进行说明。

1 typeof 操作符

typeof 用于检测给定变量的数据类型。

变量值类型 typeof 返回值
未定义 undefined
布尔值 boolean
字符串 string
数值 number
对象或者 null object
函数 function
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title>typeof 操作符</title></head><body><script type="text/Javascript"> var message = "some string"; // typeof 是操作符,因此此例中的圆括号不是必须的 alert(typeof message);//"string" alert(typeof (message));//"string" alert(typeof 95);//"number"</script></body></html>typeof 操作符的操作数可以是变量或者是数值字面量。typeof null 会返回 “object”,因为特殊值 null 被认为是一个空的对象引用。

2 undefined 类型

未经过初始化的值默认会取得 undefined 值。包含 undefined 值的变量与尚未定义的变量不一样,尚未定义的变量传递给函数会导致错误——<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title>没有声明的变量会产生错误</title></head><body><script type="text/javascript"> var message;//变量声明后会取得 undefined 值 // var age 这个变量没有声明 alert(message);//"undefined" alert(age);//产生错误</script></body></html>未初始化的变量以及未声明的变量执行 typeof 后都会返回 undefined 值,所以显式地初始化变量是明智的,因为这样做之后,当执行 typeof 返回 undefined 时,我们就知道这个变量是还没有被声明——<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title>对未初始化和未声明的变量执行 typeof 操作,都会返回 undefined</title></head><body><script type="text/javascript"> var message;//变量声明后会取得 undefined 值 // var age 这个变量没有声明 alert(typeof message);//"undefined" alert(typeof age);//"undefined"</script></body></html>

3 Null 类型

Null 类型是只有一个特殊值的数据类型(null)。从逻辑角度看,null 值表示一个空对象指针——<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title>null 值表示一个空对象指针(逻辑角度)</title></head><body><script type="text/javascript"> var car = null; alert(typeof car);//"object"</script></body></html>如果定义的变量未来需要用于保存对象,那么请把这个变量初始化为 null,这样只要检查 null 值就能够判断这个变量是否已经保存了一个对象的引用。而且也有助于进一步区分 null 和 undefined。undefined 值是派生自 null,因此它们是相等的(==)。

4 Boolean 类型

这个类型有两个字面值:true 和 false(区分大小写)。ECMAScript 中所有类型的值都有与上面的两个字面值等价的值。可使用转型函数 Boolean() ——<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title>ECMAScript 中定义的所有类型的值都可以转换为 Boolean 值</title></head><body><script type="text/javascript"> var message = "Hello world!"; var messageAsBoolean = Boolean(message); alert(messageAsBoolean);</script></body></html>转换规则——
数据类型 转换为 true 转换为 false
Boolean true false
String 非空字符串 空字符串 ”
Number 非零数字(包括无穷大) 0 或 NaN
Object 对象 null
Undefined undefined
这些规则对理解流控制语句的自动执行 Boolean 转换来说,很重要——<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title>Boolean 的转换规则对理解流控制语句相当重要</title></head><body><script type="text/javascript"> var message = "Hello world!"; if (message) { alert("Value is true"); }</script></body></html>

5 Number 类型

使用 IEEE754 格式来表示整数和浮点数。可以表示十进制、八进制或十六进制数。在进行算术运算时,所有的八进制或十六进制数最终被转换成十进制数。可以保存数值为正零(+0)或负零(-0),它们是相等的。

5.1 浮点数

数值中包含一个小数点,小数点后面至少有一位数字。因为保存浮点数对内存空间的要求是整数的两倍,所以 ECMAScript 会这某些情况下的浮点数转换为整数——var float1 = 1.;//1var float2 = 10.0;//10对于极大或者极小数,可以用科学计数法(e 表示法)——var floatNum = 3.327e8;//332700000默认情况下,ECMAScript 会将小数点后面带有 6 个零以上的浮点数转换为科学计数法。浮点数的最高精度是 17 位小数,但在进行算术运算时的精确度远远不如整数,所以永远不要判断某个特定浮点数的值(这种舍入误差是 IEEE754 数值浮点计算的通病)——<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title>进行算术运算时的精确度远远不如整数</title></head><body><script type="text/javascript"> var a = 0.1, b = 0.2; console.log(a+b);//0.30000000000000004</script></body></html>

5.2 数值范围

最小数值在 Number.MIN_VALUE 中(5e-324)。最大数值在 Number.MAX_VALUE 中(1.7976931348623157e+308)。如果某次计算结果超过了上面的范围,那么数值会被转换为特殊的 Infinity 值(正负无穷),而且无法继续参与下一次计算。在执行极大或极小值的计算时,使用 isFinite() 函数进行监控是必要的。

5.3 NaN

非数值(Not a Number)任何涉及 NaN 的操作都会返回 NaN。NaN 与任何值都不相等,包括 NaN。isNaN 函数可以判断这个参数是否 “不是数值”——<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title>NaN(Not a Number) 非数值</title></head><body><script type="text/javascript"> alert(NaN == NaN); //false alert(isNaN(NaN)); //true alert(isNaN(10)); //false(10 是数值) alert(isNaN("10")); //false(可以被转换成数值 10) alert(isNaN("blue"));//true(不能转换为数值) alert(isNaN(true));//false (可以被转换成数值 1)</script></body></html>NaN 也适用于对象。它会首先调用对象的 valueOf() 方法,然后确定该方法的返回值是否可以转换为数值。如果不能,就基于这个返回值调用 toString() 方法,在测试返回值。

5.4 数值转换

5.4.1 Number() 函数

转换规则:

传入的参数类型 返回
Boolean true 和 false 分别被转换为 1 和 0
数字 返回传入的数字
null 0
undefined NaN
字符串 后面单独说明
对象 调用 valueOf 方法,再按前面的规则转换返回的值。如果转换结果是 NaN,则调用 toString 方法,再按前面的规则转换返回的值

传入的参数类型是字符串的情况比较复杂,这里单独说明:

字符串格式 返回
只包含数字(包括带正负号的情况) 转换为十进制数值
有效浮点格式 转换为对应的浮点格式
有效的十六进制格式 转换为十进制数
空字符串 0
包含上述格式之外的字符 NaN
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title>Number 函数(非数值转换为数值)</title></head><body><script type="text/javascript"> console.info(Number("Hello World!"));//NaN console.info(Number(""));//0 console.info(Number("000011"));//11 console.info(Number(true));//1</script></body></html>

5.4.2 parseInt() 函数

因为 Number() 函数在转换字符串时较复杂而且不够合理,所在在处理整数时,更常用的是 parseInt() 函数。parseInt 会忽略字符串前面的空格,直接从第一个非空格字符开始判断。能够识别各种整数格式(十进制、八进制和十六进制)。

转换规则:

传入的参数类型 返回
第一个非空格字符不是数字字符或者负号 NaN
空字符串 NaN
第一个非空格字符是数字字符 会继续解析,直到解析完或者遇到一个非数字字符
这个函数提供第二个参数:转换时使用的进制类型——<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title>parseInt() 函数指定了第二个参数(转换时使用的基数),字符串前可以不加基数符号</title></head><body><script type="text/javascript"> console.log(parseInt("AF", 16));//175 console.log(parseInt("AF"));//NaN</script></body></html><!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title>指定基数会影响到 parseInt() 转换的结果</title></head><body><script type="text/javascript"> console.log(parseInt("10", 2));//2(二进制) console.log(parseInt("10", 8));//8(八进制) console.log(parseInt("10", 10));//10(十进制) console.log(parseInt("10", 16));//16(十六进制)</script></body></html>因为parseInt() 在解析八进制字面量的字符串时,ECMAScript 3 和 5 存在分歧,所以为了避免错误解析,建议在使用 parseInt() 函数时都明确指定基数。

5.4.3 parseFloat() 函数

与 parseInt() 类似,也是从第一个字符开始解析,直到遇见一个无效的浮点数字字符为止。字符串中只有第一个小数点是有效的。始终会忽略前导的零。只能解析十进制的值。十六进制格式的字符串都会被转换为 0。如果字符串包含的是一个可解析为整数的数,那么会返回整数。<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title>parseFloat()</title></head><body><script type="text/javascript"> console.log(parseFloat("1234Green"));//1234 console.log(parseFloat("0xA"));//0;十六进制会永远被转换为 0 console.log(parseFloat("22.5"));//22.5 console.log(parseFloat("22.5.43"));//22.5 console.log(parseFloat("0283.8"));//283.8 console.log(parseFloat("3.1238e8"));//31238000</script></body></html>

6 string 类型

用于表示由零或多个 16 位 Unicode 字符组成的字符串序列。可由双引号或单引号表示,这两种语法形式没有区别。注意,以什么引号开始,就必须以什么引号结束。

6.1 字符字面量

字面量 含义
/n 换行
/t 制表
/b 空格
/r 回车
/f 进纸
//|斜杠
/’ 单引号,用于字符串中包含单引号的情况
/” 双引号,用于字符串中包含双引号的情况
/xnn 以十六进制代码 nn 表示的一个字符( n 为 0 ~ F)
/unnn 以十六进制代码 nnnn 表示的一个 Unicode 字符( n 为 0 ~ F)
字符字面量可以出现在字符串中的任意位置,且将作为一个字符被解析。字符串长度以 length 属性取得。但如果包含双字节字符,那么 length 属性不会正确返回字符的数目。

6.2 字符串特点

字符串不可变的,要改变某个变量保存的字符串,会先销毁原来的字符串,再用包含新值的字符串返回。

6.3 转换为字符串

6.3.1 toString() 方法

数值、布尔值、对象和字符串值都有 toString() 方法。null 和 undefined 值没有toString() 方法。toString() 方法,可以传入输出数值的基数,默认是十进制格式。<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title>toString(输出值的基数)</title></head><body><script type="text/javascript"> var num = 10; console.log(num.toString());//"10" console.log(num.toString(2));//"1010" console.log(num.toString(8));//"12" console.log(num.toString(10));//"10" console.log(num.toString(16));//"a"</script></body></html>

6.3.2 String() 转型函数

转换规则:

输入值 返回结果
值有 toString() 方法 调用该方法并返回相应的结果
null “null”
undefined “undefined”
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title>String() 将任何类型转换为字符串</title></head><body><script type="text/javascript"> console.log(String(10));//"10" console.log(String(true));//"true" console.log(String(null));//"null" console.log(String(undefined));//"undefined"</script></body></html>

7 Object 类型

对象是一组数据和功能的集合。使用 new 创建对象。var o = new Object();Object 类型时所有他的实例的基础。即 Object 类型所具有的任何属性和方法也同样存在于更具体的对象中。Object 的每个实例都具有以下属性和方法——
方法名 说明
Constructor 保存着用于创建当前对象的函数
hasOwnPRoperty(propertyName) 判断给定的属性在当前对象实例中是否存在,其中的属性名是字符串形式传入
isprototypeOf(object) 判断传入的对象是否是另一个对象的原型
propertyIsEnumerable(propertyName) 判断给定的属性是否能够使用 for-in 语句,其中的属性名是字符串形式传入
toLocaleString() 返回对象的字符串表示,考虑了本地时区
toString() 返回对象的字符串表示
valueOf() 返回对象的字符串、数值或布尔值表示,通常与 toString() 返回值相同
以后会详细介绍,敬请期待 O(∩_∩)O~
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表