JS基礎知識(一)

1.數據類型:

原始數據類型:undefined、null、Boolean、Number、String、Symbol(ES6)、BigInt(ES10)
引用數據類型:Object
Symbol:獨一無二的值,最大的用法是用來定義對象的唯一屬性名。
BigInt:任意精度的整數,可以安全地存儲和操作數值大的整數。

2.數據存儲:

原始數據類型:存儲在棧(stack)中,占據空間小、大小固定、屬于被頻繁使用數據。
引用數據類型:同時存儲在棧(stack)和堆(heap)中,在棧中存儲了指針,該指針指向堆中該實體的起始地址。占據空間大,大小不固定,當解釋器尋找引用值時,會首先檢索其棧中的地址,然后在堆中獲得對應的值。

3.堆和棧:

在數據結構中,棧的存取方式為先進后出,而堆是一個優先隊列,按優先級排序。
在操作系統中,內存被分為棧區和堆區。棧區內存由編譯器自動分配釋放,堆區內存一般由程序員分配釋放,如果程序員不分配釋放,程序結束時可能會被垃圾回收機制回收。

4.數據類型轉換

轉換為布爾值:Boolean()
number:除了±0和NaN,其他都為true
string:除了空字符串都為true
undefined和null:false
引用類型:true

轉換為字符串:.toString()、String()(null和undefined沒有toString()方法)
number:0 => '0'
Boolean:String(false) => 'false'
function:var a = function(){} => 'function(){}'
Symbol:let a = Symbol() => 'Symbol()'
數組:[1,2] => 1,2
對象:[object,object]

轉換為數字:Number()、parseInt()、parseFloat()
string:'1' => 1, a => NaN
數組:[] => 0,如果數組中有元素為數字則轉為數字,其他情況為NaN
null:0
除了數組的引用類型:NaN
Symbol:報錯

5.數據類型判斷:

typeOf
對于原始數據類型來說,除了null都可以顯示正確的類型。
對于對象來說,除了函數都會顯示object,所以typeof不能準確的判斷變量類型。

typeof 1 // number
typeof true // boolean
typeof 'str' // string
typeof [] // object
typeof function(){} // function
typeof {} // object
typeof undefined // undefined
typeof null // object

instanceof
可以準確的判斷數據類型,因為內部機制是通過判斷對象的原型鏈中是不是能找到prototype。但是不能精準判斷原始數據類型。
instanceof:instanceof運算符用來測試一個對象在其原型鏈中是否存在一個構造函數的prototype屬性。其意思是判斷對象是否是某一數據類型(如Array)的實例,請重點關注是判斷一個對象是否是數據類型的實例。而1,true,'str'這些字面量不是實例,所以為false。

1 instanceof Number // false
true instanceof Boolean // false
'str' instanceof String // false
[] instanceof Array // true
function(){} instanceof Function // true
{} instanceof object // true
// undefined instanceof Undefined
// null instanceof Null

constructor

(1).constructor === Number // true
(true).constructor === Boolean // true
('str').constructor === String // true
([]).constructor === Array // true
(function(){}).constructor === Function // true
({}).constructor === Object // true

需要注意的是,存在一種情況,如果創建一個對象,然后更改它的原型,這時constructor會變得不可靠。

function fn(){}
fn.prototype = new Array()
var f = new fn()
console.log(f.constructor === fn) // false
console.log(f.constructor === Array) // true

Object.prototype.toString.call()
使用Object對象的原型方法toString,返回一個 "[object XXX]" 的字符串

var a = Object.prototype.toString
a.call(1) // [object Number]
a.call(true) // [object Boolean]
a.call('str') // [object String]
a.call([]) // [object Array]
a.call(function(){}) // [object Function]
a.call({}) // [object Object]
a.call(undefined) // [object Undefined]
a.call(null) // [object Null]

所有typeof返回值為object的對象都包含一個內部屬性[[class]],這個屬性無法直接訪問,一般通過Object.prototype.toString來訪問。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • js中基礎知識大綱,了解記憶,總會有用到的地方 了解重要的歷史節點 + 重點掌握WEB1.0~WEB3.0的進化史...
    小晨的世界閱讀 235評論 0 1
  • JavaScript的數據類型主要分為兩大類: 1. 基本數據類型: 有如下6種:boolean、number、s...
    sunflower31閱讀 214評論 0 1
  • 第四章 變量、作用域和內存問題 基本類型和引用類型的值 ECMAScript 變量可能包含兩種不同數據類型的值:基...
    北風吹_yfy閱讀 337評論 0 1
  • 1. 和 會告訴 JavaScript 在何處開始和結束。 2. 引用外部js 還有vue中有impor...
    MiniC閱讀 337評論 0 0
  • 總結步驟 題目 知識點 解答 變量類型和計算 ECMAScript 有5種基本數據類型和1種復雜數據類型,和ES2...
    泡杯感冒靈閱讀 353評論 0 0