一個有意思的問題:
var a = new Object();
var b = new Object();
var c = new Object();
c[a] = a;
c[b] = b;
console.log(c[a] === a); //输出什么? ---> false
console.log(c[b] === b); //输出什么? ---> true
var a = new Object();
var b = new Object();
var c = new Object();
c.a=a;
c.b=b;
console.log(c.a === a); //输出什么? ---> true
console.log(c.b === b); //输出什么? ---> true
這裡其實牽涉到的就是[]
運算子 和.
運算子 相關知識。
附上相關規則和網址,你們自己研究吧:
#######Is evaluated in exactly the same manner as MemberExpression : MemberExpression . IdentifierName except that the contained CallExpression is evaluated in step 1.######### ### ###ECMAScript 2015 #sec-property-accessors#####MemberExpression : MemberExpression [ Expression ]
Let baseReference be the result of evaluating MemberExpression.
Let baseValue be GetValue(baseReference).
ReturnIfAbrupt(baseValue).
#Let propertyNameReference be the result of evaluating Expression.
Let propertyNameValue be GetValue(propertyNameReference).
#ReturnIfAbrupt(propertyNameValue).
Let bv be RequireObjectCoercible(baseValue).
#ReturnIfAbrupt(bv).
#Let propertyKey be ToPropertyKey(propertyNameValue).
#ReturnIfAbrupt(propertyKey).
If the code matched by the syntactic production that is being evaluated is strict mode code, let strict be true, else let strict be false.
Return a value of type Reference whose base value is bv and whose referenced name is propertyKey, and whose strict reference flag is strict.
MemberExpression : MemberExpression . IdentifierName
#Let baseReference be the result of evaluating MemberExpression.
Let baseValue be GetValue(baseReference).
ReturnIfAbrupt(baseValue).
#Let bv be RequireObjectCoercible(baseValue).
#ReturnIfAbrupt(bv).
#Let propertyNameString be StringValue of IdentifierName
#If the code matched by the syntactic production that is being evaluated is strict mode code, let strict be true, else let strict be false.
Return a value of type Reference whose base value is bv and whose referenced name is propertyNameString, and whose strict reference flag is strict.
CallExpression : CallExpression [ Expression ]
Is evaluated in exactly the same manner as MemberExpression : MemberExpression [ Expression ] except that the contained CallExpression is evaluated in step 1.
CallExpression : CallExpression . IdentifierName
其實就是個 Object toString 的問題。