原生JS:全局屬性、全局方法詳解

全局屬性、全局方法javascript

原創文章,轉摘請註明出處:蘇福:http://www.cnblogs.com/susufufu/p/5853342.htmlhtml

首先普及幾個我總結的很是實用又很基礎的知識:(呵呵,僅僅是學習權威指南的筆記而已)java

typeof 返回的是字符串,有8種可能:"number"、"string"、"boolean"、"object"、"function"、"undefined"、"symbol"(ES6)、宿主對象類型git

假值:false、 null、 undefined、 0 、-0 、NaN、""github

真值:除了以上的值,其餘值均爲真值;web

對象:除了字符串字面量、數字字面量、true、false、null、undefined以外,其餘值都是對象!正則表達式

數字a 轉 字符串:json

  • a.toString(n) //n表示進制
  • a.toFixed(i)   a.toPrecision(j)  //i爲小數位數,j爲要顯示位數
  • a.toExponential(i) //科學計數形式

字符串s 轉數字:轉換失敗返回NaN,忽略前置的空格,儘量多的轉換數字,忽略後面的非數字內容,其中'0X'、'0x'開頭的則把它當着16進制數來轉換瀏覽器

  • parseInt(s,n) //n表示進制,可選參數,把s當着n進制數來轉爲十進制數
  • parseFloat(s) //轉爲浮點數
正題開始:(如下是本人一邊翻書, 一邊 查MDN, 一邊  baidu,權衡以後獲得的總結)

表示一個簡單的值的全局屬性:安全

Infinity 

一個數值,表示無窮大,有Infinity和-Infinity

  • Infinity 的初始值是 Number.POSITIVE_INFINITY
  • 用0做除數會產生Infinity
  • 比無窮大還大的值仍然是無窮大
  • Infinity(正無窮大)大於任何值。該值和數學意義上的無窮大很像,例如任何正值乘以 Infinity 結果爲 Infinity, 任何數值(除了Infinity 和 -Infinity)除以 Infinity 爲 0。
  • NaN 屬性是一個不可配置(non-configurable)、不可枚舉、不可寫(non-writable)的屬性,因此沒法使用 for/in 循環來枚舉 NaN 屬性,也不能用 delete 運算符來刪除它。

NaN

表示 Not-A-Number 的值。NaN 屬性的初始值就是 NaN,和 Number.NaN 的值同樣。

  • 在現代瀏覽器中(ES5中), NaN 屬性是一個不可配置(non-configurable)、不可枚舉、不可寫(non-writable)的屬性,因此沒法使用 for/in 循環來枚舉 NaN 屬性,也不能用 delete 運算符來刪除它。
  • 但在ES3中,這個屬性的值是能夠被更改的,可是也應該避免覆蓋。
  • 等號運算符(== 和 ===) 不能被用來判斷一個值是不是 NaN。必須使用 Number.isNaN() 或 isNaN() 函數。
  • NaN 與全部值都不相等,包括它本身(在JavaScript中惟一一個不等於本身的值)NaN === NaN;        // false
  • NaN是一個數字,類型爲number :typeof NaN  //number 
  • NaN轉爲數字爲NaN,轉爲布爾值爲false
  • 0 除以0會返回NaN ,可是其餘數除以0則不會返回NaN,而是Infinity。

undefined

在JavaScript中,undefined這個詞有多重含義。undefined是全局對象的一個屬性

  • 一個未初始化的變量的值爲undefined,一個沒有傳入實參的形參變量的值爲undefined,若是一個函數什麼都不返回,則該函數默認返回undefined.
  • 首字母大寫的Undefined表示的是一種數據類型,小寫的undefined表示的是屬於這種數據類型的惟一的一個值.
  • 在JavaScript代碼中,你看到的undefined最有多是全局對象的一個屬性,該屬性的初始值是就是前面所說的原始值undefined,還有種狀況就是,這個undefined是個局部變量,就像其餘普通變量同樣,沒有任何特殊性,它的值不必定是undefined,但一般狀況下都是的.下面咱們所說的undefined,都指的是window.undefined這個屬性.
  • 在ES5中,window.undefined成了一個不可寫,不可配置的數據屬性,它的值永遠是undefined,可是undefined這個詞不是保留字,能夠被從新聲明並賦值,因此直接使用undefined是不保險的,能夠用void 0來得到一個純正的undefined。
  • 必須使用嚴格相等運算符===來判斷一個值是不是undefined,而不能使用普通的相等運算符==,由於在JavaScript中null == undefined是返回true的
  • 若是一個變量根本沒有被聲明,只有使用typeof判斷纔不會報錯typeof x === 'undefined'。用相等運算符判斷會拋出異常。(對已聲明但未初始化的和未聲明的變量執行typeof,都返回"undefined"。)
  • undefined轉爲數字爲NaN,轉爲布爾值爲false
