全局函数是在全局对象中定义的函数。它可以随时从 JavaScript 程序中调用和使用。本节说明如何使用作为全局函数提供的函数。
目录
20-1 parseInt 函数(将字符串转换为整数)
20-2 parseFloat 函数(将字符串转换为浮点数)
20-3 isNaN 函数(检查值是否为 NaN)
20-4 isFinite 函数(检查一个值是有限的还是无限的)
20-5 eval 函数(执行指定为字符串的代码)
20-6 encodeURI 函数/encodeURIComponent 函数(编码 URI)
parseInt 是 JavaScript 的全局函数之一,返回一个从字符串转换为整数的值。如果目标值不是字符串,则将其转换为字符串,然后再转换为整数。这里我们解释如何使用 parseInt 函数。
※Number 对象有一个 Number.parseInt 方法,其作用与全局函数的 parseInt 函数相同。
如何使用 parseInt 函数
全局函数之一,parseInt 函数,返回一个从字符串转换为整数的值。格式如下。
parseInt(字符串 [, 基数])
将第一个参数中指定的字符串转换为整数。如果参数不是字符串,则将其转换为字符串,然后再转换为整数。可选的第二个参数允许您指定整数基数(十进制数为 10)。指定 2 到 36 之间的数字。
字符串到整数的转换如下:(1) 从字符串中删除前导空格。(2) 开头有’+’或’-‘的,按符号处理。(3) 将字符串直到非数字的字符转换为整数。除了数字之外,被视为数字的字符是在第二个参数中指定大于或等于 10 的数字作为基数时使用的字母(指定十六进制数字时为 A 到 F)。
如果第一个字符无法转换为数字,则返回 NaN。
看看下面的示例。
parseInt('14', 10);
>> 14
parseInt(' -128Color', 10);
>> -128
parseInt('3FDCKA', 16);
>> 16348
parseInt('Good80', 10);
>> NaN
即使字符串是数字,比如以2为底,如果开头写了0和1以外的数字,也会是NaN。
parseInt('101', 2);
>> 5
parseInt('310', 2);
>> NaN
如果没有指定基数,如果字符串以’0x’或’0X’开头则假设基数为16;否则假设基数为10。
parseInt('0x20');
>> 32
parseInt('20');
>> 20
parseFloat 是 JavaScript 的全局函数之一,返回将字符串转换为浮点数得到的值。如果目标值不是字符串,则将其转换为字符串,然后再转换为浮点数。这里我们解释如何使用 parseFloat 函数。
※ Number对象有一个Number.parseFloat方法,作用和全局函数的parseFloat函数一样。
如何使用 parseFloat 函数
全局函数之一,parseFloat 函数,返回一个从字符串转换为浮点数的值。格式如下。
parseFloat(字符串)
将参数中指定的字符串转换为浮点数。如果参数不是字符串,则将其转换为字符串,然后再转换为浮点数。
字符串到浮点数的转换如下:(1) 从字符串中删除前导空格。(2) 开头有’+’或’-‘的,按符号处理。(3) 将字符串直到不是数字的字符转换为浮点数。除了数字之外,被认为是数字的字符是点 (.) 和代表指数的 e 或 E。但是,第二次的点(.)不被视为数字。
如果第一个字符无法转换为数字,则返回 NaN。
看看下面的示例。
parseFloat("14");
>> 14
parseFloat(' 3.1415Data');
>> 3.1415
parseFloat('5.8e-3');
>> 0.0058
parseFloat('Good2000');
>> NaN
与 parseInt 函数不同,paseFloat 函数不会将以 0x 或 0X 开头的字符识别为十六进制字符。在这种情况下,考虑数字 0 和非数字“x”。
parseFloat('0x44F2');
>> 0
parseFloat('3A4B');
>> 3
IsNaN 是 JavaScript 的全局函数之一,它检查目标值是否为 NaN(非数字)并返回 true 或 false。在这里,我将解释如何使用 isNaN 函数。
※ 与isNaN全局函数类似,Number对象提供了Number.isNaN方法,更严格的检查是否为NaN。
如何使用 isNaN 函数
全局函数之一,isNaN 函数,通过检查目标值是否为 NaN 来返回 true 或 false。格式如下。
isNaN(值)
检查参数中指定的值是否为 NaN。如果该值不是数值类型,则首先将其转换为数值类型,然后再进行检查。
※ NaN 是全局对象的属性之一,表示 Not A Number。
NaN是一个特殊的值,即使你用==或===判断它是否等于NaN本身,它也是假的,所以你不能用判断判断它是否是NaN。这就是我们使用 isNaN 函数的原因。
console.log(NaN == NaN);
>> false
console.log(NaN === NaN);
>> false
isNaN(NaN);
>> true
使用 isNaN 函数时,如果将 NaN 以外的值而非数字指定为参数,则将其转换为数字,然后检查它是否为 NaN。看下面的例子看看什么值是NaN。
该数字将是错误的。Infinity,它是全局对象的一个属性,表示无穷大,也是假的。
isNaN(10);
>> false
isNaN(Infinity);
>> false
字符串为真,但仅由数字和空字符串组成的字符串转换为数字时为假。
isNaN('Hello'); // 转换为数字时结果为NaN
>> true
isNaN('24old'); // 转换为数字时结果为NaN
>> true
isNaN('72'); // 转换为数字时结果为72
>> false
isNaN(''); // 转换为数字时结果为0
>> false
true转为数字时为1,false转为数字时为0,null为false是因为转为数字时为0。true 因为 undefined 在转换为数字时会转换为 NaN。
isNaN(true); // 转换为数字时结果为 1
>> false
isNaN(false); // 转换为数字时结果为0
>> false
isNaN(null); // 转换为数字时结果为0
>> false
isNaN(undefined); // 转换为数字时结果为NaN
>> true
如果值是对象类型则不同。
isNaN([10]); // 转换为数字时结果为10
>> false
isNaN([10, 20]); // 转换为数字时结果为NaN
>> true
isNaN([]); // 转换为数字时结果为0
>> false
isNaN({a:'10'}); // 转换为数字时结果为NaN
>> true
注意isNaN函数不检查目标值是否为数字,而是在转换为数字时检查目标值是否为NaN。
IsFinite 是 JavaScript 的全局函数之一,它检查目标值是有限的还是无限的,并返回 true 或 false。在这里,我将解释如何使用 isFinite 函数。
※ Number对象有类似全局函数isFinite的Number.isFinite方法。
如何使用 isFinite 函数
全局函数之一,isFinite 函数,检查目标值是有限的还是无限的,如果该值是有限的,则返回 true。格式如下。
isFinite(值)
检查参数中指定的值是否为有限值。如果值为 NaN、正无穷大 (Infinity)、负无穷大 (-Infinity),则返回 false,否则返回 true。如果该值不是数值类型,则首先将其转换为数值类型,然后再进行检查。
看看下面的示例。如果值为 NaN 、正无穷大 ( Infinity ) 或负无穷大 ( -Infinity ),则为 false。
isFinite(Infinity);
>> false
isFinite(-Infinity);
>> false
isFinite(NaN);
>> false
一个不是无限的数字是一个有限的数字。
isFinite(16);
>> true
isFinite(0);
>> true
isFinite(-6.4);
>> true
一个字符串为假,但是只有数值组成的字符串和一个空字符串转换为数值时为真。
isFinite('Hello'); // 转换为数字的结果为NaN
>> false
isFinite('78'); // 转换为数字的结果为78
>> true
isFinite(''); // 转换为数字的结果为0
>> true
true转为数字时转为1,false转为数字时转为0,null转为数字时转为0,所以为true。undefined 为 false,因为它在转换为数字时会转换为 NaN。
isFinite(true); // 转换为数字的结果为1
>> true
isFinite(null); // 转换为数字的结果为0
>> true
isFinite(undefined); // 转换为数字的结果为NaN
>> false
如果值是对象类型则不同。
isFinite([10]); // 转换为数字的结果为10
>> true
isFinite([10, 20]); // 转换为数字的结果为NaN
>> false
isFinite([]); // 转换为数字的结果为0
>> true
isFinite({a:'10'}); // 转换为数字的结果为NaN
>> false
请注意,全局函数 isFinite 在将目标值转换为数字后检查目标值是有限的还是无限的。
eval 是 JavaScript 的全局函数之一,它执行指定为字符串的 JavaScript 代码作为参数。这里我们将解释如何使用 eval 函数。
eval使用评估函数
全局函数之一,eval 函数,执行在其参数中指定为字符串的 JavaScript 代码。格式如下。
eval(要执行的代码)
在参数中将表达式或语句作为字符串写入。eval 函数返回最后计算的表达式的值。
看看下面的示例。
let str = 'x * y + 10';
let x = 8;
let y = 5;
let z = eval(str);
console.log(z);
>> 50
执行 eval 函数时,它会计算字符串参数表示的表达式。评估结果分配给变量 z。
类似的示例,但略有修改。
let str = 'z = x * y + 10;console.log(z)';
let x = 8;
let y = 5;
let z;
eval(str);
>> 50
执行 eval 函数时,它会执行由指定为参数的字符串表示的代码。运算结果赋值给变量z,然后将变量z的值输出到控制台。
通过以这种方式使用 eval 函数,您可以评估由指定为参数的字符串表示的表达式或执行语句。
eval 函数现在已经过时了,但在过去它似乎被用来将表示为字符串的 JSON 文本转换为对象。
let json = "{'name':'Yuhua', 'old':'28'}";
let obj = eval('(' + json + ')');
eval(obj);
>> 50
使用eval函数时的注意事项
由于 eval 函数是可以执行由作为参数指定的字符串表示的代码的函数,因此编写将其他用户输入的值作为字符串接收并将其传递给 eval 函数的过程是非常危险的。可以执行其他用户输入的任意代码。
还有执行速度慢等其他缺点,目前也有eval函数的替代方案,所以eval函数好像用的不多。
不是不能用,所以请在充分考虑前面提到的危险性后,必要时使用。
JavaScript 的全局函数之一 encodeURI 对给定 URI 中的特殊字符进行编码。encodeURIComponent 还对指定为参数的 URI 中使用的字符串中的特殊字符进行编码。本节介绍如何使用 encodeURI 和 encodeURIComponent 函数。
如何使用 encodeURI 函数
全局函数之一,encodeURI 函数,对指定为参数的字符串中的特殊字符进行编码。格式如下。
encodeURI(strURI)
指定参数的目标字符串。返回一个新字符串,该字符串对字符串中的特殊字符进行编码。
encodeURI 函数对除以下字符以外的所有字符进行编码:(字母数字字符为 A-Z、a-z 和 0-9)。例如,所有日文字符都经过编码。
英数字 - _ . ! ~ * ' ( ) # ; , / ? : @ & = + $
encodeURI 函数是用于在参数字符串中指定整个 URI(例如 https://www.example.com/ 等)的函数。因此,不对 URI 中具有特殊含义的 / 和 & 等字符进行编码。因此,当参数的值中包含 & 字符时,就会出现问题。
看看下面的示例。
let uri = 'https://www.example.com/微博/park.html'
console.log(encodeURI(uri));
>> https://www.example.com/%E5%BE%AE%E5%8D%9A/park.html
let uri = 'https://www.example.com/公园.html?place=sea&park'
console.log(encodeURI(uri));
>>https://www.example.com/%E5%85%AC%E5%9B%AD.html?place=sea&park
像第一个 URI 这样的情况没有问题,但是在像第二个 URI 这样的参数中包含 & 作为值的情况下,它没有被 encodeURI 函数编码,因此不能使用。在这种情况下,使用仅对参数值进行编码的 encodeURIComponent 函数。
如何使用 decodeURI 函数
要解码由 encodeURI 函数编码的内容,请使用全局函数之一,即 decodeURI 函数。格式如下。
decodeURI(strEncodedURI)
为参数指定目标编码字符串。返回值是一个新字符串,用于解码由 encodeURI 函数编码的字符。
看看下面的示例。
let encodedURI = 'https://www.example.com/%E5%BE%AE%E5%8D%9A/park.html'
console.log(decodeURI(encodedURI));
>> https://www.example.com/微博/park.html
我能够来回解码编码的 URI。
如何使用 encodeURIComponent 函数
全局函数之一,encodeURIComponent 函数,对指定为参数的字符串中的特殊字符进行编码。格式如下。
encodeURIComponent(str)
指定参数的目标字符串。返回一个新字符串,该字符串对字符串中的特殊字符进行编码。
encodeURIComponent 函数对除以下字符以外的所有字符进行编码:(字母数字字符为 A-Z、a-z 和 0-9)。例如,所有日文字符都经过编码。
英数字 - _ . ! ~ * ' ( )
encodeURIComponent 函数还对 encodeURI 函数未编码的以下字符进行编码。
# ; , / ? : @ & = + $
encodeURIComponent 函数是在参数字符串中仅指定 URI 中包含的参数部分时使用的函数。因此像 & 这样的字符也会被编码。如果您将整个 URI 字符串指定为参数,它将被编码为包括 /,这是一个问题。
看看下面的示例。
let uri = 'https://www.example.com/公园.html?';
let para = 'place=sea&park'
console.log(encodeURIComponent(para));
>> place%3Dsea%26park
encodeURIComponent 函数也对 & 进行编码,因此如果参数中的值包含 & 等,它将返回编码后的值。
请看另一个例子。
let uri = 'https://www.example.com/微博/park.html'
console.log(encodeURIComponent(uri));
>> https%3A%2F%2Fwww.example.com%2F%E5%BE%AE%E5%8D%9A%2Fpark.html
如果表示 URI 的整个字符串被指定为参数,它将被编码为包括冒号 (:) 和斜杠 (/)。在这种情况下使用 encodeURI 函数。
如何使用 decodeURIComponent 函数
要解码由 encodeURIComponent 函数编码的内容,请使用全局函数之一,即 decodeURIComponent 函数。格式如下。
decodeURIComponent(strEncoded)
为参数指定目标编码字符串。返回一个新字符串,该字符串解码由 encodeURIComponent 函数编码的字符。
看看下面的示例。
let strEncode = 'place%3Dsea%26park'
console.log(decodeURIComponent(strEncode));
>> place=sea&park
我能够解码编码的字符串并将其取回。