題目1:
let a = {},
b = '0',
c = 0;
a[b] = '淘寶';
a[c] = '京東';
console.log(a[b])
答案:京東
解析:
1、堆內(nèi)存(16進(jìn)制內(nèi)存地址):存儲(chǔ)引用類(lèi)型值的控件;
2、棧內(nèi)存(16進(jìn)制內(nèi)存地址):存儲(chǔ)基本類(lèi)型值和執(zhí)行代碼的環(huán)境;
3、在堆內(nèi)存中,對(duì)象的屬性名不能重復(fù),且數(shù)字屬性名==字符串屬性名;
補(bǔ)充:對(duì)象和數(shù)組的區(qū)別:數(shù)組表示有序數(shù)據(jù)的集合,而對(duì)象表示無(wú)序數(shù)據(jù)的集合。如果數(shù)據(jù)的順序很重要,就用數(shù)組,否則就用對(duì)象。
數(shù)組和對(duì)象的另一個(gè)區(qū)別是,數(shù)組的數(shù)據(jù)沒(méi)有”名稱(chēng)”(name),對(duì)象的數(shù)據(jù)有”名稱(chēng)”(name)
題目2:
let a = {},
b =Symbol('1'),
c =Symbol('1'),
a[b] = '淘寶';
a[c] = '京東';
console.log(a[b])
答案:淘寶
解析:
1、Symbol創(chuàng)建的是唯一值:Symbol('1') = Symbol('1') ,為false,所以相當(dāng)于Symbol('1') 和 Symbol('1')是兩個(gè)不同的對(duì)象屬性,存的也是兩個(gè)不同的值;
2、對(duì)象的屬性必須是數(shù)字、字符、布爾值、null、undefined的說(shuō)法是錯(cuò)誤的,也可以是Symbol值;
思考:自己實(shí)現(xiàn)Symbol
題目3:
let a = {},
b = { a:12 },
c = { a:15 },
a[b] = '淘寶';
a[c] = '京東';
console.log(a[b])
答案:京東
解析:
1、對(duì)象的屬性可以是數(shù)字、字符、布爾值、null、undefined,也可以是Symbol值;
2、對(duì)象的屬性也可以是一個(gè)對(duì)象,但是對(duì)象的屬性在聲明的時(shí)候會(huì)被.toString()轉(zhuǎn)化為:[Object Object],所以a[b]和a[c]是同一個(gè)屬性名稱(chēng),所以淘寶被替換為京東;
思考:Object.protoType.toString/valueOf和toString
題目4:
var test = (functiong(i) {
return functiong () {
alert(i *=2)
}
})
答案:'4'
解析:
1、立即執(zhí)行的自定義函數(shù)(function(i) {...})(i);
2、函數(shù)代碼每執(zhí)行一次,就會(huì)創(chuàng)建一個(gè)新的執(zhí)行上下文(ECstack:Execution Context Stack)
3、函數(shù)執(zhí)行的內(nèi)存過(guò)程如下:

題目5:
var a = 0,
b = 0,
function A(a) {
A = function ( b ) {
alert (a + b++);
};
alert(a++);
}
A(1)
A(2)
答案:"1"、 "4"
解析:

題目6:
let obj = {
a:100,
b:[10,20,30],
c:{
x:10
}
d:/^\d+$
}
淺克?。?br>
let obj2 = {
for(let key in obj) {
if(!obj.hasOwnproperty(key)) break;
obj2[key] = obj[key];
}
}
let obj2 = {
...obj
}
深克隆:
function deep(obj) {
//過(guò)濾特殊情況
if( obj == null ) return obj;
if( typeof obj != "object") return obj;
if( obj intanceof RegExp ) {
return new RegExp(obj);
}
if( obj intanceof Date) {
return new Date(obj);
}
//不直接創(chuàng)建空對(duì)象的目的:克隆的結(jié)果和之前的結(jié)果保持相同的所屬類(lèi)
let newObj = new obj.constructor;
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = deepClone(obj[key])
}
}
return newObj
}
除了正則和函數(shù),還可采用更為簡(jiǎn)單的方法:
let obj2 = JSON.string(obj);
JSON.parse(obj2);
課后題:面向?qū)ο蠛烷]包的綜合考察
function Foo() {
getName = functiong () {
console.log(1);
};
return this;
}
Foo.getName = function () {
console.log(2);
}
Foo.protoType.getName = Function() {
console.log(3);
};
var getName = function () {
console.log(4);
}
function getName () {
console.log(5);
}
Foo.getName();
getName();
Foo.getName();
getName();
new Foo.getName();
new new Foo.getName();