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


全局屬性、全局方法

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

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

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

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

真值:除了以上的值,其他值均為真值;

對象:除了字符串字面量、數字字面量、true、false、null、undefined之外,其他值都是對象!

數字a 轉 字符串:

  • 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()  已被廢棄

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM