我喜歡JavaScript.它是一門集強大與靈活於一身的語言,當然前提是你得知道如何去正確的使用它.一旦你真正掌握了JavaScript,你幾乎可以用它來做任何事情,而且能做的既快又好.
如果你認為JavaScript太簡單或者太低級, 那麼你已經掉入了一個陷阱. 並且你會發現有很多人已經掉入了這樣的陷阱中了.這些所謂的JavaScript開發者也許會告訴你,一些其他的語言“X” 更好.
他們甚至會說,如果有一個將能將X語言轉換為JavaScript的系統,那就太好了.想要逃出這個陷阱一直到真正的掌握JavaScript需要付出很多的努力和貢獻.相信我,因為從1997年開始,我就已經在學習JavaScript了.
我是透過學習官方標準文檔掌握了JavaScript的所有高級知識,所以你也可以通過這種方法來掌握完整的語言知識.如果你的職稱中包含了“JavaScript開發者”,那麼你應該這樣做.
在本篇部落格中,我將會給出一個短小的JavaScript程式碼片段,然後讓你給出這段程式碼的正確輸出.如果你是一個JavaScript開發者,你會發現這樣的題目真是太簡單了.如果你仍然處在學習這門語言的過程中,你可能會遇到一些困難,不過你可以好好讀一下代碼下面的解釋部分.
下面的JavaScript代碼顯示了一個彈出框.彈出框中顯示什麼?
var five = 5;
five.three = 3;
alert(five + five.three);
跳到本篇文章的最後查看正確的答案.接下來是為什麼會有這樣的結果的解釋.
在JavaScript中,一共有六種資料型別: Object, Number, String, Boolean, Null, 以及Undefined.
物件(Objects)型別包含了陣列(arrays), 函數(functions),以及其他的一般物件.數字( Numbers)型別可以是整數(integers)或浮點數(floating point)型別以及特殊值NaN和Infinity. 字串(Strings)型別包含了空字串, ”". 布林值(Booleans)型別只有兩個值:true和false.最後兩個基本資料型別有點特殊:Null型別只有一個值:null, Undefined型別只有一個值:undefined.所有Object除外的型別都稱為「原始值(primitive)」.JavaScript變數的類型不是在定義的時候明確指定的,還是在腳本運行的時候自動推斷出來的.在上面的代碼中,名為five的變量是Number類型的,因為它被賦值了一個Number字面量5.
和其他的電腦程式語言類似,JavaScript也會隱式的將某個值的型別轉換成適合對該值進行操作的運算子的型別.和其他語言不同的是, JavaScript會非常積極地做這些轉換.比如表達式”5″ – “3″的運算結果是數字2,因為減號運算符會把兩邊的操作數全部轉換為數字再進行運算.如果一個操作數不能被轉換為數字,則會使用NaN ( “Not a Number”)來替代.例如表達式”5″ – “Fred”會被隱式的轉換為5 – NaN,則運算結果也會是NaN.
一套完整的隱式轉換規則並不是十分複雜,你只需要知道每個操作符需要什麼類型的操作數.
任意值轉換為原始值遵循這樣的規則“任意值轉換為原始值”. 其中對像到原始值的轉換比較複雜:如果操作數的型別必須是Number型別,這表示JavaScript引擎會呼叫物件的valueOf()方法,如果傳回的結果仍然不是一個原始值,則會呼叫物件的toString()方法轉換成一個String型別的值。如果運算元的型別必須是String型別,則會先呼叫物件的toString()方法,如果傳回的結果不是一個原始值,再呼叫物件的valueOf()方法.不管那種情況,如果最終的轉換結果仍然不是一個原始值,則拋出異常.
如果操作數的類型必須是一個數字,但該操作數的實際類型是:
Object:
該值首先被轉換成原始值,如果轉換的結果不是一個數字,則會進入下面的轉換分支.
String:
字串型別的值會依照通常的JavaScript規則轉換成數字型別
Boolean:
如果值為true,轉換為1,否則轉換為0
Null :
0
Undefined:
NaN
如果操作數的類型必須是一個字串,但該操作數的實際類型是:
Object:
該值首先被轉換成原始值,如果轉換的結果不是原始值,如果轉換的結果不是一個字串,則會進入下面的轉換分支.
Number:
數字直接轉為字串, 例如」123″ or ”12.34″
Boolean:
轉為」true”或”false”
ull
「null」
Undefined:
「undefined」
如果運算元的型別必須是布林值,但此運算元的實際型別是:
Object:
:true
:true則轉為false,否則轉為true (譯者註:NaN也會轉為false)
String:
如果值為一個空字符串”",則轉為false,否則轉為true
Null:
false
Undefined:
false
如果運算元的型別必須是物件值,但該運算元的實際型別是:
Number:
使用包裝物件類型Number來包裝原始值,new Number(value),new Number
String:
使用包裝物件類型String來包裝原始值,new String(value)
Boolean:
使用包裝物件類型Boolean來包裝原始值,new Boolean(value)
Null:
:
拋出異常
現在所有的轉換規則已經很清晰了,讓我們回到最初的例子中.
var five = 5;
five.three = 3;
alert(five + five.three);
正如我們前面提到的,第一行程式碼創建了一個名為five,類型為Number的變數.
當用屬性訪問符作用在變數five上時,它的值會轉換為Object類型.這種操作稱之為“包裝”,並且依賴於Number構造函數,該構造函數會產生一個對象,而不是一個原始值.第二行程式碼實際上等同於下面的程式碼:
(new Number(five)).three=3;
正如你看到的,我們並沒有將新生成的Number物件的引用保存到一個變量中.在該表達式運行過後,被添加three屬性的這個物件會被丟棄.而five變數的值沒有任何變化.
第三行程式碼中的表達式five.three會再一次創建一個Number物件.這個新的物件並沒有three屬性,所以回傳了特殊值undefined.結果等同於:
alert(5+undefined);
加法運算子會把兩邊的運算元全部轉換為數字.在本例中,undefined會被轉換為NaN,也就成了:
alert(5+NaN);
這也就解釋了為什麼最後的彈出框中僅僅顯示了一個NaN.
(譯者註:還差最後一步隱式轉換,在進行alert()的時候,NaN會被自動轉換為”NaN”)
評論:
jerone:
你這篇文章所講的內容只是JavaScript的一部分,確切的說只包含了ECMAScript.除了這些,JavaScript還包含了DOM,也就是說還有Node, Element, HTMLElement等更多的數據類型.
作者回复:
Node, Element 以及HTMLElement 都不是數據類型,就像Array, Date 和RegExp一樣,他們都屬於物件(Object)類型.
Marcus Pope:
我認為應該指出正確的編寫方式,下面的程式碼才能夠正常運作
var five = new Number(5);
alert(five); // 5
five.three = 3;
alert(five + five.three); //8
我還認為最好應該用「number」來指數字原始值,而用「Number」來指數字類型的包裝物件,這樣才能減少讀者的困惑.這也是在JavaScript中使用typeof操作符來查看這些值的內部類屬性時顯示的字符串.(譯者註:這裡指的是typeof 5 === “number” )
ACRESTAN:
是啊,這篇文章很讓人困惑,就是因為作者使用了大寫字母開頭的類型字符串來描述原始值…
比如這句“the first line creates a variable called five whose type is Number ”,這是不對的!因為你的程式碼就證明了這一點.
metadings:
還有第七種資料型態,JavaScript中最重要的型別:函數(Function).在JavaScript中,使用函數可以創建新的物件,所以原始值類型和函數型別還是有差別的.
var Project = function () { };
// Project instanceof Function === true
// Project instanceof Object === true
// (typeof Project === 'function') === true
var o = new Project();
// o instanceof Project === true
// o instanceof Object === true
// (typeof Project === 'object') === true
請仔細閱讀這個連結http://metadea.de/V/,看看我是怎麼寫出真正的JavaScript類函數的.(譯者註:還有一句沒翻譯,看不明白,覺的這個人在扯蛋.)
作者回覆:
很顯然函數在JavaScript中非常重要,值得用單獨的文章來講解它,但函數不是另外一種數據類型.函數只是一種特殊的物件.雖然特殊,但仍是物件.
由許許多多不同的建構函式所建立的物件們都繼承了同一個型別:Object.這很容易偵測到:如果Object(a) === a,則a是一個物件類型,而不是其他原始值類型.
ulu:
這篇文章正好進一步證明了JavaScript不只是一個最強大的語言,同時也是最令人困惑的語言.應該不惜一切代價避免使用它.總有一天,會有一個更人性化的語言集成在所有的主流瀏覽器中,我希望在我有生之年能夠趕上.
作者回复:
當你手中拿著一把錘子時,所有事物看上去都像釘子.當你認為JavaScript很讓人迷惑時,任何特性都能成為你的證據.
Dave Chapman :
這種類型的編碼錯誤正是我們為什麼需要一個更好的能夠在我們碼字的同時,在運行程式碼之前進行語法檢查的IDE的原因.例如.在closure compiler中運行例子中的代碼會產生如下的警告信息:
“JSC_INEXISTENT_PROPERTY: Property three never defined on Number at line 4 character 13:
alert(five + five.three);」
(譯者註:closure compiler是Google的程式碼壓縮器或稱為編譯器.https://developers.google.com/closure/compiler/)
google.com/closure/compiler/)
谷歌
simonleung :
一個數字可以是「object」類型的,也可以是「number」類型的.
當用在條件語句中或其他需要轉換為布林值的地方,這兩種類型的數字會產生不同的結果,例如.
Number(0)會得到true,因為Number(0)是一個物件,而0顯然會得到false.🎜(譯者註:這裡他說錯了.Number作為函數只是一個型別轉換函數,返回的仍然是原始值,只有用new Number(0),Number才算是一個建構子,回傳的才是物件)🎜另外一個,在null上進行typeof操作,返回”object”,但它不是真正的對象,null是假值,會被轉換為false.

從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應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

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

Dreamweaver CS6
視覺化網頁開發工具

WebStorm Mac版
好用的JavaScript開發工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

禪工作室 13.0.1
強大的PHP整合開發環境