函数使用办法,eval解析JSON字符串的一个小意思

eval解析JSON字符串的一个不成难点

2016/02/24 · JavaScript
· JSON

原文出处: 韩子迟   

事先写过一篇 至于 JSON
的介绍小说,里面谈到了
JSON 的剖析。大家都了然,高级浏览器可以用  JSON.parse() API 将一个 JSON 字符串解析成
JSON 数据,稍微欠妥点的做法,我们得以用 eval() 函数。

JavaScript

var str = ‘{“name”: “hanzichi”, “age”: 10}’; var obj = eval(‘(‘ + str +
‘)’); console.log(obj); // Object {name: “hanzichi”, age: 10}

1
2
3
var str = ‘{"name": "hanzichi", "age": 10}’;
var obj = eval(‘(‘ + str + ‘)’);
console.log(obj); // Object {name: "hanzichi", age: 10}

 

是不是注意到,向 eval() 传参时,str 变量外裹了一层小括号?为啥要如此做?

我们先来探望 eval 函数的定义以及利用。

eval() 的参数是一个字符串。假使字符串表示了一个表明式,eval()
会对表明式求值。假诺参数表示了一个或七个 JavaScript 声明, 那么 eval()
会执行申明。不要调用 eval() 来为算数表明式求值; JavaScript
会自动为算数表达式求值。

粗略地说,eval 函数的参数是一个字符串,如若把字符串 “noString”
化处理,那么获得的将是正常的可以运作的 JavaScript 语句。

怎么说?举个栗子,如下代码:

JavaScript

var str = “alert(‘hello world’)”; eval(str);

1
2
var str = "alert(‘hello world’)";
eval(str);

执行后弹出 “hello world”。大家把 str 变量 “noString”
化,残忍点的做法就是去掉外面的引号,内部调整(转义等),然后就成为了:

JavaScript

alert(‘hello world’)

1
alert(‘hello world’)

very good!那是正规的可以运行的 JavaScript 语句!运行之!

再回去伊始的难点,为何 JSON
字符串要裹上小括号。如若不加,是那个样子的:

JavaScript

var str = ‘{“name”: “hanzichi”, “age”: 10}’; var obj = eval(str); //
Uncaught SyntaxError: Unexpected token :

1
2
var str = ‘{"name": "hanzichi", "age": 10}’;
var obj = eval(str);  // Uncaught SyntaxError: Unexpected token :

恩,报错了。为啥会报错?试试把 str “noString” 化,执行一下:

JavaScript

{“name”: “hanzichi”, “age”: 10}; // Uncaught SyntaxError: Unexpected
token :

1
{"name": "hanzichi", "age": 10};  // Uncaught SyntaxError: Unexpected token :

必然,一个 JSON 对象或者说是一个对象根本就不是能举行的 JavaScript
语句!等等,试试以下代码:

JavaScript

var str = ‘{name: “hanzichi”}’; var obj = eval(str); console.log(obj);
// hanzichi

1
2
3
var str = ‘{name: "hanzichi"}’;
var obj = eval(str);
console.log(obj); // hanzichi

那又是何等鬼?不过给 name 加上 “” 又报错?

JavaScript

亚洲必赢官网 ,var str = ‘{“name”: “hanzichi”}’; var obj = eval(str); // Uncaught
SyntaxError: Unexpected token : console.log(obj);

1
2
3
var str = ‘{"name": "hanzichi"}’;
var obj = eval(str);  // Uncaught SyntaxError: Unexpected token :
console.log(obj);

好啊,快晕了,其实还能将 str “nostring” 化,看看是或不是能科学实施的
JavaScript 语句。前者的结果是:

JavaScript

{name: “hanzichi”}

1
{name: "hanzichi"}

那诚然是一条官方的 JavaScript 语句。{} 大家不但能在 if、for
语句等景观使用,甚至足以在其他时候,因为 ES6 之前 JavaScript
唯有块级功用域,所以对于作用域什么的并不会有啥样冲突。去掉 {}
后 name: "hanzichi"也是法定的讲话,一个 label 语句,label
语句在跳出嵌套的循环中万分好用,具体可以参考 label,而作为
label 语句的标记,name 是无法带引号的,标记能放在 JavaScript
代码的任何职务,用不到也没提到。

如果一个目标有了七个 key,比如 {name: “hanzichi”, age: 10} ,ok,四个 label 语句?将
“hanzhichi” 以及 10
分别作为是言语,可是 说话之间只可以用封号连接!(表明式之间才能用逗号)。所以改成上面这样也是不曾难题的:

JavaScript

