/* 當(dāng)系統(tǒng)沒(méi)有Math.sign的時(shí)候贿堰;使用這個(gè)
判斷一個(gè)數(shù)是正數(shù)還是負(fù)數(shù),返回1或者-1 或者0 或者-0 或者 NaN */
if (!Math.sign) {
? ? Math.sign = function (x) {
? ? ? ? /*??
? ? ? ? ? ? 加號(hào)運(yùn)算符(+)將把一個(gè)字符串轉(zhuǎn)換成一個(gè)數(shù)字冀膝。該運(yùn)算符將被放在操作數(shù)之前。
? ? ? ? ? ? const quantity = "12";
? ? ? ? ? ? console.log(+quantity);
? ? ? ? ? ? 我們還可以使用加號(hào)(+)將字符串轉(zhuǎn)換為浮點(diǎn)數(shù)。
? ? ? ? ? ? const quantity = "12.99";
? ? ? ? ? ? console.log(+quantity);
? ? ? ? ? ? 如果字符串值不能被轉(zhuǎn)換為數(shù)字风喇,那么結(jié)果將是 NaN柱衔。
? ? ? ? ? ? const quantity = "awesome";
? ? ? ? ? ? console.log(+quantity);
? ? ? ? ? ? */
? ? ? ? /* 區(qū)分 +0 和 -0 在解決一些特定的數(shù)學(xué)問(wèn)題時(shí)是必要的樊破,
? ? ? ? 但是大部分情況下我們并不用關(guān)心。嚴(yán)格相等認(rèn)為這兩個(gè)值是全等的唆铐。 */
? ? ? ? x = +x; // convert to a number
? ? ? ? /* isNaN() 函數(shù)用于檢查其參數(shù)是否是非數(shù)字值哲戚。
? ? ? ? 假如是0 或者 非數(shù)字 的時(shí)候,返回對(duì)應(yīng)的 0 或者對(duì)應(yīng)的非數(shù)字值艾岂。 */
? ? ? ? if (x === 0 || isNaN(x)) {
? ? ? ? ? ? return x;
? ? ? ? }
? ? ? ? /* 大于0的時(shí)候顺少,返回1 */
? ? ? ? return x > 0 ? 1 : -1;
? ? };
}
/* 此函數(shù)返回?cái)?shù)字以 2 為底的對(duì)數(shù)值 */
if (!Math.log2) {
? ? Math.log2 = function (x) {
? ? ? ? /* Math.log 方法可返回一個(gè)數(shù)的自然對(duì)數(shù)(基于E)。
? ? ? ? Math.LOG2E是JavaScript中的一個(gè)屬性,僅用于查找e的以2為底的對(duì)數(shù)的值脆炎,
? ? ? ? 其中e是大約等于2.718的無(wú)理數(shù)和超越數(shù)梅猿。
? ? ? ? ?*/
? ? ? ? return Math.log(x) * Math.LOG2E;
? ? };
}
/*?
isInteger() 函數(shù)用于檢測(cè)指定參數(shù)是否為整數(shù),如果是整數(shù)返回 true秒裕,否則返回 false袱蚓。
?*/
if (!Number.isInteger) {
? ? Number.isInteger = function (value) {
? ? ? ? /* isFinite() 函數(shù)用于檢查其參數(shù)是否是無(wú)窮大,
? ? ? ? 也可以理解為是否為一個(gè)有限數(shù)值(finite number)几蜻。
?如果參數(shù)是 NaN喇潘,正無(wú)窮大或者負(fù)無(wú)窮大,會(huì)返回 false入蛆,其他返回 true响蓉。
?*/
? ? ? ? return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;
? ? };
}
/*?
CC_JSB 來(lái)判斷是否為 native 環(huán)境(模擬器)-官方引擎回復(fù)
?* Running in native platforms (mobile app, desktop app, or simulator).
?* CC_JSB-判斷,在本機(jī)平臺(tái)(移動(dòng)應(yīng)用程序哨毁、桌面應(yīng)用程序或模擬器)上運(yùn)行
?*/
/* CC_RUNTIME-在runtime環(huán)境下運(yùn)行
Running in runtime environments.
運(yùn)行環(huán)境(英語(yǔ):Runtime environment枫甲,又稱(chēng)“運(yùn)行期系統(tǒng)”,run-time system)
扼褪,指一種把半編譯的運(yùn)行碼在目標(biāo)機(jī)器上運(yùn)行的環(huán)境想幻。
運(yùn)行環(huán)境是一種介乎編譯器及直譯器的運(yùn)行方式。Java運(yùn)行環(huán)境话浇,
稱(chēng)之為“Java Runtime Environment”(JRE)脏毯。
?*/
/*?
不存在console.time的時(shí)候
console.time和console.timeEnd這兩個(gè)方法可以用來(lái)讓W(xué)EB開(kāi)發(fā)人員測(cè)量一個(gè)javascript腳本程序執(zhí)行消耗的時(shí)間。隨著WEB應(yīng)用越來(lái)越重要幔崖,JavaScript的執(zhí)行性能也日益受到重視食店,WEB開(kāi)發(fā)人員知道一些性能測(cè)試機(jī)器是必須的。今天要介紹的console.time和console.timeEnd就是其中之一赏寇。
console.time方法是開(kāi)始計(jì)算時(shí)間吉嫩,console.timeEnd是停止計(jì)時(shí),輸出腳本執(zhí)行的時(shí)間嗅定。
// 啟動(dòng)計(jì)時(shí)器
console.time('testForEach');
// (寫(xiě)一些測(cè)試用代碼)
// 停止計(jì)時(shí)自娩,輸出時(shí)間
console.timeEnd('testForEach');
// 4522.303ms
這兩個(gè)方法中都可以傳人一個(gè)參數(shù),作為計(jì)時(shí)器的名稱(chēng)渠退,它的作用是在代碼并行運(yùn)行時(shí)分清楚各個(gè)計(jì)時(shí)器忙迁。對(duì)console.timeEnd的調(diào)用會(huì)立即輸出執(zhí)行總共消耗的時(shí)間,單位是毫秒碎乃。
測(cè)試JavaScript性能的方法有很多姊扔,但console.time/timeEnd兩個(gè)方法是最基本、最直接的技巧梅誓。
?*/
if (CC_JSB || CC_RUNTIME || !console.time) {
? ? /* Performance API用于精確度量旱眯、控制、增強(qiáng)瀏覽器的性能表現(xiàn)。
? ? 這個(gè)API為測(cè)量網(wǎng)站性能删豺,提供以前沒(méi)有辦法做到的精度。
? ? */
? ? var Timer = window.performance || Date;
? ? /* 創(chuàng)建一個(gè)object */
? ? var _timerTable = Object.create(null);
? ? console.time = function (label) {
? ? ? ? /* 創(chuàng)建一個(gè)存儲(chǔ)當(dāng)前時(shí)間 */
? ? ? ? _timerTable[label] = Timer.now();
? ? };
? ? console.timeEnd = function (label) {
? ? ? ? /* 計(jì)算時(shí)間差 */
? ? ? ? /* 根據(jù)key愧怜,獲取記錄的start時(shí)間 */
? ? ? ? /* 根據(jù)key呀页,獲取當(dāng)前時(shí)間減去記錄的start時(shí)間,獲取時(shí)間差-毫秒 */
? ? ? ? var startTime = _timerTable[label];
? ? ? ? var duration = Timer.now() - startTime;
? ? ? ? console.log(`${label}: ${duration}ms`);
? ? };
}