JSON.parse与eval的区别

(939) 412-3528

JSON.parse与eval和能将一个字符串解析成一个JSON对象,但还是有挺大区别。

测试代码

复制代码
var A = "{  a: 1 , b : 'hello' }";
var B = "{  'a': 1 , 'b' : 'hello' }";
var C = "{'a':1,'b':'hello'}";
var D = '{"a":1,"b":"hello"}';
var E = '{ "a" : 1 , "b" : "hello" }';
var F = '{ "a" : 1 ,\n  "b" : "hello" }';
var G = '{ "a" : 1 , "b" : window.location.href="/www.baidu.com" }';
复制代码

JSON.parse执行:

例:JSON.parse(A);

A、B、C、G都不可转,D、E、F都可以。

eval执行:

例:eval(“(“+A+”)”);

A到G都可以转,特别到G时,页面还跳转到百度了。

JSON.parse

上面的演示例子可以看出,这方法只能解析属性名是双引号包裹的字符串对象,并会忽略换行和空格(值外面)。

但是,从MDN对JSON的描述,能解析的JSON字符串的条件完整如下:

JavaScript类型  JSON与之区别
对象和数组
属性名称必须用双引号包裹;
最后一个属性后面不能有逗号。
数值
前导0不能使用(在 JSON.stringify 中将会被忽略,在 JSON.parse 会抛出错误);
小数点后面至少有一个数字。
字符串
只有有限的字符能够被转义;
不允许某些控制字符;但允许使用Unicode 行分隔符 (U+2028) 和段落分隔符 (U+2029) ;
字符串必须用双引号括起来。

这方法还可以捕捉JSON中的语法错误,并允许你传入一个函数,用来过滤或转换解析结果。

浏览器兼容:IE8+

eval

eval函数可将一个JavaScript代码字符串求值成特定的对象,所以解析成JSON对象只不过是作用之一。

为什么eval()解析JSON字符串要加上括号?

原因是两点:

1. json对象是以”{}”的方式来开始以及结束的,在JS中,它会被当成一个语句块来处理。

2. 加上圆括号为了处理字符串为表达式,而不是语句(statement)来执行。

例子:

对象字面量 {},不加外层的括号,那么eval会识别为JS代码块的开始和结束标记,那么 {} 将会被认为是执行了一句空语句。

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

不建议使用

虽然从演示例子看,eval的能力是强过于JSON.parse的,它可解析不规范的JSON字符串,但是G的例子也可以看出,eval是不安全的,特别是数据是第三方给予时候,你根本不知道eval之后它会干什么。

所以结论就是,乖乖用JSON.parse解析JSON对象。

$.parseJSON

jQuery也有提供解析JSON字符串的方法,$.parseJSON ,就目前jQuery版本来讲,分为两类。

2.x和3.x版本: $.parseJSON 都是直接使用 JSON.parse 的。

1.x版本:浏览器支持 JSON.parse 就用这个,不支持就进行校验,确认是JSON字符串,则用

  ( Function( "return " + str ) )()

返回对象,否则返回无效JSON对象error。

PS:之所以能用Function处理,前提是校验确认为JSON字符串,不然还是不安全的转换方法。

 

总结

eval是强烈不建议用来解析JSON字符串,但是凡事无绝对,如果数据来源于你信任的并且格式也不大规范,那用它也不是不可以。

 

如何优雅地在Terminal中使用Babel7

  • 安装
    • npm install –save-dev @babel/core @babel/cli
  • 将一段ES6代码转译为ES5代码
    • babel es7.decorator.js –out-file es5.decorator.js
  • 当然这仅限于没有特殊要求的ES6语法,如果需要的话,仍然需要配置
    @babel/plugin-proposal-class-properties
    这种plugin

314-438-2506

error An unexpected error occurred: “/Users/maixiaodou/package.json: Unexpected end of JSON input”.

 

父级文件夹有同名package.json

CommonJs模块规范和包规范简要

CommonJs

CommonJs的兴起离不开JavaScript模块化的潮流。传统前端开发写在html文件中的面条式的JavaScript代码存在很多问题,命名冲突,不易维护是主要缺点。模块化在前端开发中的推广和普及成为必然。与之相伴的是模块化规范。常见规范有AMD,CMD,CommonJs

NodeJs采用CommonJs规范,这更使得我们不得不考虑CommonJs的重要性

Continue reading “CommonJs模块规范和包规范简要”

git大小写敏感问题

Git has a configuration setting that tells it whether to be case sensitive or insensitive: core.ignorecase. To tell Git to be case-senstive, simply set this setting to false:

git config core.ignorecase false

Documentation

From the 251-666-6114:

core.ignorecase

If true, this option enables various workarounds to enable git to work better on filesystems that are not case sensitive, like FAT. For example, if a directory listing finds makefile when git expects Makefile, git will assume it is really the same file, and continue to remember it as Makefile.

The default is false, except git-clone(1) or git-init(1) will probe and set core.ignorecase true if appropriate when the repository is created.

Case-insensitive file-systems

The two most popular operating systems that have case-insensitive file systems that I know of are

  • Windows
  • OS X

Nginx反向代理之端口转发

Nginx反向代理之端口转发

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器

/ 格式检查 /etc/nginx/nginx.conf 
nginx -t -c /etc/nginx/nginx.conf
# /etc/nginx/nginx.conf 

http {
    / 当通过 face.danoolive.com:80 端口访问这个服务器时
    / 该请求会被转发到 127.0.0.1:9992
    server {
        listen 80; 
        server_name face.danoolive.com; 
        / 通过访问的路径来处理转发 ...
        location / { 
            / 也不一定是内网 127.0.0.1 ,也可以是另外一个服务器的某个端口等 ...
            proxy_pass /127.0.0.1:9992;
        }
    }

    / 当通过 res.danoolive.com:80 端口访问这个服务器时
    / 该请求会被转发到 127.0.0.1:9991
    server {
        listen 80; 
        server_name res.danoolive.com; 
        location / { 
            proxy_pass /127.0.0.1:9991;
        }
    }

}