JavaScript数据类型、数值与字符串核心机制解析
本文系统梳理JavaScript中的原始类型与对象类型,深入解析数字类型的溢出、下溢及NaN处理机制,重点探讨IEEE-754标准下的浮点数精度问题。同时详细讲解字符串的Unicode编码规则、转义字符及不可变性特性,帮助开发者准确掌握JS基础数据类型的行为与边界。
JavaScript数据类型概述
JavaScript的数据类型体系主要划分为原始类型和对象类型两大范畴。五种原始类型包括数字、字符串、布尔值、null(空)以及undefined(未定义)。对象则是属性的集合,其属性由“名/值对”构成,值既可以是原始值也可以是其他对象。此外,JavaScript还定义了全局对象、数组和函数这三种特殊对象,以及日期(Date)、正则(RegExp)和错误(Error)三个实用类。
数字类型与算术运算
1 数字
在JavaScript中,整数值与浮点数值不作区分。系统支持十进制整型直接量(即程序中直接使用的数据值)以及以0x或0X为前缀的16进制值(注意前缀是数字0而非字母o,否则会被视为标识符)。虽然ECMAScript标准未规定八进制直接量,但部分JavaScript实现允许以数字0为前缀表示八进制整数,在IE、Chrome和Firefox等浏览器中赋值通常无异常。然而,在ECMAScript6的严格模式下,八进制直接量被明确禁止。
浮点型直接量存在两种表示形式:一是传统的实数写法,包含整数部分、小数点和小数部分;二是指数计数法,即在实数后跟随字母e或E,接着是正负号,最后是整型指数。
1.1 算术运算的溢出
JavaScript在执行算术运算时,若发生溢出(overflow)、下溢(underflow)或被0整除,均不会抛出错误。
溢出指运算结果超出JavaScript可表示的数字上限,此时返回正无穷大Infinity或负无穷大-Infinity。无穷大的加减乘除运算结果仍为无穷大,并保留原有的正负号。下溢指运算结果无限接近于零且小于JavaScript能表示的最小值,此时返回0;若为负数下溢,则返回特殊值“负零”。
var zero = 0; //正零值
var negz = -0; //负零值
zero === negz //表达式返回值为true
1/zero === 1/negz
//表达式返回值false,等价于判断正无穷大和负无穷大是否严格相等
被0整除会返回正无穷大或负无穷大,但0除以0将返回NaN(Number对象的NaN属性值)。导致返回NaN的情况包括:①0除以0;②无穷大除以无穷大;③对任意负数进行开方运算;④算术运算符与非数字且无法转换为数字的操作数结合使用。
NaN具有特殊性,它与任何值都不相等,包括其自身。判断变量x是否为NaN有两种方法:①使用isNaN()函数;②利用x != x表达式,仅当x为NaN时该表达式为true。此外,isFinite()函数在参数非NaN、Infinity或-Infinity时返回true。
1.2 二进制浮点数和四舍五入错误
实数有无数个,但JavaScript通过浮点数仅能表示有限个数值,因此实数往往只是真实值的近似表示。JavaScript采用IEEE-754二进制浮点数表示法,能精确表示如1/2、1/8和1/1024等分数,但无法精确表示十进制分数如1/10等。例如:
var x = 0.3 -0.2; //x=0.09999999999999998
var y = 0.2 - 0.1; // y=0.1
x == y //false
x == 0.1 //false
y == 0.1 //true
0.1 == 0.1 //true
var z = x + y; //z=0.19999999999999998
字符串与文本处理机制
2 文本
2.1 字符串、字符集
字符串(string)是由16位值组成的不可变有序序列,每个字符通常源自Unicode字符集。字符串长度(length)即其所含16位值的个数。JavaScript通过字符串类型表示文本,且不存在单独的“字符型”。表示单个16位值只需将其赋值给字符串变量即可。
JavaScript采用UTF-16编码的Unicode字符集,JavaScript字符串是由一组无符号的16位值组成的序列。那些不能表示为16位的Unicode字符则遵循UTF-16编码规则——用两个16位值组成一个序列(或称作“代理项对”)表示。这意味着一个长度为2的JavaScript字符串有可能表示一个Unicode字符。注意:JavaScript定义的各式字符串的操作方法均作用于16位值,而非字符,且不会对代理项对做单独处理。书看到这里,又结合http://www.alloyteam.com/2013/12/js-calculate-the-number-of-bytes-occupied-by-a-string/上面所述,终于对Unicode字符集、UTF-8、UTF-16稍有理解。
字符串定界符可为单引号或双引号,二者可嵌套但不能多层嵌套(如双引号内可含单引号,但单引号内不能再含双引号)。字符串值可拆分为多行,每行以反斜线(\)结束,此时反斜线和行结束符不计入字符串内容,即字符串本身并非多行,仅书写形式为多行。
需注意:①JavaScript中字符串固定不变(除非重新赋值),replace()和toUpperCase()等方法返回新字符串,原字符串不变;②字符串可视为只读数组,除使用charAt()查询单一字符外,也可使用方括号访问单个字符(16位值),例如:
s = "hello, world";
s[0] //=>"h"
2.2 转义字符
转义字符及其含义如下:\o表示NUL字符(\u0000),\b表示退格符(\u0008),\t表示水平制表符(\u0009),\n表示换行符(\u000A),\v表示垂直制表符(\u000B),\f表示换页符(\u000C),\r表示回车符(\u000D),\"表示双引号(\u0022),\'表示撇号或单引号(\u0027),\\表示反斜线(\u005C),\xXX表示由两位十六进制数XX指定的Latin-1字符,\uXXXX表示由4位十六进制数XXXX指定的Unicode字符。注意:若反斜线位于未列出的字符前,则忽略反斜线(如"\#"与"#"等价)。此外,反斜线在多行字符串每行结束处也有特定作用。
布尔值转换规则
3 布尔值
JavaScript中的所有值均可转换为布尔值。null、undefined、0、-0、NaN和空字符串""这6个值转换为false,称为“假值”;其他所有值(包括对象/数组)转换为true,称为“真值”。布尔值包含toString()方法,可将布尔值转换为字符串“true”或“false”,但不包含其他有用方法。
以上即为JavaScript类型、值和变量的核心内容总结,希望读者能够掌握并应用。
JS语法错误会阻止加载吗?区分SyntaxError与资源加载失败
2026-11-05 16:08:46
JavaScript常见SyntaxError语法错误排查与修复方法
2026-11-05 13:58:44
JS中slice、substring和substr截取字符串的区别
2026-11-05 13:43:47
JS 转 TS 手动迁移最佳实践:从配置 tsconfig 到消除 any 类型
2026-11-05 11:53:32
为什么JS数组push后得到的是数字而不是数组?
2026-11-05 09:59:18
