成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript選擇題解答(21-37)

李增田 / 1467人閱讀

摘要:上半部選擇題解答個(gè)人博客文章地址第二十一題又是一道考查數(shù)字的題,與第七題考察點(diǎn)相似。

上半部:JavaScript選擇題解答(1-20)

個(gè)人博客文章地址

第二十一題

What is the result of this expression? (or multiple ones)

var a = 111111111111111110000,
    b = 1111;
a + b;

A: 111111111111111111111

B: 111111111111111110000

C: NaN

D: Infinity

又是一道考查JavaScript數(shù)字的題,與第七題考察點(diǎn)相似。由于JavaScript實(shí)際上只有一種數(shù)字形式IEEE 754標(biāo)準(zhǔn)的64位雙精度浮點(diǎn)數(shù),其所能表示的整數(shù)范圍為-2^53~2^53(包括邊界值)。這里的111111111111111110000已經(jīng)超過(guò)了2^53次方,所以會(huì)發(fā)生精度丟失的情況。綜上選B

第二十二題

What is the result of this expression? (or multiple ones)

var x = [].reverse;
x();

A: []

B: undefined

C: error

D: window

這題考查的是函數(shù)調(diào)用時(shí)的this和Array.prototype.reverse方法。

首先看Array.prototype.reverse方法,首先舉幾個(gè)栗子:

console.log(Array.prototype.reverse.call("skyinlayer"));
//skyinlayer
console.log(Array.prototype.reverse.call({}));
//Object {}
console.log(Array.prototype.reverse.call(123));
//123

這幾個(gè)栗子可以得出一個(gè)結(jié)論,Array.prototype.reverse方法的返回值,就是this

Javascript中this有如下幾種情況:

全局下this,指向window對(duì)象

console.log(this);
//輸出結(jié)果:
//Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…}

函數(shù)調(diào)用,this指向全局window對(duì)象:

function somefun(){
    console.log(this);
}
somefun();
//輸出結(jié)果:
//Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…}

方法調(diào)用,this指向擁有該方法的對(duì)象:

var someobj = {};
someobj.fun = function(){
    console.log(this);
};
console.log(someobj.fun());
//輸出結(jié)果:
//Object {fun: function}

調(diào)用構(gòu)造函數(shù),構(gòu)造函數(shù)內(nèi)部的this指向新創(chuàng)建對(duì)象:

function Con() {
    console.log(this);
}
Con.prototype.somefun = function(){};
console.log(new Con());
//輸出結(jié)果:
//Con {somefun: function}

顯示確定this:

function somefun(){
    console.log(this);
};
somefun.apply("skyinlayer");
somefun.call("skyinlayer");
//輸出結(jié)果:
//String {0: "s", 1: "k", 2: "y", 3: "i", 4: "n", 5: "l", 6: "a", 7: "y", 8: "e", 9: "r", length: 10}
//String {0: "s", 1: "k", 2: "y", 3: "i", 4: "n", 5: "l", 6: "a", 7: "y", 8: "e", 9: "r", length: 10} 

這里可以看到,使用的是函數(shù)調(diào)用方式,this指向的是全局對(duì)象window,所以選D

第二十三題

What is the result of this expression? (or multiple ones)

Number.MIN_VALUE > 0

A: false

B: true

C: error

D: other

考查的Number.MIN_VALUE的概念,MDN傳送門,關(guān)鍵的幾句話
* The Number.MIN_VALUE property represents the smallest positive numeric value representable in JavaScript.
翻譯:Number.MIN_VALUE表示的是JavaScript中最小的正數(shù)

The MIN_VALUE property is the number closest to 0, not the most negative number, that JavaScript can represent.
翻譯:MIN_VALUE是接近0的數(shù),而不是最小的數(shù)

MIN_VALUE has a value of approximately 5e-324. Values smaller than MIN_VALUE ("underflow values") are converted to 0.
翻譯:MIN_VALUE值約等于5e-324,比起更小的值(大于0),將被轉(zhuǎn)換為0

所以,這里是true,選B

