一.摘要
本文是jQuery系列教程的剧场版, 即和jQuery这条主线无关, 主要介绍大家平时会忽略的一些javascript细节. 适合希望巩固javascript理论知识和基础知识的开发人员阅读.
二.前言
最近面试过一些人, 发现即使经验丰富的开发人员, 对于一些基础的理论和细节也常常会模糊. 写本文是因为就我自己而言第一次学习下面的内容时发现自己确实有所收获和感悟. 其实我们容易忽视的javascript的细节还有更多, 本文仅是冰山一角. 希望大家都能通过本文有所斩获.
三.Javascript面向对象
Javascript是一门面向对象的语言, 虽然很多书上都有讲解,但还是有很多初级开发者不了解.
创建对象
ps: 以前写过一篇详细的创建对象的文章(原型方法, 工厂方法等)但是找不到了, 回头如果还能找到我再添加进来.下面仅仅简单介绍.
在C#里我们使用new关键字创建对象, 在javascript中也可以使用new关键字:
<SPAN class=kwrd>var</SPAN> objectA = <SPAN class=kwrd>new</SPAN> Object();
但是实际上"new"可以省略:
<SPAN class=kwrd>var</SPAN> objectA = Object();
但是我建议为了保持语法一直, 总是带着new关键字声明一个对象.
创建属性并赋值
在javascript中属性不需要声明, 在赋值时即自动创建:
objectA.name = <SPAN class=str>"my name"</SPAN>;
访问属性
一般我们使用"."来分层次的访问对象的属性:
alert(objectA.name);
嵌套属性
对象的属性同样可以是任何javascript对象:
<SPAN class=kwrd>var</SPAN> objectB = objectA; objectB.other = objectA; <SPAN class=rem>//此时下面三个值相当, 并且改变其中任何一个值其余两个值都改变</SPAN>
<SPAN class=rem></SPAN>objectA.name; objectB.name; objectB.other.name;
使用索引
如果objectA上有一个属性名称为"school.college", 那么我们没法通过"."访问,因为"objectA.school.college"语句是指寻找objectA的school属性对象的college属性.
这种情况我们需要通过索引设置和访问属性:
objectA[<SPAN class=str>"school.college"</SPAN>] = <SPAN class=str>"BITI"</SPAN>; alert(objectA[<SPAN class=str>"school.college"</SPAN>]);
下面几个语句是等效的:
objectA[<SPAN class=str>"school.college"</SPAN>] = <SPAN class=str>"BITI"</SPAN>; <SPAN class=kwrd>var</SPAN> key = <SPAN class=str>"school.college"</SPAN> alert(objectA[<SPAN class=str>"school.college"</SPAN>]); alert(objectA[<SPAN class=str>"school"</SPAN> + <SPAN class=str>"."</SPAN> + <SPAN class=str>"college"</SPAN>]); alert(objectA[key]);
JSON 格式语法
JSON是指Javascript Object Notation, 即Javascript对象表示法.
我们可以用下面的语句声明一个对象,同时创建属性:
<SPAN class=rem>//JSON</SPAN> <SPAN class=kwrd>var</SPAN> objectA = { name: <SPAN class=str>"myName"</SPAN>, age: 19, school: { college: <SPAN class=str>"大学"</SPAN>, <SPAN class=str>"high school"</SPAN>: <SPAN class=str>"高中"</SPAN> }, like:[<SPAN class=str>"睡觉"</SPAN>,<SPAN class=str>"C#"</SPAN>,<SPAN class=str>"还是睡觉"</SPAN>] }
JSON的语法格式是使用"{"和"}"表示一个对象, 使用"属性名称:值"的格式来创建属性, 多个属性用","隔开.
上例中school属性又是一个对象. like属性是一个数组. 使用JSON格式的字符串创建完对象后, 就可以用"."或者索引的形式访问属性:
objectA.school[<SPAN class=str>"high school"</SPAN>]; objectA.like[1];
静态方法与实例方法
静态方法是指不需要声明类的实例就可以使用的方法.
实例方法是指必须要先使用"new"关键字声明一个类的实例, 然后才可以通过此实例访问的方法.
<SPAN class=kwrd>function</SPAN> staticClass() { }; <SPAN class=rem>//声明一个类</SPAN> staticClass.staticMethod = <SPAN class=kwrd>function</SPAN>() { alert(<SPAN class=str>"static method"</SPAN>) }; <SPAN class=rem>//创建一个静态方法</SPAN> staticClass.prototype.instanceMethod = <SPAN class=kwrd>function</SPAN>() { <SPAN class=str>"instance method"</SPAN> }; <SPAN class=rem>//创建一个实例方法</SPAN>
上面首先声明了一个类staticClass, 接着为其添加了一个静态方法staticMethod 和一个动态方法instanceMethod. 区别就在于添加动态方法要使用prototype原型属性.
对于静态方法可以直接调用:
staticClass.staticMethod();
但是动态方法不能直接调用:
staticClass.instanceMethod(); //语句错误, 无法运行.
需要首先实例化后才能调用:
<SPAN class=kwrd>var</SPAN> instance = <SPAN class=kwrd>new</SPAN> staticClass();<SPAN class=rem>//首先实例化</SPAN> instance.instanceMethod(); //在实例上可以调用实例方法
四.全局对象是window属性
通常我们在<script>标签中声明一个全局变量, 这个变量可以供当前页面的任何方法使用:</script>
<script type="text/javascript"> <SPAN class=kwrd>var</SPAN> objectA = <SPAN class=kwrd>new</SPAN> Object(); script>
然而我们还应该知道, 实际上全局变量objectA是创建在window对象上, 可以通过window对象访问到:
window.objectA
五.函数究竟是什么
我们都知道如何创建一个全局函数以及如何调用:
<SPAN class=kwrd>function</SPAN> myMethod() { alert(<SPAN class=str>"Hello!"</SPAN>); } myMethod();
其实同全局对象一样, 使用function关键字创建的方法(也可以创建类)的名称, 实际上是为window对象创建了myMethod属性, 并且值是一个匿名方法, 上面的语句等同于:
window.myMethod = <SPAN class=kwrd>function</SPAN>() { alert(<SPAN class=str>"Hello!"</SPAN>); }
无论使用哪种方式声明, 实际保存时都是使用函数名创建window对象的属性. 并且值只有函数体没有函数名称.
所以,下面三种声明方式是等效的:
function myMethod() { alert("Hello!"); } window.myMethod = <SPAN class=kwrd>function</SPAN>() { alert(<SPAN class=str>"Hello!"</SPAN>); } myMethod = function() { alert("Hello!"); }
六."this"究竟是什么
在C#中,this变量通常指类的当前实例. 在javascript则不同, javascript中的"this"是函数上下文,不是由声明决定,而是由如何调用决定.因为全局函数其实就是window的属性, 所以在顶层调用全局函数时的this是指window对象.
下面的例子可以很好的说明这一切:
<SPAN class=kwrd>var</SPAN> o1 = { name: <SPAN class=str>"o1 name"</SPAN> }; window.name = <SPAN class=str>"window name"</SPAN>; <SPAN class=kwrd>function</SPAN> showName() { alert(<SPAN class=kwrd>this</SPAN>.name); } o1.show = showName; window.show = showName; showName(); o1.show(); window.show();
结果:
结果证明在顶层调用函数和使用window对象调用函数时, this都指向window对象. 而在对象中调用函数时this指向当前对象.
七.javascript中的闭包
闭包的概念比较难以理解, 先看闭包的定义:
闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
简单表达:
闭包就是function实例以及执行function实例时来自环境的变量.
先看下面的例子:
<SPAN class=kwrd><!</SPAN><SPAN class=html>DOCTYPE</SPAN> <SPAN class=attr>html</SPAN> <SPAN class=attr>PUBLIC</SPAN> <SPAN class=kwrd>"-//W3C//DTD XHTML 1.0 Transitional//EN"</SPAN> <SPAN class=kwrd>"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</SPAN><SPAN class=kwrd>></SPAN> <SPAN class=kwrd><</SPAN><SPAN class=html>html</SPAN> <SPAN class=attr>xmlns</SPAN><SPAN class=kwrd>="http://www.w3.org/1999/xhtml"</SPAN><SPAN class=kwrd>></SPAN> <SPAN class=kwrd><</SPAN><SPAN class=html>head</SPAN><SPAN class=kwrd>></SPAN> <SPAN class=kwrd><</SPAN><SPAN class=html>title</SPAN><SPAN class=kwrd>></</SPAN><SPAN class=html>title</SPAN><SPAN class=kwrd>></SPAN> <SPAN class=kwrd></</SPAN><SPAN class=html>head</SPAN><SPAN class=kwrd>></SPAN> <SPAN class=kwrd><</SPAN><SPAN class=html>body</SPAN><SPAN class=kwrd>></SPAN> <SPAN class=kwrd><</SPAN><SPAN class=html>div</SPAN> <SPAN class=attr>id</SPAN><SPAN class=kwrd>="divResult"</SPAN><SPAN class=kwrd>></</SPAN><SPAN class=html>div</SPAN><SPAN class=kwrd>></SPAN> <SPAN class=kwrd><</SPAN><SPAN class=html>script</SPAN> <SPAN class=attr>type</SPAN><SPAN class=kwrd>="text/javascript"</SPAN><SPAN class=kwrd>></SPAN> <SPAN class=kwrd>function</SPAN> start() { <SPAN class=kwrd>var</SPAN> count = 0; window.setInterval(<SPAN class=kwrd>function</SPAN>() { document.getElementById(<SPAN class=str>"divResult"</SPAN>).innerHTML += count + <SPAN class=str>"<br/>"</SPAN>; count++; }, 3000); }; start(); <SPAN class=kwrd></</SPAN><SPAN class=html>script</SPAN><SPAN class=kwrd>></SPAN> <SPAN class=kwrd></</SPAN><SPAN class=html>body</SPAN><SPAN class=kwrd>></SPAN> <SPAN class=kwrd></</SPAN><SPAN class=html>html</SPAN><SPAN class=kwrd>></SPAN>
count是start函数体内的变量, 通常我们理解count的作用于是在start()函数内, 在调用start()函数结束后应该也会消失.但是此示例的结果是count变量会一直存在,并且每次被加1:
因为count变量是setInterval中创建的匿名函数(就是包含count++的函数)的闭包的一部分!
再通俗的讲, 闭包首先就是函数本身, 比如上面这个匿名函数本身, 同时加上在这个函数运行时需要用到的count变量.
javascript中的闭包是隐式的创建的, 而不像其他支持闭包的语言那样需要显式创建. 我们在C#语言中很少碰到是因为C#中无法在方法中再次声明方法. 而在一个方法中调用另一个方法通常使用参数传递数据.
本文不再详细讲解闭包, 深入学习请参考下面的文章
八.总结

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

Dreamweaver Mac版
視覺化網頁開發工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。