var str = ‘{name: “hanzichi”; age: 10}’; var obj = eval(str);
console.log(obj); // 10

1
2
3
var str = ‘{name: "hanzichi"; age: 10}’;
var obj = eval(str);  
console.log(obj); // 10

越扯越远,小说先导代码的荒唐的案由是找到了,为何套个括号就能解决吗?一言以蔽之,()
会把语句转换成表明式,称为语句表达式。括号里的代码都会被撤换为表明式求值并且重临,目的字面量必须作为表明式而存在

本文并不会大谈表达式,关于表明式,能够参照文末链接。值得记住的一些是,表达式永远有一个重返值。一大半表达式会卷入在()
内,小括号内不可能为空,假使有三个表明式,用逗号隔开,也就是所谓的逗号表明式,会回到最后一个的值。

说到表达式,不得不提函数表明式,在此从前翻译过一篇关于马上执行函数表明式的小说,可以参照下,文末。

Read More:

  • [译]JavaScript中:表达式和讲话的区分
  • (译)详解javascript马上执行函数表达式(IIFE)
  • 深刻商讨javascript的 {}
    语句块

    1 赞 1 收藏
    评论

亚洲必赢官网 1

咱俩都知情,高级浏览器可以用  JSON.parse() API 将一个 JSON 字符串解析成
JSON 数据,稍微欠妥点的做法,大家得以用 eval() 函数。

javascript中eval解析JSON字符串,evaljson

大家都知道,高级浏览器可以用  JSON.parse() API 将一个 JSON 字符串解析成
JSON 数据,稍微欠妥点的做法,我们可以用 eval() 函数。

var str = '{"name": "hanzichi", "age": 10}';
var obj = eval('(' + str + ')');
console.log(obj); // Object {name: "hanzichi", age: 10}

是还是不是注意到,向 eval() 传参时,str 变量外裹了一层小括号?为什么要这么做?

咱俩先来看看 eval 函数的定义以及使用。

eval() 的参数是一个字符串。假设字符串表示了一个表明式,eval()
会对表明式求值。若是参数表示了一个或多少个 JavaScript 注解, 那么 eval()
会执行注解。不要调用 eval() 来为算数表明式求值; JavaScript
会自动为算数表明式求值。

不难易行地说,eval 函数的参数是一个字符串,即使把字符串 “noString”
化处理,那么获得的将是例行的能够运行的 JavaScript 语句。

怎么说?举个栗子,如下代码:

var str = "alert('hello world')";
eval(str);

推行后弹出 “hello world”。我们把 str 变量 “noString”
化,无情点的做法就是去掉外面的引号,内部调整(转义等),然后就变成了:

alert('hello world')

very good!这是正规的可以运行的 JavaScript 语句!运行之!

再回到早先的题材,为何 JSON
字符串要裹上小括号。若是不加,是其一样子的:

var str = '{"name": "hanzichi", "age": 10}';
var obj = eval(str); // Uncaught SyntaxError: Unexpected token :

恩,报错了。为啥会报错?试试把 str “noString” 化,执行一下:

{"name": "hanzichi", "age": 10}; 
// Uncaught SyntaxError: Unexpected token :

肯定,一个 JSON 对象或者说是一个目的根本就不是能履行的 JavaScript
语句!等等,试试以下代码:

var str = '{name: "hanzichi"}';
var obj = eval(str);
console.log(obj); // hanzichi

那又是何许鬼?不过给 name 加上 “” 又报错?

var str = '{"name": "hanzichi"}';
var obj = eval(str); // Uncaught SyntaxError: Unexpected token :
console.log(obj);

可以吗,快晕了,其实如故足以将 str “nostring” 化,看看是还是不是能正确履行的
JavaScript 语句。前者的结果是:

{name: "hanzichi"}

那的确是一条官方的 JavaScript 语句。{} 大家不仅能在 if、for
语句等场景使用,甚至可以在其余时候,因为 ES6 此前 JavaScript
唯有块级效能域,所以对于功能域什么的并不会有哪些争辩。去掉 {} 后 name:
“hanzichi”也是法定的讲话,一个 label 语句,label
语句在跳出嵌套的巡回中很是好用,具体可以参见 label,而作为 label
语句的标记,name 是无法带引号的,标记能放在 JavaScript
代码的别的职分,用不到也没提到。

倘若一个目的有了多个 key,比如 {name: “hanzichi”, age: 10} ,ok,七个label 语句?将 “hanzhichi” 以及 10 分别作为是言语,不过语句之间只可以用封号连接!(表达式之间才能用逗号)。所以改成上面那样也是平素不难点的:

