JS常見(jiàn)面試題

題目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();



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容