【JavaScript 标准内置对象】-函数属性

简言

全局函数可以直接调用,不需要在调用时指定所属对象,执行结束后会将结果直接返回给调用者。
全局内置函数有:

  • eval() : eval() 函数会将传入的字符串当做 JavaScript 代码进行执行。
  • isFinite():该全局 isFinite() 函数用来判断被传入的参数值是否为一个有限数值(finite number)。在必要情况下,参数会首先转为一个数值。
  • isNaN():isNaN() 函数用来确定一个值是否为NaN 。
  • parseFloat():parseFloat() 函数解析一个参数(必要时先转换为字符串)并返回一个浮点数。
  • parseInt():parseInt(string, radix) 解析一个字符串并返回指定基数的十进制整数,radix 是 2-36 之间的整数,表示被解析字符串的基数。
  • decodeURI():decodeURI(): 函数能解码由encodeURI 创建或其他流程得到的统一资源标识符(URI)。
  • decodeURIComponent(): decodeURIComponent() 方法用于解码由 encodeURIComponent 方法或者其他类似方法编码的部分统一资源标识符(URI)。
  • encodeURI():encodeURI() 函数通过将特定字符的每个实例替换为一个、两个、三或四转义序列来对统一资源标识符 (URI) 进行编码 (该字符的 UTF-8 编码仅为四转义序列) 由两个 “代理” 字符组成)。
  • encodeURIComponent():encodeURIComponent() 函数通过将特定字符的每个实例替换成代表字符的 UTF-8 编码的一个、两个、三个或四个转义序列来编码 URI(只有由两个“代理”字符组成的字符会被编码为四个转义序列)。与 encodeURI() 相比,此函数会编码更多的字符,包括 URI 语法的一部分。

eval

eval(string) 函数会将传入的字符串当做 JavaScript 代码进行执行。
语法
eval(string)

参数(string),是一个表示 JavaScript 表达式、语句或一系列语句的字符串。表达式可以包含变量与已存在对象的属性。
返回值:返回字符串中代码的返回值。如果返回值为空,则返回 undefined。

console.log(eval('2 + 2'));
// Expected output: 4

console.log(eval(new String('2 + 2')));
// Expected output: 2 + 2

console.log(eval('2 + 2') === eval('4'));
// Expected output: true

console.log(eval('2 + 2') === eval(new String('2 + 2')));
// Expected output: false

eval函数会导致网页安全问题,最好不要使用。

isFinite

该全局 isFinite() 函数用来判断被传入的参数值是否为一个有限数值(finite number)。在必要情况下,参数会首先转为一个数值。
语法
isFinite(testValue)
参数
testValue
用于检测有限性(finiteness)的值。
你可以用这个方法来判定一个数字是否是有限数字。isFinite 方法检测它参数的数值。如果参数是 NaN,正无穷大或者负无穷大,会返回false,其他返回 true。

isFinite(Infinity);  // false
isFinite(NaN);       // false
isFinite(-Infinity); // false

isFinite(0);         // true
isFinite(2e64);      // true,在更强壮的 Number.isFinite(null) 中将会得到 false


isFinite("0");       // true,在更强壮的 Number.isFinite('0') 中将会得到 false

isNaN

isNaN() 函数用来确定一个值是否为NaN。
语法
isNaN(value)
参数
value
要被检测的值。

返回值
如果给定值为 NaN则返回值为true;否则为false。

注意:isNaN()在执行时,会先将参数value转换成数值,然后再判断是否为NaN。

isNaN(NaN);       // true
isNaN(undefined); // true
isNaN({});        // true

isNaN(true);      // false
isNaN(null);      // false
isNaN(37);        // false

// strings
isNaN("37");      // false: 可以被转换成数值 37
isNaN("37.37");   // false: 可以被转换成数值 37.37
isNaN("37,5");    // true
isNaN('123ABC');  // true:  parseInt("123ABC") 的结果是 123,但是 Number("123ABC") 结果是 NaN
isNaN("");        // false: 空字符串被转换成 0
isNaN(" ");       // false: 包含空格的字符串被转换成 0

// dates
isNaN(new Date());                // false
isNaN(new Date().toString());     // true

isNaN("blabla")   // true: "blabla"不能转换成数值
                  // 转换成数值失败,返回 NaN

建议用Number.isNaN()和x !== x两种方式代替isNaN()函数。

parseFloat

parseFloat() 函数解析一个参数(必要时先转换为字符串)并返回一个浮点数。
语法
parseFloat(string)
参数
string
需要被解析成为浮点数的值。

返回值
给定值被解析成浮点数。如果给定值不能被转换成数值,则会返回 NaN。

function circumference(r) {
  return parseFloat(r) * 2.0 * Math.PI;
}

console.log(circumference(4.567));
// Expected output: 28.695307297889173

console.log(circumference('4.567abcdefgh'));
// Expected output: 28.695307297889173

console.log(circumference('abcdefgh'));
// Expected output: NaN