var str = '{name: "hanzichi"; age: 10}';
var obj = eval(str); 
console.log(obj); // 10

越扯越远,作品初始代码的荒谬的来头是找到了,为啥套个括号就能化解呢?简单的话,()
会把语句转换成表明式,称为语句表达式。括号里的代码都会被更换为表明式求值并且重回,对象字面量必须作为表达式而存在。

正文并不会大谈表明式,值得记住的少数是,表明式永远有一个重回值。一大半表达式会卷入在()
内,小括号内无法为空,假若有多少个表明式,用逗号隔开,也就是所谓的逗号表明式,会再次回到最后一个的值。

本学科主要重介绍eval()函数的语法与运用方法,及在末端我还增补了eval()解析json数据的相关例子,希望文章能襄助到各位深入通晓eval()使用方法吗。

var str = '{"name": "hanzichi", "age": 10}';
var obj = eval('(' + str + ')');
console.log(obj); // Object {name: "hanzichi", age: 10}

你或许感兴趣的小说:

  • javascript eval和JSON之间的联络
  • js下用eval生成JSON对象
  • jqeury eval将字符串转换json的措施
  • jquery eval解析JSON中的注意点介绍
  • js使用eval解析json(js中使用json)
  • js使用eval解析json实例与注意事项分享
  • 何以JS中eval处理JSON数据要加括号
  • JS使用eval解析JSON的注意事项分析
  • javascript巧用eval函数组装表单输入项为json对象的章程

我们都清楚,高级浏览器能够用 JSON.parse() API 将一个 JSON 字符串解析成
JSON 数据,稍微欠妥点的做法,…

 

是还是不是注意到,向 eval() 传参时,str 变量外裹了一层小括号?为啥要如此做?

后日说到js中尽量不要使用eval,可是eval到底是何许那?明日大家就说说eval的那一点事。
 

咱俩先来看看 eval 函数的定义以及使用。

函数使用办法,eval解析JSON字符串的一个小意思。率先看一下本定义:

eval() 的参数是一个字符串。借使字符串表示了一个表明式,eval()
会对表达式求值。如若参数表示了一个或多个 JavaScript 申明, 那么 eval()
会执行表明。不要调用 eval() 来为算数表明式求值; JavaScript
会自动为算数表明式求值。

概念和用法

一言以蔽之地说,eval 函数的参数是一个字符串,即使把字符串 “noString”
化处理,那么得到的将是正常的能够运行的 JavaScript 语句。

eval() 函数可计算某个字符串,并进行其中的的 JavaScript 代码。

怎么说?举个栗子,如下代码:

语法

var str = "alert('hello world')";
eval(str);

eval(string)

推行后弹出 “hello world”。大家把 str 变量 “noString”
化,无情点的做法就是去掉外面的引号,内部调整(转义等),然后就改为了:

 

alert('hello world')

参数

very good!那是健康的可以运行的 JavaScript 语句!运行之!

描述

再回来早先的题材,为什么 JSON
字符串要裹上小括号。如果不加,是以此样子的:

 

var str = '{"name": "hanzichi", "age": 10}';
var obj = eval(str); // Uncaught SyntaxError: Unexpected token :

string    必需。要计算的字符串,其中蕴蓄要总结的 JavaScript
表明式或要执行的说话。   

恩,报错了。为何会报错?试试把 str “noString” 化,执行一下:

返回值

{"name": "hanzichi", "age": 10}; 
// Uncaught SyntaxError: Unexpected token :

经过测算 string 拿到的值(若是有的话)。

自然,一个 JSON 对象或者说是一个对象根本就不是能执行的 JavaScript
语句!等等,试试以下代码:

说明

var str = '{name: "hanzichi"}';
var obj = eval(str);
console.log(obj); // hanzichi

该措施只接受原始字符串作为参数,倘若 string
参数不是原始字符串,那么该方法将不作任何改变地回去。由此请不要为 eval()
函数传递 String 对象来作为参数。

那又是怎么鬼?可是给 name 加上 “” 又报错?

一旦准备覆盖 eval 属性或把 eval()
方法予以另一个属性,并透过该属性调用它,则 ECMAScript 已毕允许抛出一个
EvalError 极度。

var str = '{"name": "hanzichi"}';
var obj = eval(str); // Uncaught SyntaxError: Unexpected token :
console.log(obj);

抛出

好啊,快晕了,其实还可以将 str “nostring” 化,看看是或不是能科学执行的
JavaScript 语句。前者的结果是:

假定参数中尚不可以定的表明式和语句,则抛出 SyntaxError 十分。

{name: "hanzichi"}

要是私自调用 eval(),则抛出 伊娃lError 十分。

