摘要:你真的知道嗎是一門(mén)奇怪的語(yǔ)言,要真正掌握并不容易。廢話(huà)不多說(shuō),來(lái)一個(gè)快速測(cè)試,道題目,看看你對(duì)是否真正掌握。操作符用來(lái)判斷某個(gè)屬性屬于某個(gè)對(duì)象,可以是對(duì)象的直接屬性,也可以是通過(guò)繼承的屬性。很多人會(huì)認(rèn)為打印的是。
你真的知道JavaScript嗎
題目 No.1????JavaScript是一門(mén)奇怪的語(yǔ)言,要真正掌握并不容易。廢話(huà)不多說(shuō),來(lái)一個(gè)快速測(cè)試,5道題目,看看你對(duì)JavaScript是否真正掌握。準(zhǔn)備好了嗎?開(kāi)始咯?
if (!("a" in window)) { var a = 1; } console.log(a);No.2
var a = 1, b = function a(x) { x && a(--x); }; console.log(a);No.3
function a(x) { return x * 2; } var a; console.log(a);No.4
function b(x, y, a) { arguments[2] = 10; console.log(a); } b(1, 2, 3);No.5
function a() { console.log(this); } a.call(null);解析 No.1
????在瀏覽器環(huán)境中,全局變量都是window的一個(gè)屬性,即
var a = 1 等價(jià)于 window.a = 1。in操作符用來(lái)判斷某個(gè)屬性屬于某個(gè)對(duì)象,可以是對(duì)象的直接屬性,也可以是通過(guò)prototype繼承的屬性。
????再看題目,在瀏覽器中,如果沒(méi)有全局變量 a ,則聲明一個(gè)全局變量 a (ES5沒(méi)有塊級(jí)作用域),并且賦值為1。很多人會(huì)認(rèn)為打印的是1。非也,大家不要忘了變量聲明會(huì)被前置!什么意思呢?題目也就等價(jià)于
var a; if (!("a" in window)) { a = 1; } console.log(a);
所以其實(shí)已經(jīng)聲明了變量a,只不過(guò)if語(yǔ)句之前值是undefined,所以if語(yǔ)句壓根不會(huì)執(zhí)行。
最后答案就是 undefined
這道題有幾個(gè)需要注意的地方:
變量聲明、函數(shù)聲明會(huì)被前置,但是函數(shù)表達(dá)式并不會(huì),準(zhǔn)確說(shuō)類(lèi)似變量聲明前置,舉個(gè)栗子:
console.log("b", b); // b undefined var b = function() {} console.log("b", b); // b function () {}
2.具名的函數(shù)表達(dá)式的名字只能在該函數(shù)內(nèi)部取到,舉個(gè)例子(排除老的IE?):
var foo = function bar () {} console.log("foo", foo); // foo function bar(){} console.log("bar", bar); // Uncaught ReferenceError: bar is not defined
????綜合這兩點(diǎn),再看題目,最后輸出的內(nèi)容就為 1
No.3函數(shù)聲明會(huì)覆蓋變量聲明,但不會(huì)覆蓋變量賦值,舉個(gè)栗子簡(jiǎn)單粗暴:
function foo(){ return 1; } var foo; console.log(typeof foo); // "function"
函數(shù)聲明的優(yōu)先級(jí)高于變量聲明的優(yōu)先級(jí),但如果該變量foo賦值了,那結(jié)果就完全不一樣了:
function foo(){ return 1; } var foo = 1; console.log(typeof foo); // "number"
變量foo賦值以后,變量賦值初始化就覆蓋了函數(shù)聲明。這個(gè)需要注意
再看題目
function a(x) { return x * 2; } var a; console.log(a); // function a(x) {...}No.4
這題考察 arguments 對(duì)象的用法(詳看?JavaScript中的arguments對(duì)象)
一般情況,arguments與函數(shù)參數(shù)是動(dòng)態(tài)綁定關(guān)系(為什么說(shuō)是一般稍后會(huì)解釋),所以很好理解,最后輸出的是10
但是但是但是,我們不要忘了一個(gè)特殊情況--嚴(yán)格模式,在嚴(yán)格模式中 arguments 與相當(dāng)于函數(shù)參數(shù)的一個(gè)拷貝,并沒(méi)有動(dòng)態(tài)綁定關(guān)系,舉個(gè)栗子:
"use strict" // 嚴(yán)格模式!! function b(x, y, a) { arguments[2] = 10; console.log(a); } b(1, 2, 3); // 3No.5
function a() { console.log(this); } a.call(null);
關(guān)于 a.call(null); 根據(jù)ECMAScript262規(guī)范規(guī)定:
如果第一個(gè)參數(shù)傳入的對(duì)象調(diào)用者是null或者undefined的話(huà),call方法將把全局對(duì)象(瀏覽器上是window對(duì)象)作為this的值。所以,不管你什么時(shí)候傳入null或者 undefined,其this都是全局對(duì)象window。所以,在瀏覽器上答案是輸出 window 對(duì)象。
但是但是但是,我們依舊不能忘記一個(gè)特殊情況--嚴(yán)格模式,在嚴(yán)格模式中,null 就是 null,undefined 就是 undefined ,舉個(gè)栗子:
"use strict"; // 嚴(yán)格模式!! function a() { console.log(this); } a.call(null); // null a.call(undefined); // undefined提醒
在瀏覽器中的全局對(duì)象是window,Node.js中是global;
為了使代碼更加嚴(yán)謹(jǐn)與健壯,建議寫(xiě)JS都加上嚴(yán)格模式"use strict";
ES6已經(jīng)成為前端必備技能,呼吁大家都使用ES6,方便高效,可以使用babel把ES6轉(zhuǎn)成ES5甚至ES3,盡量使用ES6推動(dòng)前端的發(fā)展?
AboutGitHub: ?https://github.com/microzz
個(gè)人網(wǎng)站: ?https://microzz.com/
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/82786.html
摘要:前端工程師自檢清單對(duì)于,掌握其語(yǔ)法和特性是最基本的,但是這些只是應(yīng)用能力,最終仍舊考量仍然是計(jì)算機(jī)體系的理論知識(shí),所以數(shù)據(jù)結(jié)構(gòu),算法,軟件工程,設(shè)計(jì)模式等基礎(chǔ)知識(shí)對(duì)前端工程師同樣重要,這些知識(shí)的理解程度,可以決定你在前端工程師這條路上能走多 2019前端工程師自檢清單 對(duì)于JavaScript,掌握其語(yǔ)法和特性是最基本的,但是這些只是應(yīng)用能力,最終仍舊考量仍然是計(jì)算機(jī)體系的理論知識(shí),所...
摘要:摘要想稍微系統(tǒng)的說(shuō)說(shuō)對(duì)于的操作把和常用操作的內(nèi)容歸納成思維導(dǎo)圖方便閱讀同時(shí)加入性能上的一些問(wèn)題前言在前端開(kāi)發(fā)的過(guò)程中極為重要的一個(gè)功能就是對(duì)對(duì)象的操作無(wú)論增刪改查在前端頁(yè)面操作這一范圍內(nèi)都是比較消耗性能的如何高效率的便捷的操作這就是本文要講 摘要 想稍微系統(tǒng)的說(shuō)說(shuō)對(duì)于DOM的操作,把Javascript和jQuery常用操作DOM的內(nèi)容歸納成思維導(dǎo)圖方便閱讀,同時(shí)加入性能上的一些問(wèn)題....
摘要:當(dāng)你使用的活動(dòng)監(jiān)視器你會(huì)發(fā)現(xiàn),實(shí)際的進(jìn)程數(shù)為菜鳥(niǎo)是因?yàn)榫€(xiàn)程池的原因嗎老鳥(niǎo)不錯(cuò)嘛,還知道線(xiàn)程池呢但非也非也。菜鳥(niǎo)竟然不是線(xiàn)程池老鳥(niǎo)你忽視了集成了引擎。啟動(dòng)后會(huì)創(chuàng)建實(shí)例,而實(shí)例是多線(xiàn)程的。 老鳥(niǎo):伸著懶腰,看著窗外明媚的陽(yáng)光,喝一口清茶,心情大美。一天的好心情莫過(guò)于此。老鳥(niǎo):菜鳥(niǎo),你這消失了大半個(gè)月,忙什么呢?菜鳥(niǎo):聽(tīng)說(shuō)node最近很火,這不趁著年輕,多儲(chǔ)存點(diǎn)知識(shí)儲(chǔ)備呢!老鳥(niǎo):那你說(shuō)說(shuō)你對(duì)...
摘要:多個(gè)窗口意味著多個(gè)全局環(huán)境,不同的全局環(huán)境擁有不同的全局對(duì)象,從而擁有不同的內(nèi)置類(lèi)型構(gòu)造函數(shù)。比如,表達(dá)式會(huì)返回,因?yàn)閷傩缘玫降膬H僅是構(gòu)造函數(shù),而且是可以被手動(dòng)更改的,只是返回的構(gòu)造函數(shù)的名字,它并不返回類(lèi)名。 原文:ES6時(shí)代,你真的會(huì)克隆對(duì)象嗎(二) 上一篇,我們從Symbol和是否可枚舉以及屬性描述符的角度分析了ES6下怎么淺拷貝一個(gè)對(duì)象,發(fā)表在掘金和segmentfault上(...
摘要:原文你真的會(huì)克隆對(duì)象嗎開(kāi)始之前在開(kāi)始聊克隆之前,我們還是先來(lái)看看數(shù)據(jù)類(lèi)型。值通過(guò)函數(shù)生成,是獨(dú)一無(wú)二的。同時(shí),中規(guī)定了對(duì)象的屬性名有兩種類(lèi)型,一種是字符串,另一種就是類(lèi)型。返回一個(gè)數(shù)組,包含對(duì)象自身的所有屬性的鍵名。 原文:你真的會(huì)克隆對(duì)象嗎 開(kāi)始之前 在開(kāi)始聊克隆之前,我們還是先來(lái)看看js數(shù)據(jù)類(lèi)型。js的數(shù)據(jù)類(lèi)型分為基本數(shù)據(jù)類(lèi)型和復(fù)雜數(shù)據(jù)類(lèi)型。 基本數(shù)據(jù)類(lèi)型:Number、Bool...
閱讀 1544·2021-11-04 16:10
閱讀 2802·2021-09-30 09:48
閱讀 2847·2019-08-29 11:31
閱讀 1586·2019-08-28 18:22
閱讀 3237·2019-08-26 13:44
閱讀 1327·2019-08-26 13:42
閱讀 2852·2019-08-26 10:20
閱讀 762·2019-08-23 17:00