由PHP返回的JSON被Javascript解释为数组而不是对象。
由PHP返回的JSON被Javascript解释为数组而不是对象。
PHP:
echo json_encode(array("apple", "banana"), JSON_FORCE_OBJECT);
AJAX (使用jQuery的客户端JavaScript):
$.ajax({ ... ... success: function (data) { console.log(data); data1 = JSON.parse(data); console.log(data1["0"]); }, });
控制台:
{"0":"apple", "1":"banana"} apple
我的问题:
如果我将console.log(data1["0"])
替换为console.log(data1.0)
,它就不能获取到apple
,我会收到一个错误信息missing ) after argument list
。为什么只有使用数组符号才有效,为什么对象符号也不起作用?
(我怀疑这与在PHP内部将原始数组编码为JSON时的“纯数组”(即非“关联数组”)的特性有关。Javascript将其解释为纯数组而不是对象,这种对象文字有一个名称吗?)
JavaScript中以数字开头的属性不能使用点表示法进行引用,而必须使用方括号表示法进行访问。
JavaScript数组是从零开始索引的:数组的第一个元素的索引为0,最后一个元素的索引为数组长度减1的值。使用无效的索引号将返回undefined。
数组元素在对象中也是属性,但是尝试使用以下方式访问数组的元素会抛出语法错误,因为属性名无效:
console.log(arr.0); // 语法错误
JavaScript数组和引起此问题的属性之间没有特殊关系。JavaScript中以数字开头的属性不能使用点表示法进行引用,而必须使用方括号表示法。例如,如果有一个名为'3d'的属性的对象,只能使用方括号表示法进行引用。例如:
var years = [1950, 1960, 1970, 1980, 1990, 2000, 2010]; console.log(years.0); // 语法错误 console.log(years[0]); // 正常工作 renderer.3d.setTexture(model, 'character.png'); // 语法错误 renderer['3d'].setTexture(model, 'character.png'); // 正常工作
注意,在3d的例子中,'3d'必须用引号括起来。JavaScript数组索引也可以用引号括起来(例如,years['2']而不是years[2]),尽管这不是必需的。JavaScript引擎通过隐式toString转换将years[2]中的2转换为字符串。正因为如此,'2'和'02'将引用years对象上的两个不同的槽位,以下示例可能为真:
console.log(years['2'] != years['02']);
类似地,对象属性如果恰好是保留字,只能在方括号表示法中作为字符串字面量进行访问(但至少在Firefox 40.0a2中可以通过点表示法进行访问):
var promise = { 'var' : 'text', 'array': [1, 2, 3, 4] }; console.log(promise['var']);
从上述内容中可以得出,JavaScript中以数字开头的属性不能使用点表示法进行引用,而必须使用方括号表示法。如果要访问数组或对象的属性,应使用方括号表示法,并将属性名用引号括起来。