js等語言的undefined值存在的意義是什麼?

js早期應該是刻意模仿java的語法的,出於什麼理由添加了undefined這個java中沒有以及其他語言也少見的值?

雖然我知道理論上說undefined和null有區別,undefined特指變數未被初始化.

但是似乎在實際操作中,我可以說沒有遇到過需要特地區分到底是變數為null還是未初始化的情況?

目前的回答沒有能解決我的問題:

1.什麼情景需要區分null和undefined值,我找不到.

2.我也可以定義var a=1;a=undefined;你沒法保證undefined就是真的未定義過.或者說我定義var a=undefined;我定義了一個變數,但他仍然是未定義值.

我認為兩者完全可以是一個值.

我目前傾向於贊同@ 廖雪峰 的觀點認為就是錯誤設計的延續.


雖然 JavaScript 模仿了 Java,但是 Java 是強類型,而 JavaScript 是弱類型。Java 中的變數必須先定義再使用,而 JavaScript 的變數可以直接拿來就使用。

Java 中未賦值的變數的值是該類型的默認值,而 JavaScript 沒有類型定義的概念,如果使用一個未定義的變數,能想到的默認值只有 null 了,但是在JavaScript 中 null 是一個 Object。

在 JavaScript 中不僅未賦值的變數是 undefined,而且沒有返回值的函數也是 undefined。所以 Dom 相關函數都是返回 null,從 API 設計的角度講這是很合理的。

評論中有人提到 typeof null 返回 object 是設計的缺陷。確實是,最初的 javascript 實現中,使用標記位來區分對象類型和原始類型:對象值使用0來標識,原始值使用1。因此導致了全 0 的 null 被識別為了 object。

--更新2018.01.04--

舉個 React 的例子:如果組件屬性傳入的值是 null,那麼最終頁面上的輸出是空;如果傳入的屬性值是 undefined,那麼 React 認為這個值是 undefined 貨真價實的未定義,則會使用默認值,最終頁面上的輸出是 defaultProp。


其他語言也有,只不過解釋型運行時才出現,編譯型編譯器就給你攔截了


至少Perl有undef。

對於弱類型語言undef必不可少啊,不然叫一個僅定義未賦值的變數怎麼辦?

強類型語言就沒有這個問題,只要設置當前類型的默認值即可。


unfefined 強調的是類型為空,相當於其它語言的void/unit。null強調的是值為空。

至於是不是設計錯誤,個人認為,作為強類型 ,必須保留兩種不同的語意,但是作為弱類型,null的處境很尷尬。但是,只有兩周設計時間,不容許想太多場景的情況下,保留是最好的選擇。從語言發展角度,這是正確的。哪天js可強制類型了,搞泛型了,這種區別就更明顯了。

但是,null有類型,而不是單純字面量,這是設計錯誤。


因為JavaScript是弱類型語言,對一個變數聲明了而不賦值是不會報錯的,因此需要有一個基本數據類型來對這種只聲明而為賦值的變數賦一個值,所有就有了undefined吧

猜測的.


3.12 Void and Undefined

(WTF: 知乎編輯器提示內容不能為空)


就是一個設計錯誤,畢竟js只花了兩周就設計出來了


Erlang第一個表示不服


有人數JavaScript是模仿Java,著純粹的胡編亂造,它只是借用Java這四個字母。


我自己是這樣理解的:

  1. 當我寫出 var a = undefined; 表示我不知道a的類型, 可能是number、string、object。
  2. 當我寫出 var a = null; 表示我知道a是object類型,只是暫時留空,不佔內存。

所以undefined其實和number, string, object是一個設計層面的,null只是object的一個值。


我說一條:json格式的數據,值可以是null,但不能是undefined


我在JAVA編譯器idea里調試的時候輸入一個沒有返回值的表達式時,值也是undefined


我猜測大概就是為了區分null和未定義變數, 所以才有的undefined.

然而問題是 `var a = undefined;` 雖然定義了a, 但是它的值仍然是未定義(undefined)的.

還不如只有一個null, 未定義的值都是null.


在java中,基本數據類型的類成員變數都有默認值(其他自定義類默認值為null);而在程序代碼塊中如果變數沒有初始化,java會編譯報錯,js中的undefined應該就類似於java中的編譯報錯吧


java後台會把undefine當成字元串,但對於前端來說是沒有值的,這就有可能前端本沒有傳值的卻被後台當成了undefine字元串,所以請求參數時我個人覺得用null可以避免以上問題!


創造者也提出了題主的問題,然後最新版給它們合併了(滑稽)


推薦閱讀:

npm install的實現原理?
移動端前端開發與PC端比有哪些不同?
jQuery真的過時了嗎?
amaze ui和bootstrap有哪些差別?
有沒有適合HTML&CSS初學者模仿的靜態網頁?

TAG:前端開發 | JavaScript | 編程 | Java | 前端架構 |