当一个面试官问你: JSON都支持什么对象/类型?你怎么回答?也许他的本意是下面这个答案:
JSON格式支持的数据类型有以下:
类型描述Number 在JavaScript中的双精度浮点格式
String 双引号的反斜杠转义的Unicode
Boolean true 或 false
Array 值的有序序列
Value 它可以是一个字符串,一个数字,真的还是假(true/false),空(null )等
Object 无序集合键值对
Whitespace 可以使用任何一对中的令牌
null empty
但我还真不这么认为,我认为支持任意对象类型,只要是接收容器里面存在的就可以。
可以使用下面的示例来证明:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<script src="https://www.linuxidc.com/Linux/resources/js/jquery-1.8.3.min.js"></script>
</head>
<body></body>
</html>
<script>
function ClassA(sColor) {
this.color = sColor;
this.sayColor = function() {
alert(this.color);
};
}
function strToJson(str) {
var json = eval('(' + str + ')');
return json;
}
jQuery.ajax({
type : "get",
cache : false,
dataType : "text",
url : "simple.json",
success : function(data) {
alert(data);
var _json = strToJson(data);
_json.testcolor.sayColor(); // 这里是我们想看的效果
},
error : function() {
alert('对不起,服务请求异常!');
}
});
</script>
simple.json文件内容:
{
"retCode": "0000",
"retMsg": "Success",
"testcolor": new ClassA("red"),
"retList": {
"le1": {
"price": "4800000",
"commId": "56761"
},
"le2": {
"price": "4800000",
"commId": "56761"
}
}
}
注意上面代码里面的 dataType : "text"
因为Jquery源码里面是用下面的方式转换的,我们需要更加原始的方式,所以我替换成了自定义的strToJson(str)
Jquery源码:
// Evaluates a script in a global context
// Workarounds based on findings by Jim Driscoll
//
globalEval: function( data ) {
if ( data && core_rnotwhite.test( data ) ) {
// We use execScript on Internet Explorer
// We use an anonymous function so that context is window
// rather than jQuery in Firefox
( window.execScript || function( data ) {
window[ "eval" ].call( window, data );
} )( data );
}
},
其实JSON就是字符串,需要前端进行eval转换,所以不能简单的说json支持什么对象,或者支持什么数据类型。
注意提问方式,需要更加严谨提出我们想要提问的问题。