JavaScript数据类型、数值与字符串核心机制解析

作者:小括号

时间:2026-10-29

浏览:242

本文系统梳理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类型、值和变量的核心内容总结,希望读者能够掌握并应用。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章