这确实是一条官方的 JavaScript 语句。{} 大家不但能在 if、for
语句等情景使用,甚至可以在其余时候,因为 ES6 在此以前 JavaScript
唯有块级作用域,所以对于功能域什么的并不会有啥冲突。去掉 {} 后 name:
“hanzichi”也是官方的口舌,一个 label 语句,label
语句在跳出嵌套的轮回中国和澳大利亚常好用,具体能够参照 label,而作为 label
语句的符号,name 是不可能带引号的,标记能放在 JavaScript
代码的其余地方,用不到也没提到。

若果传递给 eval() 的
Javascript 代码生成了一个至极,eval()
将把该越发传递给调用者。

假定一个对象有了三个 key,比如 {name: “hanzichi”, age: 10} ,ok,两个label 语句?将 “hanzhichi” 以及 10 分别作为是唇舌,但是语句之间只能够用封号连接!(表明式之间才能用逗号)。所以改成上边那样也是绝非难题的:

升迁和注释

var str = '{name: "hanzichi"; age: 10}';
var obj = eval(str); 
console.log(obj); // 10

唤醒:就算 eval() 的成效很是强劲,但在实际上利用中用到它的情景并不多。

越扯越远,小说伊始代码的一无是处的缘故是找到了,为啥套个括号就能解决吧?一言以蔽之,()
会把语句转换成表达式,称为语句表达式。括号里的代码都会被撤换为表明式求值并且再次来到,对象字面量必须作为表明式而存在。

 

本文并不会大谈表明式,值得铭记的一点是,表明式永远有一个再次回到值。大部分表达式会卷入在()
内,小括号内无法为空,如果有多少个表达式,用逗号隔开,也就是所谓的逗号表明式,会回来最终一个的值。

实例代码:

您可能感兴趣的篇章:

  • JavaScript
    解析Json字符串的属性相比分析代码
  • VBScript把json字符串解析成json对象的2个法子
  • PHP处理JSON字符串key缺乏双引号的解决办法
  • PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠
  • C#解析json字符串总是多出双引号的原因剖析及解决办法

eval函数接收一个参数s,即便s不是字符串,则平昔再次回到s。否则执行s语句。如果s语句执行结果是一个值,则赶回此值,否则重返undefined。 
内需更加注意的是目的申明语法“{}”并不可以回来一个值,必要用括号括起来才会重临值,简单示例如下:

 代码如下

复制代码

var code1='”a” + 2′; //表达式
  
varcode2='{a:2}’; //语句
  
alert(eval(code1)); //->’a2′
  
alert(eval(code2)); //->undefined
  
alert(eval(‘(‘ + code2 + ‘)’)); //->[object Object]

eval函数的性状,它总是在调用它的上下文变量空间(也号称:包,closure)内执行,无论是变量定义依旧函数定义都是那般

eval作用域

先看那段代码:

 代码如下

复制代码

var x = 1;
(function () {
    eval(‘var x = 123;’);
})();
console.log(x);

其一代码获得的是 1 而不是 123
假如想让 eval 执行的代码是大局的,那么有二种艺术。

 代码如下

复制代码

var x = 1;
(function () {
    window.eval(‘var x = 123;’);
})();
console.log(x);

以此艺术标准浏览器都足以收获 123 而IE6-8则仍旧是 1

一律的比如

 代码如下

复制代码

var arr = [0,0,0,0,0,0];
(function () {
    var arr = [1,1,1,1,1,1];
    var _eval = eval;
    window.eval(‘arr[0] = 123;’);
    eval.call(null, ‘arr[1] = 123;’);
    _eval(‘arr[2] = 123;’);
    (0,eval)(‘arr[3] = 123;’);
})();
console.log(arr);

0,1 貌似不协理IE8- 2,3 貌似不辅助 IE7-
左右归根结蒂就是包容性有标题。

可是还在IE下有个 execScript 格外好使。

 代码如下

复制代码

var x = 1;
(function () {
    (!-[1,] ? execScript : eval)(‘var x = 123;’);
})();
console.log(x);

eval不可以在大局空间内实施,那就给支付带动了好多难题,也看出过不少人为此郁闷。 
不过现在偶终于找到精通决办法,嘿嘿,可以而且包容IE和Firefox,方法如下:

 代码如下

复制代码

var X2={} //my namespace:)
  
X2.Eval=function(code){
  
if(!!(window.attachEvent && !window.opera)){
  
//ie
  
execScript(code);
  
}else{
  
//not ie
  
window.eval(code);
  
}
  
}

现在如果要想在函数内定义全局代码,就足以因此调用X2.eval_r(code)方法。

 代码如下

