js之常用全局函数和语句

编码函数

1
2
3
4
5
decodeURI() //和/*...*/(注释)
decodeURIComponent() const
encodeURI() var
encodeURIComponent()
escape()

编码函数的作用是把字符串转换成能用作统一资源标识符(Uniform Resource Identifier)的
版本,例如网页地址或服务器 CGI 脚本的调用。拉丁字母数字字符组在编码处理后不会改变,
但某些符号和其他 Unicode 字符必须使用编码函数转换成 Internet 能传输的格式(字符数字的十
六进制表示)。例如,空格字符必须编码成十六进制形式:%20。
encodeURI()和 escape()函数(还有 decodeURI()和 unescape())的最大区别在于,现代版本的
浏览器不对大量符号进行编码,因为根据 RFC2396(http://www.ietf.org/rfc/rfc2396.txt)推荐的语
法,它们可用作 URI 字符。因此,不通过 encodeURI()函数来编码下面的字符:
; / ? : @ & = + $ , - _ . ! ∼ * ‘ ( ) #
encodeURI()和 decodeURI()函数只能在完整的 URI 中使用。可用的 URI 可以是相对地址或
绝对地址,但这两个函数是连接在一起的,所以不编码 URI 中的协议(://)、搜索字符串(例如?
和=)和目录层次分隔符(/)。decodeURI()函数能处理从服务器传来的页面地址 URI,但注意,有
些服务器的 CGI 程序把空格编码成加号(+),但 JavaScript 函数不能把加号解码回空格。如果脚
本需要解码的 URI 用加号代替空格,则需要通过一个字符串替代方法来运行解码的 URI,来完
成这项工作(这里使用正则表达式比较方便)。如果要解码的 URI 字符串是用脚本编码的,则只
有通过相应的编码函数进行编码的 URI,才使用解码函数。不要试图对使用旧 escape()函数创
建的 URI 进行解码,因为转换过程根据不同的规则来进行。
URI 和 URI 组件之间的区别在于,组件是 URI 的一个片段,一般不含有分隔符。例如,如
果在完整的 URI 上使用 encodeURIComponent()函数,则几乎所有符号(句点除外)都会编码成十六
进制版本,包括目录分隔符。因此,应该在 URI 的最小单位上使用组件级的转换函数。例如,如
果组合一个包含“名/值”对的查询字符串,就可以在名称和值上分别使用 encodeURIComponent()
函数。但如果在 name=value 形式的名/值对上使用这个函数,这个函数就会把等号编码成对应
的十六进制

eval()

eval()函数能计算任何存储为字符串的 JavaScript 语句或表达式,包括算术表达式、对象赋
值和对象方法调用的字符串形式。然而,这里不推荐使用 eval()函数,因为这个函数的效率极
低(从性能角度来看)。幸好,不用 eval()函数也可将对象名的字符串版本转换成有效的对象引用。
例如,如果脚本遍历一系列的对象,而这些对象的名称包含连续的数字,可以将对象名用作数
组索引,而不是使用 eval()函数来组合对象引用。
下面是设置一系列域 data0、datal 等的值的低效方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function fillFields()
{
var theObj;
for (var i = 0; i < 10; i++)
{
theObj = eval("document.forms[0].data" + i);
theObj.value = i;
}
}
更高效的方式是在对象引用的索引方括号中进行连接:
function fillFields()
{
for (var i = 0; i < 10; i++)
{
document.getElementById("myForm").elements["data" + i].value = i;
}
}

提示:
只要打算使用 eval()函数,就要看看能否使用对象数组的字符串索引值来替代 eval()函数。
W3C DOM 使用 document.getElementByld()方法,使这个任务更容易完成,这个方法把字符串
作为参数,返回指定对象的引用。

isFinite()

isFinite()函数一般很少使用,它用于检查数字是否超出了 JavaScript 能处理的最大值或最小
值。如果数字超出了这个范围,该函数就返回 false。这个函数的参数必须是数字数据类型

isNaN()

把值传递给计算操作之前,需要使用 isNaN()函数来检查这个值是不是数字。这个函数常
常用于检查 parseInt()或 parseFloat()函数的结果。如果提交给这些函数的字符串不能转换成数
字,结果就为 NaN(一个特别的符号,表示“不是数字”)。如果这个值不是数字,isNaN()函数
就返回 true。

Number() parseFloat() parseInt()

如果脚本不在意值的精度,并允许通过原字符串决定返回值是浮点型还是整型,就可以使
用 Number()函数。这个函数只有一个参数:要转换成数字的字符串。
parseFloat()函数也能通过原字符串决定返回值是浮点型还是整型。如果原字符串在小数点右
边有非零值,返回值就是浮点数。但如果原字符串是如“3.00”之类的数字,返回值就是整型。
在 parseInt()中,另一个可选参数可以决定转换时使用的数字基数。如果不指定基数参数,
JavaScript 会试着找一个基数,但这样可能使 JavaScript 出问题。当 parseInt()的字符串参数以 0

开头时(文本框输入项或数据库域有可能以 0 开头),就会出现一个重要问题:在 JavaScript 中,
以 0 开头的数字处理为八进制(基数为 8),因此,parseInt(“010”)返回的十进制值为 8。
使用 parseInt()函数时,如果处理基数为 10 的数字,就应总是指定基数为 10。基数也可以
指定为 2~36 之间的数字。例如,指定基数为 2,把二进制数字符串转换成十进制形式,如下
所示:
var n = parseInt(“011”,2);
// result: 3
同样,也可以指定基数为 16,把十六进制字符串转换成十进制:
var n = parseInt(“4F”,16);
// result: 79
示例
parseInt()和 parseFloat()函数有一个非常有用的功能。如果字符串参数以至少一位数字开头,
后跟字母,这些函数将只处理字符串前面的数字部分,并忽略剩 余的部分。因此,可在
navigator.appVersion 字符串上使用 parseFloat()函数,来提取报告的版本号,而不必分析字符串
的剩余部分。例如,Windows 的 Firefox 1.0 报告 navigator.appVersion 值为:
5.0 (Windows; en-US)
也可通过 parseFloat()函数来获取字符串的数字部分:
var ver = parseFloat(navigator.appVersion);

toString()
unescape()
unwatch()
watch()