QUnitソース読解(1):ツール関数

15741 ワード

QUnitはJavaScriptユニットテストフレームワークです.もっと具体的にrefを紹介します.  http://qunitjs.com/
次はQUnitのコードです.
(function() {

    function F() {}

    F.prototype = QUnit;

    QUnit = new F();

    // Make F QUnit's constructor so that we can add to the prototype later

    QUnit.constructor = F;

}());

What does it mean? Idon't know.コードcopyをブラウザに直接テストし、定義します.
QUnit = {

            add:function(a, b){return a+b;},

            id: 1

        };

デバッグ後の検出:
QUnit源码阅读(1):工具函数
 
    id    
function
id( name ) { return !!( typeof document !== "undefined" && document && document.getElementById ) && document.getElementById( name ); }

!!感嘆符の役割は何ですか??C/C++の連続2回とは明らかに違います!の
彼は三元演算子に相当し、boolean値を返します.
var ret = !!document.getElementById

Equals to the following:
var ret = document.getElementById ? true : false;

Other practical techniques:
var num = 100;

num = num +""; //var1+""    string

document.write(typeof num+" : "+num+"<br/>");

            

num = ~~num; //~~var1    int

document.write(typeof num+" : "+num+"<br/>");

            

num = [num]//[var1]    array

document.write(typeof num+" : "+"num instanceof Array"+(num instanceof Array)+" "+num+"<br/>");
//   elem     type   ,      fn

//  Firefox,chrome IE  

function addEvent( elem, type, fn ) {

    if ( elem.addEventListener ) {

        elem.addEventListener( type, fn, false );

    } else if ( elem.attachEvent ) {

        elem.attachEvent( "on" + type, fn );

    } else {

        fn();

    }

}
//   b            a 

function extend( a, b ) {

    for ( var prop in b ) {

        if ( b[ prop ] === undefined ) {

            delete a[ prop ];



        // Avoid "Member not found" error in IE8 caused by setting window.constructor

        } else if ( prop !== "constructor" || a !== window ) {

            a[ prop ] = b[ prop ];

        }

    }



    return a;

}
//             
//
so far supports only Firefox, Chrome and Opera (buggy), Safari (for real exceptions) // Later Safari and IE10 are supposed to support error.stack as well // See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack function extractStacktrace( e, offset ) { offset = offset === undefined ? 3 : offset; var stack, include, i, regex; if ( e.stacktrace ) { // Opera return e.stacktrace.split( "
" )[ offset + 3 ]; } else if ( e.stack ) { // Firefox, Chrome stack = e.stack.split( "
" ); if (/^error$/i.test( stack[0] ) ) { stack.shift(); } if ( fileName ) { include = []; for ( i = offset; i < stack.length; i++ ) { if ( stack[ i ].indexOf( fileName ) != -1 ) { break; } include.push( stack[ i ] ); } if ( include.length ) { return include.join( "
" ); } } return stack[ offset ]; } else if ( e.sourceURL ) { // Safari, PhantomJS // hopefully one day Safari provides actual stacktraces // exclude useless self-reference for generated Error objects if ( /qunit.js$/.test( e.sourceURL ) ) { return; } // for actual exceptions, this is useful return e.sourceURL + ":" + e.line; } } function sourceFromStacktrace( offset ) { try { throw new Error(); } catch ( e ) { return extractStacktrace( e, offset ); } }
         
// Safe object type checking is: function( type, obj ) { return QUnit.objectType( obj ) == type; }, objectType: function( obj ) { if ( typeof obj === "undefined" ) { return "undefined"; // consider: typeof null === object } if ( obj === null ) { return "null"; } var type = toString.call( obj ).match(/^\[object\s(.*)\]$/)[1] || ""; switch ( type ) { case "Number": if ( isNaN(obj) ) { return "nan"; } return "number"; case "String": case "Boolean": case "Array": case "Date": case "RegExp": case "Function": return type.toLowerCase(); } if ( typeof obj === "object" ) { return "object"; } return undefined; },
           
// Trigger an event on an element. // @example triggerEvent( document.body, "click" ); triggerEvent: function( elem, type, event ) { if ( document.createEvent ) { event = document.createEvent( "MouseEvents" ); event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView, 0, 0, 0, 0, 0, false, false, false, false, 0, null); elem.dispatchEvent( event ); } else if ( elem.fireEvent ) { elem.fireEvent( "on" + type ); } },
              
function
inArray( elem, array ) { if ( array.indexOf ) { return array.indexOf( elem ); } for ( var i = 0, length = array.length; i < length; i++ ) { if ( array[ i ] === elem ) { return i; } } return -1; }
            
function
getText( elems ) { var i, elem, ret = ""; for ( i = 0; elems[i]; i++ ) { elem = elems[i]; // Get the text from text nodes and CDATA nodes if ( elem.nodeType === 3 || elem.nodeType === 4 ) { ret += elem.nodeValue; // Traverse everything else, except comment nodes } else if ( elem.nodeType !== 8 ) { ret += getText( elem.childNodes ); } } return ret; }