摘要:舉個例子在上面的例子可以看到,我們聲明是一個數字,但是我們在之后將的值又改成了字符串和布爾值后面會講這些類型。基本類型字符串表示一個字符串,如。因此,我們可以寫一個函數,用來精確檢測類型。
定義 1. 什么是數據類型?
數據類型,就是將數據按照某一規則進行區別時所定義的分類標簽。比如說,同樣都是漢字組成的詞語,要分動詞、名詞、介詞等。
2. 為什么會有數據類型?它出現的意義何在?對數據分類,主要有兩個原因:
第一,是為了限制不同種類數據的操作。比如說當你聲明一個變量是一個數字,那么,就只能對這個變量進行數字能進行的操作,這在編譯代碼及排查錯誤時尤為重要。
第二,由于所有的數據都要存儲在計算機中,不同的數據的存儲位置及所需要的內存大小也不一樣,而有了數據類型,編程的時候需要用大數據的時候才需要申請大內存,就可以充分利用內存。
例如大胖子必須睡雙人床,就給他雙人床,瘦的人單人床就夠了。
JavaScript 中的數據類型 1. 為什么稱 JavaScript 為弱類型語言?JavaScript 中變量是沒有類型的,只有值才有。變量可以隨時持有任何類型的值。
舉個例子:
// js let a = 4; a = "4"; a = false;
在上面的例子可以看到,我們聲明 a 是一個數字,但是我們在之后將 a 的值又改成了字符串和布爾值(后面會講這些類型)。我們可以看到,變量 a 的類型是隨意轉變的,這在強類型語言里是不允許的。
因此,判斷一門語言是強類型還是弱類型,就看這門語言中一個變量是否可以賦不同數據類型的值。
2. JavaScript 有哪些數據類型?在 JavaScript 中,共有七種數據類型,其中,六種是基本/原始類型,一種是對象/復合/引用類型。
基本類型:
字符串(String):表示一個字符串,如“find”。
數字(Number):表示一個數字,如 45 。
布爾(Boolean):布爾值,包括 false 和 true 。
未定義(undefined):只有一個值,undefined , 表示未給變量賦值。
空值(null):只有一個值, null , 表示空值得關鍵字。
Symbol(es6新增):表示一個唯一且不可改變的值。
引用類型:
對象(object): 各種值組成的集合。
其中,對象類型還有一些子類型,如數組,函數,JavaScript 的內建函數等。
3. 基本數據類型和復合數據類型有什么區別?主要有兩點:
基本類型的數據是不可再拆分的。 這也就是為什么稱他為基本類型,就像組成單詞的 26 個英文字母、組成數字的 0 -9;而復合類型的數據,是由基本類型組成。比如一個單詞,可以由數個字母組成,一個句子,可以由數字、字母及標點復合組成。
它們在計算機中的存儲方式不同。計算機存儲數據時為了內存及運行速度考慮,往往會對存儲做優化,有的會將值本身存儲在棧內存中,也有可能會在棧內存中存儲一個值的引用,而把值本身存在堆內存中。對于不同的語言,實現起來或許會有不一致,但思想都是如此。
4. js 中值類型和引用類型的存儲方式是怎樣的?對于 js 來講,是沒有棧內存的概念的,但是 js 在編譯執行代碼時,會首先進入一個執行上下文,在執行上下文的創建階段,會開辟一片區域,用來存儲變量和它們的值,這個區域就叫做變量對象。
大概長這個樣子:
如上圖所示,對于基本類型的變量,他們的變量名和值都會存儲在這個變量對象中,而對于 d ,這個引用類型的值,則只是將這個變量的名字和地址存在變量對象中,變量的值是存儲在堆內存空間的。
結合我們上一節所講的 函數調用棧和執行上下文,體會一下下面的代碼在進入運行前和運行時,執行上下文內部的變化。
const a = 124; const b = "deg"; function bar() { const c = false; function foo() { console.log(c) } foo(); }
下面給出我的解答。
聲明一個變量,使用 使用 typeof 方法會返回一個唯一的數據類型字符串。但這個方法并不怎么靠譜。
值 | 類型 | typeof 值 |
---|---|---|
23 | number | "number" |
"abc" | string | "string" |
false | boolean | "boolean" |
undefined | undefined | "undefined" |
Symbol() | symbol | "symbol" |
{} | object | "object" |
null | null | "object" |
function(){} | object | "funciton" |
從上表中我們看到,有兩處地方和我們預期不一致。
typeof null 返回的是 "object" 而不是 "null"。這是 js 語言設計時的一個 bug, 并且在未來也不會更改。
想要爭取判斷 null 可以加一個條件:
function typeOf(a) { if(!a && typeof a === "object") return "null"; return typeof a; } typeOf({}); // "object" typeOf(null); // "null"
typeof function(){} === "function", 這是因為function 作為 js 的一等公民,是可以調用的對象,設計者認為有必要將它和普通對象區別開來。
- Object.prototype.toString.call() 方法除了 typeof 方法外,調用 Object.prototype.toString.call() 方法 也可以返回一個包含數據類型的字符串,并且更為準確。
值 | 類型 | Object.prototype.toString.call(值) |
---|---|---|
23 | number | "[object Number]" |
"abc" | string | "[object String]" |
false | boolean | "[object Boolean]" |
undefined | undefined | "[object Undefined]" |
Symbol() | symbol | "[object Symbol]" |
{} | object | "[object Object]" |
null | null | "[object Null]" |
function(){} | object | "[object Function]" |
[] | object | "[object Array]" |
從上面們可以看出,這方法對于類型的檢測更加精確。
因此,我們可以寫一個函數,用來精確檢測類型。
function getClass (a) { const str = Object.prototype.toString.call(a) return /^[object (.*)]$/.exec(str)[1] } getClass(null) // "Null"; ...
原文地址:阿木木的博客
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/99822.html
摘要:它們的區別之一就是在計算機中的存儲方式不同基本類型數據是將變量名及值存儲在變量對象中,而引用類型的數據是將變量名和地址存儲在變量對象中,真正的值是存儲在堆內存中。 showImg(https://segmentfault.com/img/remote/1460000017151449); 說點別的 這是《關于 JavaScript 你必須要知道的 33 個概念 》系列的第三篇文章,今天...
摘要:相對于顯式使用,隱式轉換則更加簡潔。隱式轉換為布爾值將其他類型值隱式轉換為布爾值是我們最常用的一種轉換。在以下場景中,都是進行判斷,而只要傳入的值不是布爾值,都會通過隱式類型轉換轉為布爾值。原文地址阿木木的博客與隱式鴨子類型轉換 showImg(https://segmentfault.com/img/remote/1460000017309581); 前言 說實話,JavaScrip...
摘要:最先執行完畢的一定是最里面的函數,執行過后彈出調用棧,接著執行上一層函數,直至所有函數執行完,調用棧清空。到這里你應該就會明白,上面函數調用棧,就是生成了一個函數的執行上下文。 showImg(http://upload-images.jianshu.io/upload_images/7803415-36e8e7d048f63524.jpg?imageMogr2/auto-orient...
摘要:原文地址深入研究運行原理之寫在前面本系列是綜合了自己在學習過程中的理解記錄對參考文章中的一些理解個人實踐過程中的一些心得而來。值得深究的是,這個由兩個完成,這兩個一共有個。 原文地址:『 Spark 』6. 深入研究 spark 運行原理之 job, stage, task 寫在前面 本系列是綜合了自己在學習spark過程中的理解記錄 + 對參考文章中的一些理解 + 個人實踐spark...
閱讀 1399·2021-11-08 13:14
閱讀 754·2021-09-23 11:31
閱讀 1046·2021-07-29 13:48
閱讀 2786·2019-08-29 12:29
閱讀 3380·2019-08-29 11:24
閱讀 1904·2019-08-26 12:02
閱讀 3695·2019-08-26 10:34
閱讀 3440·2019-08-23 17:07