parseFloat 是个全局函数,不属于任何对象。有以下特点:

  • 如果 parseFloat 在解析过程中遇到了正号(+)、负号(- U+002D HYPHEN-MINUS)、数字(0-9)、小数点(.)、或者科学记数法中的指数(e 或 E)以外的字符,则它会忽略该字符以及之后的所有字符,返回当前已经解析到的浮点数。
  • 第二个小数点的出现也会使解析停止(在这之前的字符都会被解析)。
  • 参数首位和末位的空白符会被忽略。
  • 如果参数字符串的第一个字符不能被解析成为数字,则 parseFloat 返回 NaN。
  • parseFloat 也可以解析并返回 Infinity。
  • parseFloat 解析 BigInt 为 Numbers, 丢失精度。因为末位 n 字符被丢弃。
  • arseFloat 也可以转换一个已经定义了 toString 或者 valueOf 方法的对象,它返回的值和在调用该方法的结果上调用 parseFloat 值相同。
parseFloat(3.14);	//	3.14
parseFloat('3.14');	//	3.14
parseFloat('  3.14  ');	// 3.14
parseFloat('314e-2');	//	3.14
parseFloat('0.0314E+2');	//	3.14
parseFloat('3.14some non-digit characters');	//	3.14
parseFloat({ toString: function() { return "3.14" } });	//	3.14

parseFloat("FF2"); 	//	NaN
parseFloat(900719925474099267n);	//	900719925474099300 精度丢失
parseFloat('900719925474099267n');	//	900719925474099300  精度丢失

parseInt

parseInt(string, radix) 解析一个字符串并返回指定基数的十进制整数,radix 是 2-36 之间的整数,表示被解析字符串的基数。
语法
parseInt(string, radix);
参数
string
要被解析的值。如果参数不是一个字符串,则将其转换为字符串 (使用 ToString抽象操作)。字符串开头的空白符将会被忽略。

radix_ 可选_
从 2 到 36 的整数,表示进制的基数。例如指定 16 表示被解析值是十六进制数。如果超出这个范围,将返回 NaN。假如指定 0 或未指定,基数将会根据字符串的值进行推算。注意,推算的结果不会永远是默认值 10!文章后面的描述解释了当参数 radix 不传时该函数的具体行为。
对于 radix 为 10 以上的,英文字母表示大于 9 的数字。例如,对于十六进制数(基数 16),则使用 A 到 F。

返回值
从给定的字符串中解析出的一个整数。

或者 NaN,当

  • radix 小于 2 或大于 36,或
  • 第一个非空格字符不能转换为数字。

parseInt(‘123’, 5) // 将’123’看作 5 进制数,返回十进制数 38 => 15^2 + 25^1 +3*5^0 = 38

如果 parseInt 遇到的字符不是指定 radix 参数中的数字,它将忽略该字符以及所有后续字符,并返回到该点为止已解析的整数值。parseInt 将数字截断为整数值。允许前导和尾随空格。

由于某些数字在其字符串表示形式中使用 e 字符(例如 6.022×23 表示 6.022e23 ),因此当对非常大或非常小的数字使用数字时,使用 parseInt 截断数字将产生意外结果。parseInt不应替代 Math.floor()。

parseInt 可以理解两个符号。+ 表示正数,- 表示负数(从 ECMAScript 1 开始)。它是在去掉空格后作为解析的初始步骤进行的。如果没有找到符号,算法将进入下一步;否则,它将删除符号,并对字符串的其余部分进行数字解析。

如果 radix 是 undefined、0 或未指定的,JavaScript 会假定以下情况:

  • 如果输入的 string 以 0x 或 0X(一个 0,后面是小写或大写的 X)开头,那么 radix 被假定为 16,字符串的其余部分被当做十六进制数去解析。
  • 如果输入的 string 以 “0”(0)开头,radix 被假定为 8(八进制)或 10(十进制)。具体选择哪一个 radix 取决于实现。ECMAScript 5 澄清了应该使用 10 (十进制),但不是所有的浏览器都支持。因此,在使用 parseInt 时,一定要指定一个 radix。
  • 如果输入的 string 以任何其他值开头,radix 是 10 (十进制)。

如果第一个字符不能转换为数字,parseInt 会返回 NaN。

//	均返15
parseInt("0xF", 16);
parseInt("F", 16);
parseInt("17", 8);
parseInt(021, 8);
parseInt("015", 10);   // parseInt(015, 8); 返回 13
parseInt(15.99, 10);
parseInt("15,123", 10);
parseInt("FXX123", 16);
parseInt("1111", 2);
parseInt("15 * 3", 10);
parseInt("15e2", 10);
parseInt("15px", 10);
parseInt("12", 13);
//	NaN
parseInt("Hello", 8); // 根本就不是数值
parseInt("546", 2);   // 除了“0、1”外,其他数字都不是有效二进制数字

//	-15
parseInt("-F", 16);
parseInt("-0F", 16);
parseInt("-0XF", 16);
parseInt(-15.1, 10);
parseInt(" -17", 8);
parseInt(" -15", 10);
parseInt("-1111", 2);
parseInt("-15e1", 10);
parseInt("-12", 13);