順帶把Number的幾個(gè)常量拉出來(lái):
* Number.MAX_VALUE:最大的正數(shù)
* Number.MIN_VALUE:最小的正數(shù)
* Number.NaN:特殊值,用來(lái)表示這不是一個(gè)數(shù)
* Number.NEGATIVE_INFINITY:負(fù)無(wú)窮大
* Number.POSITIVE_INFINITY:正無(wú)窮大

如果要表示最小的負(fù)數(shù)和最大的負(fù)數(shù),可以使用-Number.MAX_VALUE和-Number.MIN_VALUE

第二十四題

What is the result of this expression? (or multiple ones)

[1 < 2 < 3, 3 < 2 < 1]

A: [true, true]

B: [true, false]

C: error

D: other

運(yùn)算符的運(yùn)算順序和隱式類型轉(zhuǎn)換的題,從MDN上運(yùn)算符優(yōu)先級(jí),"<"運(yùn)算符順序是從左到右,所以變成了[true < 3, false < 1]

接著進(jìn)行隱式類型轉(zhuǎn)換,"<"操作符的轉(zhuǎn)換規(guī)則(來(lái)自$雨$的文章《Javascript類型轉(zhuǎn)換的規(guī)則》):

如果兩個(gè)操作值都是數(shù)值,則進(jìn)行數(shù)值比較

如果兩個(gè)操作值都是字符串,則比較字符串對(duì)應(yīng)的字符編碼值

如果只有一個(gè)操作值是數(shù)值,則將另一個(gè)操作值轉(zhuǎn)換為數(shù)值,進(jìn)行數(shù)值比較

如果一個(gè)操作數(shù)是對(duì)象,則調(diào)用valueOf()方法(如果對(duì)象沒(méi)有valueOf()方法則調(diào)用toString()方法),得到的結(jié)果按照前面的規(guī)則執(zhí)行比較

如果一個(gè)操作值是布爾值,則將其轉(zhuǎn)換為數(shù)值,再進(jìn)行比較

所以,這里首先通過(guò)Number()轉(zhuǎn)換為數(shù)字然后進(jìn)行比較,true會(huì)轉(zhuǎn)換成1,而false轉(zhuǎn)換成0,就變成了[1 < 3, 0 < 1]

所以結(jié)果為A

第二十五題

What is the result of this expression? (or multiple ones)

// the most classic wtf
2 == [[[2]]]

A: true

B: false

C: undefined

D: other

又是隱式類型轉(zhuǎn)換的題(汗)

題目作者的解釋是:
both objects get converted to strings and in both cases the resulting string is "2"

也就是說(shuō)左右兩邊都被轉(zhuǎn)換成了字符串,而字符串都是"2"

這里首先需要對(duì)==右邊的數(shù)組進(jìn)行類型轉(zhuǎn)換,根據(jù)以下規(guī)則(來(lái)自justjavac的文章《「譯」JavaScript 的怪癖 1:隱式類型轉(zhuǎn)換》):
1. 調(diào)用 valueOf()。如果結(jié)果是原始值(不是一個(gè)對(duì)象),則將其轉(zhuǎn)換為一個(gè)數(shù)字。
2. 否則,調(diào)用 toString() 方法。如果結(jié)果是原始值,則將其轉(zhuǎn)換為一個(gè)數(shù)字。
3. 否則,拋出一個(gè)類型錯(cuò)誤。

所以右側(cè)被使用toString()方法轉(zhuǎn)換為"2",然后又通過(guò)Number("2")轉(zhuǎn)換為數(shù)字2進(jìn)行比較,結(jié)果就是true了,選A

第二十六題

What is the result of this expression? (or multiple ones)

3.toString()
3..toString()
3...toString()

A: "3", error, error

B: "3", "3.0", error

C: error, "3", error

D: other

說(shuō)實(shí)話這題有點(diǎn)常見了,很多人都踩過(guò)3.toString()的坑(包括我)...雖然JavaScript會(huì)在調(diào)用方法時(shí)對(duì)原始值進(jìn)行包裝,但是這個(gè)點(diǎn)是小數(shù)點(diǎn)呢、還是方法調(diào)用的點(diǎn)呢,于是乎第一個(gè)就是error了,因?yàn)镴avaScript解釋器會(huì)將其認(rèn)為是小數(shù)點(diǎn)。

