重學前端是程劭非(winter)在極客時間開的一個專欄,在此主要整理個人學習筆記。若有侵權,請聯繫我,謝謝。 前端
undefined表示未定義,只有一個值,就是undefined。任何變量在賦值前都是undefined類型。在js裏是個變量,但不是關鍵字,爲了防止被重寫,在js裏用void 0來獲取undefined值。通常不會把變量賦值爲undefined,這樣能夠保證全部值爲undefined的變量都是未賦值的狀態bash
undefined === void 0;//true
函數
null表示定義了可是爲空,在js裏是關鍵字,也只有一個值,null。ui
有兩個值,true和false,true和false是js關鍵字。this
String用於表示文本數據,它的意義不是「字符串」,而是字符串的UTF16編碼,string的長度是受字符串編碼的長度影響。最長2^53-1。編碼
例外狀況spa
區別+0和-0的方法,檢測1/x是infinity仍是-infinityprototype
非整數的Number類型沒法用==(或===)來計較,這是浮點數的精度問題code
0.1+0.2 == 0.3 //false
使用 JavaScript 提供的最小精度值來比較浮點數
Math.abs(0.1+0.2-0.3)<=Number.EPSILON //true
檢測左右兩邊差的絕對值是否是小於最小精度
ES6引入的新類型,表示獨一無二的值。
用Symbol()函數建立symbol。 symbol函數的參數的做用是描述,爲了輸出的時候區分是哪個值,所以相同參數的symbol函數返回的symbol值是不同的。
var a = Symbol('a')
var b = Symbol('a')
console.log(a == b) //false
複製代碼
爲何給對象添加的方法能夠用在基本類型上?
.
運算符提供了一個裝箱操做,它會根據基本類型構造一個臨時對象,使得它能夠調用對應的對象方法
在js中,對象是「屬性的集合」,屬性分爲數據屬性和訪問器屬性,二者的結構都是key-value,key能夠是字符串或者symbol類型。
js中的幾個基本類型,在對象類型都有一個「親戚」,它們是:
Number、String、Boolean三個構造器是兩用的,當用new搭配時,它們產生對象,當直接用時,表示強制類型轉換。symbol構造器不能用new調用。
var a = Boolean(1)
var b = new Boolean(1)
console.log(typeof a) //boolean, a是true
console.log(typeof b) //object,b是true
複製代碼
平常代碼能夠把用在對象的方法用在基本類型上
console.log('abc'.charAt(0)) // a
//charAt(index),index是字符串的下標,返回在該下標的字符,超出下標值的話返回空字符串
複製代碼
在原型上添加方法,也能夠應用於基本類型上
String.prototype.hello = () => console.log('hello')
var str = String('abc');
console.log(typeof str) // string
str.hello() // hello
複製代碼
js是弱類型語言,全部經常會發生類型轉換。 == 和加減乘除大於小於,都會發生類型轉換
支持十進制、八進制、十六進制的轉換。
還有科學計數法和正負號
parseInt 和 parseFloat 並不使用這個轉換,支持的語法和這裏不盡相同。在不傳入第二個參數的狀況下,parseInt只支持16進制前綴‘0x’,並且會忽略非數字字符,就是不支持科學計數法。parseFloat是直接當十進制來轉換。
多數狀況下,用Number比parseInt和parseFloat好。
數字轉字符串是按十進制,當number太多或過小時,會用科學計數法表示
string、boolean、number、symbol在對象中都有對應的類,裝箱轉換就是把基本類型轉換成對應的對象。
symbol沒法用new調用,可是能夠用call方法來強迫產生裝箱。
定義一個函數,函數只有return this,而後用call方法到一個symbol類型的值上,就會產生一個SymbolObject。
var symbolObject = (function(){ return this; }).call(Symbol("a"));
console.log(typeof symbolObject); //object
console.log(symbolObject instanceof Symbol); //true
console.log(symbolObject.constructor == Symbol); //true
複製代碼
使用內置的Object函數,能夠在js代碼中顯示調用裝箱能力。
var symbolObject = Object(Symbol('a'));
console.log(typeof symbolObject) // object
console.log(symbolObject instanceof Symbol) // true
console.log(symbolObject.constructor === Symbol) // true
複製代碼
就是把對象類型轉換成基本類型。
拆箱轉換會嘗試調用valueOf和toString,若是這兩個方法都不存在,或者沒有返回基本類型,會返回類型錯誤TypeError