JavaScript中判斷原生函數的兩個樣本,javascript樣本

來源:互聯網
上載者:User

JavaScript中判斷原生函數的兩個樣本,javascript樣本
原文連結: Detect if a Function is Native Code with JavaScript
原文日期: 2014-08-17
翻譯日期: 2014-08-20
翻譯人員: 鐵錨

我總是經常碰到需要檢查某個function是否是原生代碼的情況  —— 這是功能測試中一個很重要的內容: 函數是瀏覽器內建支援的,還是通過第三方類庫類比的。要檢測這一點,最簡單的辦法當然是判斷函數的 toString 方法返回的值啦。

JavaScript代碼

判斷函數是否是原生方法其實相當簡單:

// 判斷是否原生函數function isNative(fn) {    // 樣本:    // alert.toString()    // "function alert() { [native code] }"    // '' + fn 利用了js的隱式類型轉換.    return (/\{\s*\[native code\]\s*\}/).test('' + fn);}

將函數轉換為字串表示的形式,並且執行正則匹配,這就是實現的原理。

升級版,Update!

Lodash 的作者 John-David Dalton 分享了 一個更好的處理方法:
;(function() {  // 取得Object的toString方法,用於處理傳入參數value的內部(internal) `[[Class]]`  var toString = Object.prototype.toString;    // 取得原始的Function的toString方法,用於處理functions的反編譯代碼  var fnToString = Function.prototype.toString;    // 用於檢測 宿主物件建構器(host constructors),   // (Safari > 4; 真的輸出特定的數組,really typed array specific)  var reHostCtor = /^\[object .+?Constructor\]$/;  // 使用RegExp將常用的native方法編譯為正則模板.  // 使用 `Object#toString` 是因為一般他不會被汙染  var reNative = RegExp('^' +    // 將 `Object#toString` 強轉為字串    String(toString)    // 對所有Regex相關的特殊字元進行轉義    .replace(/[.*+?^${}()|[\]\/\\]/g, '\\$&')    // 為了保持模板的通用性,將 `toString` 替換為 `.*?`    // 將`for ...`之類的字元替換,相容Rhino等環境,因為他們會有額外的資訊,如方法的參數數量.    .replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?')    // 結束符    + '$'    );    function isNative(value) {    // 判斷 typeof    var type = typeof value;    return type == 'function'      // 使用 `Function#toString`原生方法來調用,      // 而不是 value 自己的 `toString` 方法,      // 以免被偽造所欺騙.      ? reNative.test(fnToString.call(value))      // 如果type 不是'function',       // 則需要檢查宿主對象(host object)的情形,       // 因為某些(瀏覽器)環境會將 typed arrays 之類的東西當作DOM方法      // 此時可能不匹配標準的Native正則模式      : (value && type == 'object' && reHostCtor.test(toString.call(value))) || false;  };    // 可以將 isNative 賦值給你想要的變數/對象  window.isNative = isNative;}());

測試代碼:
isNative(isNative)                  //falseisNative(alert)                        //truewindow.isNative(window.isNative) //falsewindow.isNative(window.alert)       //truewindow.isNative(String.toString)    //true



html中調用兩個javascript檔案裡的函數但是函數名相同怎辦

解譯器是按照函數定義的先後,後定義的覆蓋先定義的。如果函數來自不同的檔案,按檔案被include的順序來。
舉例說有1.js和2.js,裡面分別有fun()的函數定義。
如果html檔案先include 1.js再include 2.js,那麼後續對fun()的調用就來自2.js;而如果在include 2.js之前的調用則來自1.js
 
javascript的判斷函數

isNaN()和你說的很類似了
描述
返回一個 Boolean 值,指明提供的值是否是保留值 NaN (不是數字)。
文法
isNaN(numvalue)
numvalue 參數是要檢查是否為 NaN 的值。

說明
如果值是 NaN, 那麼 isNaN 函數返回 true ,否則返回 false 。 使用這個函數的典型情況是檢查 parseInt 和 parseFloat 方法的傳回值。
還有一種辦法,變數可以與它自身進行比較。 如果比較的結果不等,那麼它就是 NaN 。 這是因為 NaN 是唯一與自身不等的值。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.