//	4
parseInt(4.7, 10);
parseInt(4.7 * 1e22, 10); // 非常大的数值变成 4
parseInt(0.00000000000434, 10); // 非常小的数值变成 4

decodeURI

decodeURI() 函数能解码由encodeURI 创建或其他流程得到的统一资源标识符(URI)。
decodeURI()函数和encodeURI()函数一般配套使用,很少单独使用。
语法
decodeURI(encodedURI)
参数
encodedURI
一个完整的编码过的 URI

返回值
返回一个给定编码统一资源标识符 (URI) 的未编码版本的新字符串。
将已编码 URI 中所有能识别的转义序列转换成原字符,但不能解码那些不会被 encodeURI 编码的内容(例如 “#”)。

decodeURI("https://developer.mozilla.org/ru/docs/JavaScript_%D1%88%D0%B5%D0%BB%D0%BB%D1%8B");
// "https://developer.mozilla.org/ru/docs/JavaScript_шеллы"

encodeURI

encodeURI() 函数通过将特定字符的每个实例替换为一个、两个、三或四转义序列来对统一资源标识符 (URI) 进行编码 (该字符的 UTF-8 编码仅为四转义序列) 由两个 “代理” 字符组成)。
语法
encodeURI(URI)
参数
URI
一个完整的 URI。
返回值
一个新字符串,表示提供的字符串编码为统一资源标识符 (URI)。

假定一个 URI 是完整的 URI,那么无需对那些保留的并且在 URI 中有特殊意思的字符进行编码。

// http://username:password@www.example.com:80/path/to/file.php?foo=316&bar=this+has+spaces#anchor
console.log(
  encodeURI(
    "http://username:password@www.example.com:80/path/to/file.php?foo=316&bar=this+has+spaces#anchor"
  )
);
//	%E5%93%88%E5%93%88%E5%93%88%20#anchor
console.log(encodeURI("哈哈哈 #anchor"));

encodeURI 会替换所有的字符,但不包括以下字符,即使它们具有适当的 UTF-8 转义序列:

类型包含
保留字符; , / ? : @ & = + $
非转义的字符字母 数字 - _ . ! ~ * ’ ( )
数字符号#

另外,如果试图编码一个非高 - 低位完整的代理字符,将会抛出一个 URIError 错误,例如:

// 编码高 - 低位完整字符 ok
console.log(encodeURI('\uD800\uDFFF'));

// 编码单独的高位字符抛出 "Uncaught URIError: URI malformed"
console.log(encodeURI('\uD800'));

// 编码单独的低位字符抛出 "Uncaught URIError: URI malformed"
console.log(encodeURI('\uDFFF'));

decodeURIComponent

decodeURIComponent() 方法用于解码由 encodeURIComponent 方法或者其他类似方法编码的部分统一资源标识符(URI)。
将已编码 URI 中所有能识别的转义序列转换成原字符。
decodeURIComponent一般和encodeURIComponent 配套使用。
语法
decodeURIComponent(encodedURI)
参数
encodedURI
编码后的部分 URI

返回值
一个解码后的统一资源标识符(URI)字符串,处理前的 URI 经过了给定格式的编码。

decodeURIComponent("JavaScript_%D1%88%D0%B5%D0%BB%D0%BB%D1%8B");
// "JavaScript_шеллы"
console.log(decodeURIComponent("JavaScript_%D1%88%D0%B5%D0%BB%D0%BB%D1%8B"));
console.log(decodeURI("JavaScript_%D1%88%D0%B5%D0%BB%D0%BB%D1%8B"));

encodeURIComponent

encodeURIComponent() 函数通过将特定字符的每个实例替换成代表字符的 UTF-8 编码的一个、两个、三个或四个转义序列来编码 URI(只有由两个“代理”字符组成的字符会被编码为四个转义序列)。与 encodeURI() 相比,此函数会编码更多的字符,包括 URI 语法的一部分。
语法
encodeURIComponent(str);
参数
str
一个 string、number、boolean、null,undefined 或者任何 object。在编码之前,str参数会被转化为字符串。

返回值
原字串作为 URI 组成部分被被编码后的新字符串。
encodeURIComponent 转义除了如下所示外的所有字符:

不转义的字符:
A-Z a-z 0-9 - _ . ! ~ * ’ ( )

var set1 = ";,/?:@&=+$";  // 保留字符
var set2 = "-_.!~*'()";   // 不转义字符
var set3 = "#";           // 数字标志
var set4 = "ABC abc 123"; // 字母数字字符和空格

console.log(encodeURI(set1)); // ;,/?:@&=+$
console.log(encodeURI(set2)); // -_.!~*'()
console.log(encodeURI(set3)); // #
console.log(encodeURI(set4)); // ABC%20abc%20123 (空格被编码为 %20)

console.log(encodeURIComponent(set1)); // %3B%2C%2F%3F%3A%40%26%3D%2B%24
console.log(encodeURIComponent(set2)); // -_.!~*'()
console.log(encodeURIComponent(set3)); // %23
console.log(encodeURIComponent(set4)); // ABC%20abc%20123 (空格被编码为 %20)

结语

结束了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZSK6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值