由PHP返回的JSON被Javascript解释为数组而不是对象。

13 浏览
0 Comments

由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将其解释为纯数组而不是对象,这种对象文字有一个名称吗?)

0
0 Comments

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中以数字开头的属性不能使用点表示法进行引用,而必须使用方括号表示法。如果要访问数组或对象的属性,应使用方括号表示法,并将属性名用引号括起来。

0