而第二個(gè)則很好說(shuō)通了,第一個(gè)點(diǎn)解釋為小數(shù)點(diǎn),變成了(3.0).toString(),結(jié)果就是"3"了

第三個(gè)也是,第一個(gè)點(diǎn)為小數(shù)點(diǎn),第二個(gè)是方法調(diào)用的點(diǎn),但是后面接的不是一個(gè)合法的方法名,于是乎就error了

綜上,選C

第二十七題

What is the result of this expression? (or multiple ones)

(function(){
  var x = y = 1;
})();
console.log(y);
console.log(x);

A: 1, 1

B: error, error

C: 1, error

D: other

變量提升和隱式定義全局變量的題,也是一個(gè)JavaScript經(jīng)典的坑...

還是那句話,在作用域內(nèi),變量定義和函數(shù)定義會(huì)先行提升,所以里面就變成了:

(function(){
    var x;
    y = 1;
    x = 1;
})();

這點(diǎn)會(huì)問(wèn)了,為什么不是var x, y;,這就是坑的地方...這里只會(huì)定義第一個(gè)變量x,而y則會(huì)通過(guò)不使用var的方式直接使用,于是乎就隱式定義了一個(gè)全局變量y

所以,y是全局作用域下,而x則是在函數(shù)內(nèi)部,結(jié)果就為1, error,選C

第二十八題

What is the result of this expression? (or multiple ones)

var a = /123/,
    b = /123/;
a == b
a === b

A: true, true

B: true, false

C: false, false

D: other

首先需要明確JavaScript的正則表達(dá)式是什么。JavaScript中的正則表達(dá)式依舊是對(duì)象,使用typeof運(yùn)算符就能得出結(jié)果:

console.log(typeof /123/);
//輸出結(jié)果:
//"object"

==運(yùn)算符左右兩邊都是對(duì)象時(shí),會(huì)比較他們是否指向同一個(gè)對(duì)象,可以理解為C語(yǔ)言中兩個(gè)指針的值是否一樣(指向同一片內(nèi)存),所以兩個(gè)結(jié)果自然都是false

第二十九題

What is the result of this expression? (or multiple ones)

var a = [1, 2, 3],
    b = [1, 2, 3],
    c = [1, 2, 4]
a == b
a === b
a > c
a < c

A: false, false, false, true

B: false, false, false, false

C: true, true, false, true

D: other

和上題類似,JavaScript中Array的本質(zhì)也是對(duì)象,所以前兩個(gè)的結(jié)果都是false,

而JavaScript中Array的">"運(yùn)算符和"<"運(yùn)算符的比較方式類似于字符串比較字典序,會(huì)從第一個(gè)元素開始進(jìn)行比較,如果一樣比較第二個(gè),還一樣就比較第三個(gè),如此類推,所以第三個(gè)結(jié)果為false,第四個(gè)為true。

綜上所述,結(jié)果為false, false, false, true,選A

第三十題

What is the result of this expression? (or multiple ones)

var a = {}, b = Object.prototype;
[a.prototype === b, Object.getPrototypeOf(a) === b]

A: [false, true]

B: [true, true]

C: [false, false]

D: other

原型鏈的題(總會(huì)有的),考查的__proto__和prototype的區(qū)別。首先要明確對(duì)象和構(gòu)造函數(shù)的關(guān)系,對(duì)象在創(chuàng)建的時(shí)候,其__proto__會(huì)指向其構(gòu)造函數(shù)的prototype屬性

Object實(shí)際上是一個(gè)構(gòu)造函數(shù)(typeof Object的結(jié)果為"function"),使用字面量創(chuàng)建對(duì)象和new Object創(chuàng)建對(duì)象是一樣的,所以a.__proto__也就是Object.prototype,而Object.getPrototypeOf(a)與a.__proto__是一樣的,所以第二個(gè)結(jié)果為true

而實(shí)例對(duì)象是沒(méi)有prototype屬性的,只有函數(shù)才有,所以a.prototype其實(shí)是undefined,第一個(gè)結(jié)果為false

綜上,選A

第三十一題

What is the result of this expression? (or multiple ones)

function f() {}
var a = f.prototype, b = Object.getPrototypeOf(f);
a === b