null 

null 是一個javascript字面量,表示空值,它是javascript原始值之一。

  • null 常被放在指望一個對象,可是不引用任何對象的參數位置,null表示一個空對象指針,typeof操做會返回"object"。
  • 在 JavaScript 最初的實現中,JavaScript 中的值是由一個表示類型的標籤和實際數據值表示的。對象的類型標籤是0。因爲 null 表明的是空指針(大多數平臺下值爲0x00),所以,null的類型標籤也成爲了0,typeof null就錯誤的返回了"object".
  • null轉爲數字爲0,轉爲布爾值爲false 

null 與 undefined 的區別:null是字面量,undefined是全局對象的屬性

  • typeof null        // object 
  • typeof undefined   // undefined
  • null === undefined // false
  • null  == undefined // true(null會執行類型轉換) 

null與空對象{}的區別:我的理解爲null未被分配內存,而{}分配了內存,只是值爲空

var a = {};  

var b = null;

a.name = 'realwall';

b.name = 'jim'//這裏會報錯,b爲空指針對象,不能像普通對象同樣直接添加屬性。

 

執行特定功能並返回結果的全局方法:

eval(string )

eval()是一個頂級函數而且跟任何對象無關。

  • eval()的參數是一個字符串。若是字符串表示了一個表達式,eval()會對錶達式求值。若是參數表示了一個或多個JavaScript聲明, 那麼eval()會執行聲明。不要調用eval()來爲算數表達式求值; JavaScript 會自動爲算數表達式求值。
  • 若是要將算數表達式構形成爲一個字符串,你能夠用eval()在隨後對其求值
  • 若是參數不是原始字符串,eval()將會將參數原封不動的返回。
  •  eval()只能直接調用,不能夠間接調用,如使用變量來引用eval(),而後調用它。那麼可能會發生運行時錯誤

  •  eval只是一個普通的函數,只不過他有一個快速通道通向編譯器,能夠將string變成可執行的代碼。當Function , setInterval 和 setTimeout這幾個方法接收一個字符串做爲參數時,內部調用了eval()方法

  •  eval一般用在一些須要動態執行字符串,或將字符串轉爲javascript對象的場景,好比將json字符串轉爲javascript對象。

  •  eval()函數並不會建立一個新的做用域,而且它的做用域就是它所在的做用域。能夠用window.eval()的方式來把它的做用域變爲全局(兼容IE8的對應方法爲window.execScript)

  • 避免在沒必要要的狀況下使用eval:eval() 是一個危險的函數, 它能夠像擁有調用者的權力同樣調用代碼。若是你使用了字符串來運行eval(),那麼你的代碼可能被惡意方(不懷好意的人)影響, 經過在使用方的機器上使用惡意代碼,可能讓你失去在網頁或者擴展程序上的權限。eval() 可讀性差、不方便優化和調試、有性能消耗。在任何實用eval()的地方,基本均可以有通常的替代方案 

isFinite(testValue)

它是全局方法,不與任何對象有關係。你能夠用這個方法來斷定一個數字是不是有限數字。isFinite 方法檢測它參數的數值。他會首先嚐試將參數轉換爲一個數值,若是參數是 NaN、Infinity、-Infinity,則返回false,其餘返回 true

isNaN(testValue)

