0
var place = "mundo"["Hola", "Ciao"];

为什么返回未定义?就因为是垃圾?

4

2 回答 2

5

这是完全有效的 JS,尽管它没有达到您的预期。

place被初始化为 的'Ciao'属性String('mundo')。由于它不存在,它被初始化为undefined.

棘手的部分:

"Hola","Ciao"正在使用逗号运算符,评估"Hola",评估"Ciao"和返回"Ciao"

[...]在这种情况下是属性访问

"mundo"[] "mundo"转换为 String 对象以访问其上的属性。

证明:

var place = "mundo"["Hola", "toString"];
console.log(place) // function toString() { [native code] }
于 2013-11-12T08:18:31.277 回答
3

字符串对象上的数组运算符将尝试对字符串进行索引并从该字符串返回特定字符(在某些 JS 实现中),或者它将尝试在该对象上查找属性。如果索引是一个数字,一些 JS 实现(我认为这是非标准行为)会给你字符串中的那个字符。

// returns "m" in Chrome
"mundo"[0]

// returns undefined
"mundo"[9]

但是,不是数字的数组索引将尝试在字符串对象上查找该属性,并且您的特定值不会在字符串对象上找到,因此您会得到undefined.

// does a property lookup and returns "function toString{[native code]}
"mundo"["toString"] 

// returns undefined - no propery named foo
"mundo"["foo"]

因此,由于字符串上没有与 中的任何内容相似的属性,因此["Hola", "Ciao"]您会得到undefined. 从技术上讲,当你给它这个时,浏览器实际上是在寻找这个"Ciao"属性,因为那个属性不存在,你得到undefined.


在一个奇怪的测试中,你可以运行这段代码来看看发生了什么:

var str = new String("mundo");
str["Ciao"] = "Hello";
alert(str["Hola", "Ciao"]);    // alerts "Hello"

这个工作演示:http: //jsfiddle.net/jfriend00/e6R8a/


这一切都让我想知道你到底想做什么来产生这个奇怪的结构。

于 2013-11-12T08:15:01.457 回答