A: true

B: false

C: null

D: other

還是__proto__和prototype的區(qū)別,兩者不是一個(gè)東西,所以選B

第三十二題

What is the result of this expression? (or multiple ones)

function foo() { }
var oldName = foo.name;
foo.name = "bar";
[oldName, foo.name]

A: error

B: ["", ""]

C: ["foo", "foo"]

D: ["foo", "bar"]

考察了函數(shù)的name屬性,使用函數(shù)定義方式時(shí),會(huì)給function對(duì)象本身添加一個(gè)name屬性,保存了函數(shù)的名稱,很好理解oldName為"foo"。name屬性時(shí)只讀的,不允許修改,所以foo.name = "bar";之后,foo.name還是"foo",所以結(jié)果為["foo", "foo"],選C

PS:name屬性不是一個(gè)標(biāo)準(zhǔn)屬性,不要去使用,除非你想要坑別人

第三十三題

What is the result of this expression? (or multiple ones)

"1 2 3".replace(/d/g, parseInt)

A: "1 2 3"

B: "0 1 2"

C: "NaN 2 3"

D: "1 NaN 3"

String.prototype.replace、正則表達(dá)式的全局匹配和parseInt(又是parseInt...),可以根據(jù)題意看出來(lái)題目上漏了一個(gè)""

首先需要確定replace會(huì)傳給parseInt哪些參數(shù)。舉個(gè)栗子:

"1 2 3".replace(/d/g, function(){
    console.log(arguments);
});
//輸出結(jié)果:
//["1", 0, "1 2 3"]
//["2", 2, "1 2 3"]
//["3", 4, "1 2 3"] 

一共三個(gè):
1. match:正則表達(dá)式被匹配到的子字符串
2. offset:被匹配到的子字符串在原字符串中的位置
3. string:原字符串

這樣就很好理解了,又回到之前parseInt的問(wèn)題了,結(jié)果就是parseInt("1", 10), parseInt("2", 2), parseInt("3", 4)所以結(jié)果為"1, NaN, 3",選D

第三十四題

What is the result of this expression? (or multiple ones)

function f() {}
var parent = Object.getPrototypeOf(f);
f.name // ?
parent.name // ?
typeof eval(f.name) // ?
typeof eval(parent.name) //  ?

A: "f", "Empty", "function", "function"

B: "f", undefined, "function", error

C: "f", "Empty", "function", error

D: other

又是Function.name屬性的題,和三十二題一樣樣,f.name值為"f",而eval("f")則會(huì)輸出f函數(shù),所以結(jié)果為"function"

接著看parent,parent實(shí)際上就是f.__proto__,需要明確的是JavaScript中的函數(shù)也是對(duì)象,其也有自己的構(gòu)造函數(shù)Function,所以f.__proto__ === Function.prototype結(jié)果是true,而Function.prototype就是一個(gè)名為Empty的function

console.log(Function.prototype);
console.log(Function.prototype.name);
//輸出結(jié)果:
//function Empty() {}
//Empty

所以parent.name的值為Empty

如果想直接在全局作用域下調(diào)用Empty,顯示未定義...因?yàn)镋mpty并不在全局作用域下

綜上所述,結(jié)果為C

第三十五題

What is the result of this expression? (or multiple ones)

var lowerCaseOnly =  /^[a-z]+$/;
[lowerCaseOnly.test(null), lowerCaseOnly.test()]

A: [true, false]

B: error

C: [true, true]

D: [false, true]

正則表達(dá)式的test方法會(huì)自動(dòng)將參數(shù)轉(zhuǎn)換為字符串,原式就變成了[lowerCaseOnly.test("null"), lowerCaseOnly.test("undefined")],結(jié)果都是真,所以選C

第三十六題

What is the result of this expression? (or multiple ones)

[,,,].join(", ")

A: ", , , "

B: "undefined, undefined, undefined, undefined"

C: ", , "

D: ""

JavaScript中使用字面量創(chuàng)建數(shù)組時(shí),如果最末尾有一個(gè)逗號(hào)",",會(huì)背省略,所以實(shí)際上這個(gè)數(shù)組只有三個(gè)元素(都是undefined):

