JavaScript之全局函数详解
JavaScript全局函数
前⾔
今天在搬砖的时候页⾯上有个根据传过来的算法通过js全局函数eval()进⾏计算的js需求 属实有被恶⼼到 今天博主就整理下JavaScript的全局函数 防⽌以后再被这种问题使绊⼦ 也希望对⼤家有所帮助
⼀、JavaScript全局函数有哪些?
函数描述
decodeURI()解码某个编码的 URI。
decodeURIComponent()解码⼀个编码的 URI 组件。
encodeURI()把字符串编码为 URI。
encodeURIComponent()把字符串编码为 URI 组件。
escape()对字符串进⾏编码。
eval()计算 JavaScript 字符串,并把它作为脚本代码来执⾏。
isFinite()检查某个值是否为有穷⼤的数。
isNaN()检查某个值是否是数字。
Number()把对象的值转换为数字。
parseFloat()解析⼀个字符串并返回⼀个浮点数。
parseInt()解析⼀个字符串并返回⼀个整数。
String()把对象的值转换为字符串。
unescape()对由 escape() 编码的字符串进⾏解码。
⼆、JavaScript全局函数详解?
2.1.Eval()
2.1.1.例⼦⼀
⾸先看⽰例:
eval("x=10;y=20;document.write(x*y)");
document.write("<br>"+eval("2+2"));
document.write("<br>"+eval(x+17));
结果:
200
4
27
特殊⽤法{}:
document.write("<br>"+ eval{3+3}));
这时返回结果为:6 我们发现{}这样使⽤和()其实是⼀样的 不同在于:
/
/{}/2 这种写法是不⽀持的
document.write("<br>"+ eval{3+3}/2));
//()是可以的
document.write("<br>"+eval(3+3)/2));
//若是{}也想进⾏此类计算也可以如下:
document.write("<br>"+ eval{(3+3)/2}));
2.1.2.例⼦⼆
看⼀下在其他情况中,eval() 返回的结果:
eval("2+3")// 返回 5
var myeval = eval;// 可能会抛出 EvalError 异常
myeval("2+3");// 可能会抛出 EvalError 异常
可以使⽤下⾯这段代码来检测 eval() 的参数是否合法:
try{
alert("Result:"+eval(prompt("Enter an expression:","")));
}catch(exception){
alert(exception);
}
2.1.
3.例⼦三(解析JSON字符串)
2.1.
3.1.eval解析函数:
JSON 不允许包含函数,但你可以将函数作为字符串存储,之后再将字符串转换为函数。
var text ='{ "name":"Runoob", "alexa":"function () {return 10000;}", "site":"www.runoob"}';
var obj =JSON.parse(text);
obj.alexa =eval("("+ obj.alexa +")");
2.1.
3.2.JSON字符串转换为对象的两种⽅法
//将JSON字符串转为JS对象的⽅法⼀
var obj =JSON.parse('{ "name":"runoob", "alexa":10000, "site":"www.runoob" }');
document.write(obj.name +"<br/>");
//将JSON字符串转为JS对象的⽅法⼆
//JSON格式的字符串
var test1 ='{"name":"qlq","age":25}';
var obj2 =eval("("+ test1 +")");//必须带圆括号
document.write(obj2.name +"<br/>"+ obj2.age);
结果:
runoob
qlq
25
为什么要 eval这⾥要添加 eval("(" + test1 + “)”)//”呢?
原因在于:eval本⾝的问题。 由于json是以”{}”的⽅式来开始以及结束的,在JS中,它会被当成⼀个语句块来处理,所以必须强制性的将它转换成⼀种表达式。
加上圆括号的⽬的是迫使eval函数在处理JavaScript代码的时候强制将 括号内的表达式(expression)转化为对象,⽽不是作为语 句(statement)来执⾏。举⼀个例⼦,例如对象字⾯量{},如若不加外层
的括号,那么eval会将⼤括号识别为JavaScript代码块的开始 和结束标记,那么{}将会被认为是执⾏了⼀句空语句。所以下⾯两个执⾏结果是不同的:
alert(eval("{}");// return undefined
alert(eval("({})");// return object[Object]
对于这种写法,在JS中,可以到处看到。
如: (function()) {}(); 做闭包操作时等。
length);//输出root的⼦对象数量
$.,fucntion(idx,item){
if(idx==0){
return true;
}
//输出每个root⼦对象的名称和值
alert("name:"+item.name+",value:"+item.value);
})
注:对于⼀般的js⽣成json对象,只需要将$.each()⽅法替换为for语句即可,其他不变。
2.1.
3.3.对于服务器返回的JSON字符串,如果jquery异步请求将 type(⼀般为这个配置属性)设为"json",或者利
⽤$.getJSON()⽅法获得服务器返回,那么就不需要eval()⽅法了,因为这时候得到的结果已经是json对象了,只需直接调⽤该对象即可,这⾥以$.getJSON⽅法为例说明数据处理⽅法:
$.getJSON("www.phpzixue/",{param:"gaoyusi"},function(data){
//此处返回的data已经是json对象
//以下其他操作同第⼀种情况
$.,function(idx,item){
if(idx==0){
return true;//同countinue,返回false同break
}
alert("name:"+item.name+",value:"+item.value);
});
});
这⾥特别需要注意的是⽅式1中的eval()⽅法是动态执⾏其中字符串(可能是js脚本)的,这样很容易会造成系统的安全问题。所以可以采⽤⼀些规避了eval()的第三⽅客户端脚本库,⽐如JSON in JavaScript就提供了⼀个不超过3k的脚本库。
2.1.
3.
4.补充:eval()解析的JSON的key可以不带""
⼀般的JSON的key必须带双引号,也就是类似于{"key":"vslue"}的形式,但是如果⽤eval("("+json+")")的形式解析字符串为JSON的时
候,json可以写为{key:"value"}
2.2.decodeURI()与 decodeURIComponent() – 解码函数
javascript全局数组decodeURI() 可对 encodeURI() 函数编码过的 URI 进⾏解码
如:
const aaa ='#$ ¥%23ccc/'
console.log(encodeURI(aaa));// #$%20%EF%BF%A5%2523ccc/
console.log(decodeURI(aaa));// #$ ¥%23ccc/
console.log(encodeURIComponent(aaa));// %23%24%20%EF%BF%A5%2523ccc%2F
console.log(decodeURIComponent(aaa));// #$ ¥#ccc/
我们在获取地址栏参数是通常封装成如下函数:
export function getQueryObject(url){
url = url || window.location.href
const search = url.substring(url.lastIndexOf('?')+1)
const obj ={}
const reg =/([^?&=]+)=([^?&=]*)/g
const name =decodeURIComponent($1)
let val =decodeURIComponent($2)
val =String(val)
obj[name]= val
return rs
})
return obj
}
deURI()与encodeURIComponent() — 编码函数
encodeURI():
语法
encodeURI(URIstring)
参数 描述
URIstring 必需。⼀个字符串,含有 URI 或其他要编码的⽂本。
返回值
URIstring 的副本,其中的某些字符将被⼗六进制的转义序列进⾏替换。
说明
该⽅法不会对 ASCII 字母和数字进⾏编码,也不会对这些 ASCII 标点符号进⾏编码: - _ . ! ~ * ’ ( ) 。
该⽅法的⽬的是对 URI 进⾏完整的编码,因此对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI() 函数是不会进⾏转义的:;/?: @&=+$,#
encodeURIComponent() :
语法
encodeURIComponent(URIstring)
参数 描述
URIstring 必需。⼀个字符串,含有 URI 组件或其他要编码的⽂本。
返回值
URIstring 的副本,其中的某些字符将被⼗六进制的转义序列进⾏替换。
说明
该⽅法不会对 ASCII 字母和数字进⾏编码,也不会对这些 ASCII 标点符号进⾏编码: - _ . ! ~ * ’ ( ) 。
其他字符(⽐如 :;/? &=+$,# 这些⽤于分隔 URI 组件的标点符号),都是由⼀个或多个⼗六进制的转义序列替换的。
提⽰和注释
提⽰:请注意 encodeURIComponent() 函数 与 encodeURI() 函数的区别之处,前者假定它的参数是 URI 的⼀部分(⽐如协议、主机名、路径或查询字符串)。因此 encodeURIComponent() 函数将转义⽤于分隔 URI 各个部分的标点符号。
enCodeURI⽰例:
<html>
<body>
<script type="text/javascript">
document.write(encodeURI("www.w3school")+"<br />")
document.write(encodeURI("www.w3school/My first/")+"<br />")
document.write(encodeURI(",/?:@&=+$#"))
</script>
</body>
</html>
输出结果:
对整个URL进⾏编码,⽽URL的特定标识符不会被转码。
encodeURIComponent() ⽰例:
<script type="text/javascript">
document.write(encodeURIComponent("www.w3school"))
document.write("<br />")
document.write(encodeURIComponent("www.w3school/p 1/"))
document.write("<br />")
document.write(encodeURIComponent(",/?:@&=+$#"))
</script>
输出结果:
http%3A%2F%2Fwww.w3school
http%3A%2F%2Fwww.w3school%2Fp%201%2F
%2C%2F%3F%3A%40%26%3D%2B%24%23
对URL中的参数进⾏编码,因为参数也是⼀个URL,如果不编码会影响整个URL的跳转。
2.4.escape()
语法
escape(string)
参数 描述
string 必需。要被转义或编码的字符串。
返回值
已编码的 string 的副本。其中某些字符被替换成了⼗六进制的转义序列。
说明
该⽅法不会对 ASCII 字母和数字进⾏编码,也不会对下⾯这些 ASCII 标点符号进⾏编码: * @ - _ + . / 。其他所有的字符都会被转义序列替换。
注意:ECMAScript v3 反对使⽤该⽅法,应⽤使⽤ decodeURI() 和 decodeURIComponent() 替代它。
⽰例:
<script type="text/javascript">
document.write(escape("Visit W3School!")+"<br />")
document.write(escape("?!=()#%&"))
</script>
结果:
Visit%20W3School%21
%3F%21%3D%28%29%23%25%26
2.5.isFinite()
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论