用來判斷一個值是否爲 NaN。注:isNaN函數包含一些很是有意思的強制轉換規則;你也能夠經過 ECMAScript 6 中定義的 Number.isNaN() 或者 typeof 來判斷一個值是否爲非數值

  • 若是isNaN函數的參數不是Number類型, isNaN()會首先嚐試將這個參數轉換爲數值,而後纔會對轉換後的結果是不是NaN進行判斷(空字符串和布爾值會被強制轉換爲數值0或1,對它們isNaN返回false)而isNaN(undefined)返回true
  • ECMAScript (ES6)包含了Number.isNaN()函數。經過Number.isNaN(x)來檢測變量x是不是一個非數值將會是一種可靠的作法。然而,在缺乏Number.isNaN函數的狀況下, 經過表達式(x != x) 來檢測變量x是不是NaN會更加可靠。
parseFloat(string)

將參數中指定的字符串解析成爲一個浮點數字並返回.parseFloat是個全局函數,不屬於任何對象.

  • 參數字符串前置的空白符會被忽略。
  • 它會正確解析:正負號(+或-),數字(0-9),小數點,或者科學記數法中的指數(e或E),當它遇到其它字符時,會忽略以後的全部字符,並當即返回結果
  • 若是參數字符串的第一個字符不能被解析成爲數字,則parseFloat返回NaN
  • 最好經過調用isNaN函數來判斷parseFloat的返回結果是不是NaN。若是讓NaN做爲了任意數學運算的操做數,則運算結果一定也是NaN.
  • parseFloat 也可轉換和返回Infinity值. 可使用isFinite 函數來判斷結果是不是一個優先的數值 (非Infinity, -Infinity, 或 NaN).
  • 該函數經過正則表達式的方式,在須要更嚴格地轉換float值時可能會有用: (只接受純數字值)

var filterFloat = function (value) {
if(/^(\-|\+)?([0-9]+(\.[0-9]+)?|Infinity)$/.test(value)){
return Number(value);
   }
 return NaN;
}
 
parseInt(string, radix)

將給定的字符串以指定基數(radix/base)解析成爲整數。radix是一個2到36之間的整數值,用於指定轉換中採用的基數。好比參數"10"表示使用咱們一般使用的十進制數值系統。老是指定該參數能夠消除閱讀該代碼時的困惑而且保證轉換結果可預測。當忽略該參數時,不一樣的實現環境可能產生不一樣的結果。

  • parseInt 函數將第一個參數(字符串)解析並試圖返回一個整數或者NaN(Not a Number)。若是第一個字符不能被轉換成數字,parseInt返回NaN。若是結果不是NaN,那麼返回值是把第一個參數看做是radix參數指定的進制下的數,而後把它轉換成十進制的整數
  • 若是 parseInt 遇到了不屬於radix參數所指定的基數中的字符,那麼該字符和其後的字符都將被忽略。接着返回已經解析的整數部分。parseInt 將截取整數部分。開頭和結尾的空白符容許存在,會被忽略。
parseInt("10546", 2); //2
parseInt("546", 2); //NaN
parseInt("FXX123", 16); //15
parseInt("12",13); //15
parseInt(" -17", 8); //-15
parseInt("0x11", 16); //17
parseInt("0x11", 0); //17
parseInt("0x11"); //17

在沒有指定基數,或者基數爲 0 的狀況下,JavaScript 做以下處理:

  • 若是字符串 string 以"0x"或者"0X"開頭, 則基數是16 (16進制).
  • 若是字符串 string 以"0"開頭, 基數是8(八進制)或者10(十進制),那麼具體是哪一個基數由實現環境決定。ECMAScript 5 規範再也不容許parseInt函數的實現環境把以0字符開始的字符串做爲八進制數值,ECMAScript 5 規定使用10,可是並非全部的瀏覽器都遵循這個規定。所以,永遠都要明確給出radix參數的值
  • 若是字符串 string 以其它任何值開頭,則基數是10 (十進制)。

一個更嚴格的方法來解析整型值:(任何不具備實際意義數字值的值均返回NaN)

filterInt = function (value) {
if(/^(\-|\+)?([0-9]+|Infinity)$/.test(value)){
return Number(value);
 }
return NaN;
}
filterInt('421op'); //NaN

 