console.log([,,,].length);
//輸出結(jié)果:
//3

而三個(gè)元素,使用join方法,只需要添加兩次,所以結(jié)果為", , ",選C

第三十七題

What is the result of this expression? (or multiple ones)

var a = {class: "Animal", name: "Fido"};
a.class

A: "Animal"

B: Object

C: an error

D: other

經(jīng)典坑中的一個(gè),class是關(guān)鍵字。根據(jù)瀏覽器的不同,結(jié)果不同:

chrome的結(jié)果: "Animal"

Firefox的結(jié)果:"Animal"

Opera的結(jié)果:"Animal"

IE 8以上也是: "Animal"

IE 8 及以下: 報(bào)錯(cuò)

總結(jié)

終于把37題全部弄完了,雖然很多題都偏而怪,但其中涉及的知識(shí)還是相當(dāng)重要的。JavaScript中的糟粕和精華永遠(yuǎn)是一個(gè)話題,也是筆試面試時(shí)經(jīng)常遇到的問(wèn)題。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/87480.html

相關(guān)文章

  • JavaScript擇題解答(1-20)

    摘要:最近做了個(gè)上的的測(cè)試題目地址,錯(cuò)了一大堆,感覺(jué)的概念還有很多不是很清晰,這里記錄一下個(gè)人博客文章地址第一題解答這里考的是的用法。如果出現(xiàn)的數(shù)字不符合后面輸入的進(jìn)制,則為,所以第二個(gè)值為。 最近做了個(gè)heroku上的JavaScript的測(cè)試(題目地址),錯(cuò)了一大堆,感覺(jué)js的概念還有很多不是很清晰,這里記錄一下 個(gè)人博客文章地址 第一題 What is the result of...

    Worktile 評(píng)論0 收藏0
  • LeetCode 之 JavaScript 解答第229題 —— 求眾數(shù) II(Majority E

    摘要:繼續(xù)使用摩投票算法,假設(shè)要投票,選取票數(shù)超過(guò)以上選為候選人,一個(gè)被分為三等份,也就是說(shuō)最多有兩位當(dāng)選人。排序解決先進(jìn)行一次排序快排,然后遍歷數(shù)據(jù),找出滿足條件的數(shù)據(jù)。 Time:2019/4/5Title: Majority Element 2Difficulty: mediumAuthor: 小鹿 問(wèn)題:Majority Element 2 Given an integer ar...

    BearyChat 評(píng)論0 收藏0
  • LeetCode 之 JavaScript 解答第十五題 —— 三數(shù)之和(3Sum)

    摘要:如果三個(gè)數(shù)據(jù)相加等于了,就存儲(chǔ)該三個(gè)值且更新和指針。邊界條件判斷數(shù)組內(nèi)元素是否都為整數(shù)或負(fù)數(shù),直接返回。判斷和指針的大小關(guān)系。在原來(lái)數(shù)組上進(jìn)行排序,不生成副本。 Time:2019/4/3Title:3SumDifficulty: mediumAuthor:小鹿 題目三:ADD Two Numbers Given an array?nums?of?n?integers, are the...

    Wildcard 評(píng)論0 收藏0
  • Swoole Timer 的應(yīng)用

    摘要:你好,的協(xié)程高性能網(wǎng)絡(luò)通信引擎,使用語(yǔ)言編寫,提供了多種通信協(xié)議的網(wǎng)絡(luò)服務(wù)器和客戶端模塊??蓱?yīng)用于互聯(lián)網(wǎng)移動(dòng)通信企業(yè)軟件網(wǎng)絡(luò)游戲物聯(lián)網(wǎng)車聯(lián)網(wǎng)智能家庭等領(lǐng)域。這篇文章主要分享毫秒精度的定時(shí)器。最小時(shí)間粒度為毫秒。 你好,Swoole PHP 的協(xié)程高性能網(wǎng)絡(luò)通信引擎,使用 C/C++ 語(yǔ)言編寫,提供了多種通信協(xié)議的網(wǎng)絡(luò)服務(wù)器和客戶端模塊。 Swoole 可應(yīng)用于互聯(lián)網(wǎng)、移動(dòng)通信、企業(yè)軟件...

    fyber 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<