复制代码

var s=’global’;
  
function demo3(){
  
X2.Eval(‘var s=”local”‘);
  
}
  
demo3();
  
alert(s); //->’local’

eval解析json

代码如下:

 代码如下

复制代码

var data=” 

root: 

{name:’1′,value:’0′}, 
{name:’6101′,value:’北京市’}, 
{name:’6102′,value:’天津市’}, 
{name:’6103′,value:’上海市’}, 
{name:’6104′,value:’重庆市’}, 
{name:’6105′,value:’渭南市’}, 
{name:’6106′,value:’延安市’}, 
{name:’6107′,value:’汉中市’}, 
{name:’6108′,value:’榆林市’}, 
{name:’6109′,value:’安康市’}, 
{name:’6110′,value:’商洛市’} 
]
}”; 

 
 
这里以jquery异步获取的数据类型——json对象和字符串为按照,分别介绍二种方法获取到的结果处理方式。
 
1.对此服务器再次来到的JSON字符串,若是jquery异步请求没做项目表明,或者以字符串形式收受,那么必要做一回对象化处理,格局不是太辛劳,就是将该字符串放于eval()中推行三回。那种措施也切合以一般性javascipt方式赢得json对象,以下举例表达:
 
var dataObj=eval(“(“+data+”)”);//转换为json对象
 
为何要 eval那里要添加 “(“(“+data+”)”);//”呢?
 
案由在于:eval本身的题材。
由于json是以”{}”的法门来先导以及为止的,在JS中,它会被当成一个语句块来拍卖,所以必须强制性的将它转换成一种表明式。
 
加上圆括号的目的是逼迫eval函数在拍卖JavaScript代码的时候强制将
括号内的表明式(expression)转化为目标,而不是当做语
句(statement)来举办。举一个例子,例如对象字面量{},若是不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开头和竣事标记,那么{}将会被认为是实施了一句空语句。所以上面五个实施结果是例外的:
 
 代码如下:

 代码如下

复制代码

alert(eval(“{}”); // return undefined
alert(eval(“({})”);// return object[Object]

 
 
对于那种写法,在JS中,能够各处看到。
 
如: (function()) {}();  做闭包操作时等。
 
代码如下:

 代码如下

复制代码

alert(dataObj.root.length);//输出root的子对象数量 
$.each(dataObj.root,fucntion(idx,item){ 
if(idx==0){ 
return true; 

//输出每个root子对象的名称和值 
alert(“name:”+item.name+”,value:”+item.value); 
}) 

 
 
注:对于一般的js生成json对象,只须求将$.each()方法替换为for语句即可,其余不变。
 
2.对此服务器再次回到的JSON字符串,如若jquery异步请求将
type(一般为那么些布局属性)设为“json”,或者利
用$.getJSON()方法赢得服务器重返,那么就不需求eval()方法了,因为那时得到的结果早就是json对象了,只需直接调用该对象即可,这里以$.getJSON方法为例表达数据处理形式: 
 
代码如下:

 代码如下

复制代码

$.getJSON(” 
//此处再次回到的data已经是json对象 
//以下其余操作同第一种状态 
$.each(data.root,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的脚本库。

*eval执行的宽广错误

—源码

 代码如下

复制代码

console.log(“Eval Usage”);
var str1_err = “function () {console.log(‘run fun1’)};”;
try{
    eval(str1_err);
}catch(e){
    console.log(” Error! eval(str1_err)”);
    console.log(e.toString());
}
var str1 = “function fun1() {console.log(‘run fun1’)}; fun1();”;
eval(str1);

var str2_err = “{name: ‘dzh’}”;
var result;
try{
    result = eval(str2_err);
    console.log(result.toString());
    console.log(“name: ” + result.name);
}catch(e){
    console.log(” Error! eval(str2_err)”);
    console.log(e.toString());
}
str2 = “({name: ‘dzh’})”;
result = eval(str2);
console.log(result.toString());
console.log(“name: ” + result.name);

—结果

 

Eval Usage
 Error! eval(str1_err)
SyntaxError: Unexpected token (
run fun1
dzh
name: undefined
[object Object]
name: dzh

—分析原因

1)str1_err表明了定义匿名函数导致的报错; 蒙受空的'()’, 会报错;

2)str2_err表达了对于'{}’,引擎解析时会把括号领会为代码块,
而程序原意是一个目的直接量; 所以常用的主意是在'{}’外围加小括号,
那么eval就先进行求值运算, 它就回去对象.

综述, 使用eval时, 要考虑引擎是什么领会传入的字符串代码.

出处:

网站地图xml地图