encodeURI(URI)

對統一資源標識符(URI)進行編碼的方法。它使用1到4個轉義序列來表示每一個字符的UTF-8編碼(只有由兩個代理字符區組成的字符才用四個轉義字符編碼)。參數URI是一個完整的URI.

  • 假定一個URI是完整的URI,那麼無需對那些保留的而且在URI中有特殊意思的字符進行編碼。
  • encodeURI 會替換除如下字符以外的全部字符,即便它們具備適當的UTF-8轉義序列:

類型

包含

保留字符

; , / ? : @ & = + $

非轉義的字符

字母 數字 - _ . ! ~ * ' ( )

數字符號

#

  • 請注意,encodeURI 自身沒法產生能適用於HTTP GET 或 POST 請求的URI,例如對於 XMLHTTPRequests, 由於 "&", "+", 和 "=" 不會被編碼,然而在 GET 和 POST 請求中它們是特殊字符。然而encodeURIComponent這個方法會對這些字符編碼。
  • 另外,若是試圖編碼一個非高-低位完整的代理字符,將會拋出一個 URIError 錯誤,例如:
// 編碼高-低位完整字符
console.log(encodeURI('\uD800\uDFFF'));
// 編碼單獨的高位字符拋出 "Uncaught URIError: URI malformed"
console.log(encodeURI('\uD800'));
// 編碼單獨的低位字符拋出 "Uncaught URIError: URI malformed"
console.log(encodeURI('\uDFFF'));
  • 而且須要注意,若是URL須要遵循較新的RFC3986標準,那麼方括號是被保留的(給IPv6),所以對於那些沒有被編碼的URL部分(例如主機),可使用下面的代碼:
function fixedEncodeURI (str) {
  return encodeURI(str).replace(/%5B/g, '[').replace(/%5D/g, ']');
}
 

是對統一資源標識符(URI)的組成部分進行編碼的方法。它使用一到四個轉義序列來表示字符串中的每一個字符的UTF-8編碼(只有由兩個Unicode代理區字符組成的字符才用四個轉義字符編碼)。參數str是String. URI 的組成部分。

  • 它轉義除了字母、數字、().!~*'-_以外的全部字符。
  • 注意,若是試圖編碼一個非高-低位完整的代理字符,將會拋出一個 URIError 錯誤
  • 爲了不服務器收到不可預知的請求,對任何用戶輸入的做爲URI部分的內容你都須要用encodeURIComponent進行轉義。好比,一個用戶可能會輸入"Thyme &time=again"做爲comment變量的一部分。若是不使用encodeURIComponent對此內容進行轉義,服務器獲得的將是comment=Thyme%20&time=again。請注意,"&"符號和"="符號產生了一個新的鍵值對,因此服務器獲得兩個鍵值對(一個鍵值對是comment=Thyme,另外一個則是time=again),而不是一個鍵值對。
  • 對於 application/x-www-form-urlencoded (POST) 這種數據方式,空格須要被替換成 '+',因此一般使用encodeURIComponent 的時候還會把 "%20" 替換爲 "+"。
  • 爲了更嚴格的遵循 RFC 3986(它保留 !, ', (, ), 和 *),即便這些字符並無正式劃定 URI 的用途,下面這種方式是比較安全的:

function fixedEncodeURIComponent (str) {
    return encodeURIComponent(str).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");
}
 
decodeURI(encodedURI)

用於解碼由 encodeURI 方法或者其它相似方法編碼的統一資源標識符(URI)。將已編碼 URI 中全部能識別的轉義序列轉換成原字符,但不能解碼那些不會被 encodeURI 編碼的內容(例如 "#")

 decodeURI("https://developer.mozilla.org/ru/docs/JavaScript_%D1%88%D0%B5%D0%BB%D0%BB%D1%8B");
// "https://developer.mozilla.org/ru/docs/JavaScript_шеллы"
 

用於解碼由 encodeURIComponent 方法或者其它相似方法編碼的部分統一資源標識符(URI)。參數encodedURI 是編碼後的部分 URI


escape() 已被廢棄
unescape()  已被廢棄
相關文章
相關標籤/搜索