它們通通變成數(shù)字時鐘吧!
前段時間,一個「Kindle 疑似退出中國市場」的新聞登上熱搜,很多人這才想起被自己冷落許久的 Kindle。雖然經常被吐槽為壓泡面神器,但事實往往更殘酷,大多數(shù)人即使是泡面時也懶得翻出它——假如就在手邊能隨時拿到,那也算不上是壓箱底了。(看到這里,你可以把自己的 Kindle 拿出來充充電了)
在吃灰列表中,Kindle 只是最常被吐槽的那個,像它一樣被打入冷宮的產品還有不少。過時或已經損壞的電子產品已經失去了其使用價值,情懷玩家只是拿來收藏。除了放在抽屜里吃灰,還有什么方法可以讓它們「發(fā)揮余熱」嗎?
先來說說 Kindle。網上很多人曬出的圖都顯示電量不足,也有人提供了一種新用法,把 Kindle 當數(shù)字時鐘。Kindle 官方系統(tǒng)自然是不能隨便安裝應用,需要用「網頁瀏覽器」來實現(xiàn)。
通過代碼能讓 Kindle 進入常亮狀態(tài)(重啟可以恢復),建議將背光亮度調到最低,同時打開飛行模式,這樣能讓續(xù)航時間長一點。
不知道有多少人是為健身環(huán)買了 Switch?能堅持鍛煉(變禿)變強的人只是少數(shù),更多人是一時沖動。如果你本身不是重度玩家,又找不到人一起玩聚會游戲,Switch 的使用場景其實很少,最終難逃吃灰命運。
任天堂官方出了一個《AAA 時鐘》,售價 79 港元。是的你沒有看錯,它的功能就是讓你的 Switch 顯示數(shù)字時鐘,顏值相當贊,可切換 24 小時制、更改顏色樣式。配合顏色豐富的手柄或貼紙保護套,放在桌上當擺件也是不錯的。
這款鬧鐘軟體中還附送了一個游戲,類似 Chrome 的斷網小恐龍,沒什么游戲體驗。
吃灰的還有健身環(huán),健身器材怎么二次利用,不用我多說了吧?
圖片來源于網絡
iPad 的情況比前兩者好一點,雖然不是所有人都把它當「生產力工具」使用,不過至少也能看看愛奇藝。iPad 的使用場景被手機電腦搶走許多,這么大又優(yōu)秀的屏幕,放著實在是浪費,不如——把它變成數(shù)字時鐘吧!
iPad 時鐘應用我推薦「謎底時鐘」,樣式比較豐富,還帶音效,可以利用快捷指令設置為充電時自動運行,或者添加小組件到桌面。
謎底時鐘也有 iPhone 版本,推薦給家里有舊 iPhone 的朋友。
安卓端的時鐘應用就多了,或者還有一種選擇,買一個「堅果鬧鐘式無線充電座」,二手市場價格不到百元,幾款支持無線充電的堅果手機可以直接放上去顯示翻頁鬧鐘,其他品牌需要安裝「堅果時鐘」App。
上面介紹的是過時或者使用場景較少的產品,并不是不能用,有的產品是真的完全失去了使用價值。
最近流行把數(shù)碼零件裝進展示框的玩法,有人把這做成了一門生意,你可以直接購買到裱好的成品來收藏:
(某寶店鋪:尋樂造物)
有人把電路板做成了項鏈:
某寶店鋪:1ceas
時尚圈和數(shù)碼圈的組合也很有意思,AirPods 可以當配飾使用:
圖片來源:《Vogue》
人們購買數(shù)碼產品時,大多把實用性放在第一位,買之前會詳細對比價格和參數(shù),設想好了各種用法。但事與愿違,人每天可支配的時間有限,而數(shù)碼領域最不缺的就是新品迭代。當舊的物件失去其使用價值,除了賣二手之外,不如想想如何才能讓自己不要忘記它。
本文作者:劉丟丟
本文首發(fā)于極客之選,轉載請聯(lián)系極客君(ID:geekparker)。
不久用JS+html<canvas>標簽實現(xiàn)了簡易時鐘(見HTML使用Canvas繪制動畫時鐘),最近學習C/C++語言(話說怎么區(qū)分寫的是c還是c++?),恰好看到一個有趣的繪圖庫EasyX,拿它來練練手,就先做個簡易時鐘看看吧。
EasyX Graphics Library 是針對 Visual C++ 的免費繪圖庫,支持 VC6.0 ~ VC2022。EasyX可以幫助 C/C++ 初學者快速上手圖形和游戲編程。
比如,可以基于 EasyX 圖形庫很快的用幾何圖形畫一個房子,或者一輛移動的小車,可以編寫俄羅斯方塊、貪吃蛇、黑白棋等小游戲,可以練習圖形學的各種算法,等等。
簡單了解了EasyX后,就可以開干了。本文開發(fā)環(huán)境是windows 11和Visual Studio 2022。首先打開vs2022并創(chuàng)建一個空的控制臺項目,在項目里新建main.cpp,#include EasyX的頭文件graphics.h。提示:由于EasyX是針對C++的繪圖庫,必須用cpp文件來開發(fā)編譯,但是編碼可以是c也可以是c++。
EasyX使用非常簡單,可以一邊閱讀EasyX在線文檔(https://docs.easyx.cn/zh-cn/intro)一邊開發(fā)。基本流程:
#include <graphics.h> // 引用圖形庫頭文件
int main()
{
initgraph(600, 400); // 創(chuàng)建繪圖窗口,大小為 600x400 像素
//繪圖操作
closegraph(); // 關閉繪圖窗口
return 0;
}
下面基于以上基礎代碼逐步添加。
由于EasyX默認情況下生成的繪圖界面是黑色的背景,我們可以使用setbkcolor函數(shù)更改界面背景色為白色:
setbkcolor(WHITE);
cleardevice(); //設置背景色后要清除設備才能生效
setlinecolor(BLACK);//設置線條顏色(白底黑線)
在 EasyX 中,坐標分兩種:物理坐標和邏輯坐標。
物理坐標是描述設備的坐標體系。
坐標原點在設備的左上角,X 軸向右為正,Y 軸向下為正,度量單位是像素。
坐標原點、坐標軸方向、縮放比例都不能改變。
邏輯坐標是在程序中用于繪圖的坐標體系。
坐標默認的原點在窗口的左上角,X 軸向右為正,Y 軸向下為正,度量單位是點。
默認情況下,邏輯坐標與物理坐標是一一對應的,一個邏輯點等于一個物理像素。
默認原點(0,0)在繪圖窗口的左上角,示例中為了方便繪制時鐘,將原點修改為窗口的中心點:
//假設窗口大小為600x400,則中心點為(600/2,400/2)
setorigin(300,200);
//坐標原點設置成功后,(300,200)位置即為繪圖坐標的原點(0,0)
為方便代碼編寫,先定義了幾個常量:
#define W 800 //窗口寬度
#define H 620 //窗口高度
#define oY H/2 //調整坐標原點y為窗口高度的一半
#define R 290 //時鐘內圓半徑
#define PI 3.14
#define HD PI/180 //因需多次計算弧度,提前算出部分公共值
#define R_2 R/2
時鐘可以分成鐘面外框、大小刻度和指針。由于指針指向是需要隨時間動態(tài)變化,因此不能固定不變。而鐘面外框是固定不變的,可以只繪制一次。(大小刻度也是固定不變的,但是由于與秒針行走路徑有重疊,也要動態(tài)繪制)
示例中鐘面外框繪制成兩個大圓,都有一定的寬度。
繪制圓形的函數(shù)是void circle( int x, int y, int radius );參數(shù)分別是圓心的x、y坐標以及半徑長度,如果要繪制寬度,可以使用setlinestyle()函數(shù)設置線條的形狀和寬度:
setlinecolor(BLACK);//設置線條顏色
setlinestyle(PS_SOLID, 10);//設置線條樣式和寬度
circle(0, 0, oY - 10); //繪制時鐘外黑框
//畫出時鐘的內框
setlinestyle(PS_SOLID, 4);
circle(0, 0, R);
setlinestyle(PS_SOLID, 1);//繪制完鐘面內外兩個框后恢復線條寬度為1
繪制鐘面內外兩個框
由于大小刻度與指針有部分重疊,因此也要跟隨指針一起反復動態(tài)繪制。因此都將它們放入一個while循環(huán)中。
示例中,大刻度畫小實心圓,小刻度畫短線條。畫刻度和指針都需要定位坐標,需要用上數(shù)學計算,須先引入頭文件math.h。具體的坐標計算方法可以自行度娘或看前一篇js+canvas繪制時鐘,里面有簡單的解釋。
setfillcolor(BLACK);//大刻度實心小圓的填充色(黑色)
double _x, _y;
TCHAR s[3];
settextcolor(BLACK);
LOGFONT f;
gettextstyle(&f);
f.lfHeight=36; //設置字體大小
_tcscpy_s(f.lfFaceName, _T("serif")); //設置字體名稱
f.lfQuality=ANTIALIASED_QUALITY; //設置字體平滑效果
settextstyle(&f);
for (int j=9, i=0; i < 12; j++, i++) {//由于坐標0度指向刻度3,所以有針對性地修正一下
if (i > 2) { j=i - 3; }
int _t=j * 30;//每個大格30度,用于下面的弧度計算
_x=cos(HD * _t) * (R - 5);
_y=sin(HD * _t) * (R - 5);//計算大刻度的圓心坐標
fillcircle(_x, _y, 5);//繪制大刻度
//開始繪制文字,先計算文字顯示位置的矩形坐標
swprintf_s(s, _T("%d"), i==0 ? 12 : i);
RECT tr;//定義文字矩形結構
if (j==10) {//修正部分矩形形狀,j==10指向1時
tr.left=_x - 50;
tr.top=_y;
tr.right=_x;
tr.bottom=_y + 50;
}else if(j==4){//指向7時
tr.left=_x +50;
tr.top=_y;
tr.right=_x;
tr.bottom=_y -50;
}else if (j==1) {//指向4時
tr.left=_x - 50;
tr.top=_y - 50;
tr.right=_x;
tr.bottom=sin(HD * (5+_t)) * (R - 5);
}else if( j==7) {//指向10時
tr.left=_x+10;
tr.top=sin(HD * (5 + _t)) * (R - 5);
tr.right=_x+50;
tr.bottom=_y+50;
}else {
tr.left=cos(HD * (_t - 5 < 0 ? 355 : _t - 5)) * (R);
tr.top=sin(HD * (_t - 5 < 0 ? 355 : _t - 5)) * (R);
tr.right=cos(HD * (_t + 5)) * (R - 70);
tr.bottom=sin(HD * (_t + 5)) * (R - 70);
}
//簡單地繪制12個數(shù)字,如果有更好的定位方式歡迎告知,謝謝。
drawtext(s, &tr, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
//繪制60個小刻度
setlinestyle(PS_SOLID | PS_ENDCAP_SQUARE, 3);
double xx=0;
for (int j=0, i=0; i < 60; i++) {
j=i - 15;
if (j < 0) { j=60 + j; }
if (j % 5==0) { continue; }
xx=HD * j * 6;
line(cos(xx) * (R - 10), sin(xx) * (R - 10), cos(xx) * (R - 5), sin(xx) * (R - 5));
}
//繪制圓心
fillcircle(0, 0, 8);
效果圖:
繪制大小刻度和圓心
指針有三種,時針粗短,分針適中,秒針細長,示例中將秒針繪制成紅色以示區(qū)別。指針的位置是根據(jù)時間動態(tài)更新的,所以先要獲取當前的系統(tǒng)時間,可以簡單地引入time.h頭文件。
//繪制時針,參數(shù)為當前時,分,秒
void drawHp(int h,int m,int s) {
h -=3;
if (h < 0) {
h=12 + h;
}
double hd=HD * h * 30 + PI/360 * m +PI/21600 * s;
int _x=cos(hd) * (R_2+10);
int _y=sin(hd) * (R_2+10);
drawPt(_x, _y, 8);
}
//繪制分針,參數(shù)為當前分,秒
void drawMp(int h,int s) {
h -=15;
if (h < 0) {
h=60+h;
}
double hd=HD * (double)(h + s / static_cast<double>(60)) * 6;
int _x=cos(hd) * (R_2+40);
int _y=sin(hd) * (R_2+40);
drawPt(_x, _y, 5);
}
//繪制秒針,參數(shù)為當前秒
void drawSp(int h) {
h -=15;
if (h < 0) {
h=60 + h;
}
double hd=HD * h * 6;
int _x=cos(hd) * (R_2 + 120);
int _y=sin(hd) * (R_2 + 120);
drawPt(_x, _y, 2);
}
//根據(jù)指針x、y坐標真實繪制指針
void drawPt(int x, int y,int w) {
if (w==2) {
setlinecolor(RED);
}
setlinestyle(PS_SOLID | PS_JOIN_ROUND | PS_ENDCAP_ROUND, w);
line(0, 0, x, y);
setlinecolor(BLACK);
}
調用方式:
time_t now=time(NULL);
struct tm info;
localtime_s(&info,&now);//獲得本地時間
int hour=info.tm_hour;
int minute=info.tm_min;
int second=info.tm_sec;
drawHp(hour,minute,second);
drawMp(minute,second);
drawSp(second);
讓我們看看效果如何。
繪制了指針的時鐘,出現(xiàn)了好多的秒針軌跡
哈哈,鬧笑話了。由于我們在實時地?計算新的指針坐標并更新繪制新的指針位置,因此界面上繪制出了很多的秒針軌跡。怎么解決呢?方法肯定是有的,可以繪制前先清除設備(調用cleardevice()函數(shù),將清除整個繪圖窗口),我們這里不打算清除全部,只把鐘面圓框內的部分清除:
clearcircle(0, 0, oY-25);//先清除內圓框之內的全部
//然后再寫動態(tài)繪圖刻度和指針的代碼
看看效果如何:
到此為止,一個簡單的時鐘已經繪制完成了。但是你可能發(fā)現(xiàn)有點小問題:界面有時會閃爍一下。這是由于動態(tài)更新指針位置并實時繪制出來造成的閃爍,可以使得經典的雙緩沖技術來解決。EasyX很貼心地提供了這個技術,只需要三個函數(shù):
BeginBatchDraw();
while(true){
//反復的繪制操作
FlushBatchDraw();
}
EndBatchDraw();
就是這么簡單。在我們的示例代碼中加上它們就行了。
示例中將動態(tài)時間計算和實時更新繪圖都放在了while循環(huán)中,計算機超強的計算速度下,每秒可將會計算非常多次,示例中時鐘是按秒走的,我們可以采用節(jié)流思想,在一段時間的指定時間間隔內只執(zhí)行一次回調函數(shù),限制在一定時間內的執(zhí)行次數(shù),從而控制高頻率觸發(fā)的事件,避免過多的計算或操作影響性能。最簡單的做法是一次繪圖更新完成后,sleep一定時間。也可以根據(jù)系統(tǒng)時鐘打點數(shù)計算fps:
const clock_t FPS=1000 / 2;//每秒只執(zhí)行兩次
clock_t startTime, freamTime;
while (true) {
//計算幀率
startTime=clock();
freamTime=clock() - startTime;
if (freamTime < FPS)
{
Sleep(FPS - freamTime);
}
//將各種動態(tài)繪圖代碼寫在此處
}
函數(shù)
函數(shù)的概念:將一段常用代碼進行命名,這個名稱就叫“函數(shù)”。
函數(shù)的步驟:(1)先定義函數(shù),函數(shù)定義后不能直接執(zhí)行,必須調用函數(shù),函數(shù)才會執(zhí)行
(2)調用函數(shù):直接寫函數(shù)名稱,后面直接跟一個小括號,小括號中可以有“實參”
函數(shù)語法格式:
function functionName([形參1][,形參2][,形參3])
{
實現(xiàn)一個功能的程序代碼;
[return 參數(shù)]
}
語法說明:
函數(shù)名稱的命名同變量一樣;
形式參數(shù):定義函數(shù)的參數(shù)就叫“形式參數(shù)”,該參數(shù)接受調用函數(shù)時傳遞過來的值;
形式參數(shù)的命名,同變量也一樣;
形式參數(shù)不能是具體的值;比如:function getMax(10,20)是錯誤的
函數(shù)定義了,就必須要調用;
調用函數(shù)用時,直接寫函數(shù)名稱,后跟小括號,括號中是“實參”;
實際參數(shù):調用函數(shù)時,傳遞的參數(shù)叫“實參”,就是“實際的數(shù)據(jù)”;
形式參數(shù)和實際參數(shù)的個數(shù)和順序應保持一致;
Return語句:可以調用函數(shù)者返回一個結果;
Return語句執(zhí)行后,立即結束函數(shù)的運行;
如果return語句后面,還有其它程序代碼,將不再執(zhí)行;
因此,return語句放在函數(shù)的最后面;
JS中是區(qū)分大小寫的,但關鍵字一律小寫;對象的方法:today.toLocaleString()
全局變量和局部變量
全局變量:可以在任何地方(函數(shù)內部和函數(shù)外部)使用的變量,就叫“全局變量”;
一般來說,在函數(shù)外部定義的變量,是“全局變量”;
省略關鍵字var定義的變量,也是“全局變量”,一般情況下不要省略;
局部變量:只能在函數(shù)內部使用的變量,叫“局部變量”。
注意:在JS中,在函數(shù)外部定義的變量,可以在函數(shù)內部使用;但在函數(shù)內部定義的變量,只能在函數(shù)內部使用。
將函數(shù)定義作為數(shù)據(jù),賦給其它變量
將函數(shù)定義,賦給一個基本數(shù)據(jù)類型的變量
function showInfo()
{
return “我是一個函數(shù)”;
document.write(“我是一個函數(shù)”);
}
var a=showInfo; //將函數(shù)定義(地址),賦給一個變量,變量a是復合數(shù)據(jù)類型
document.write(a() );
var b=showInfo(); //將函數(shù)的執(zhí)行結果,賦給一個變量b,變量b是基本數(shù)據(jù)類型
注意的是:函數(shù)名showInfo后不能跟小括號;
如果showInfo后面跟了小括號,就是調用函數(shù),將函數(shù)的執(zhí)行結果,賦給a變量,而不是地址
將函數(shù)定義,賦給一個數(shù)組元素,那么,該數(shù)組元素就是一個函數(shù)了;
Var arr=[10,20,30];
arr[1]=showInfo(); //arr[1]的值是“我是一個函數(shù)”
arr[2]=showInfo; //arr[2]就變成了函數(shù)
document.write( arr[1] );
document.write( arr[2]() ); //既然arr[2]是一個函數(shù),在調用時,一定要寫小括號
3)將函數(shù)定義,賦給一個對象屬性,那么,該對象的屬性就是一個函數(shù)了;
var obj={
name:“張三”,
age:30,
show:showInfo //將函數(shù)定義,賦給了一對象屬性
};
obj.show(); //方法和函數(shù)的定義是一樣的,只是在不同的地方叫法不一樣
document.write( obj.name );
基本數(shù)據(jù)類型和復合數(shù)據(jù)類型
基本數(shù)據(jù)類型:是將變量名稱和變量的值,都存入“快速內存”“棧內存”;
將基本數(shù)據(jù)類型的變量,賦給其它變量,是將原來變量的值“復制”一份,放到了新變量中,因此,這兩個變量沒有任何關系,換句話說:修改其中一個變量的值,另一個變量的值不會改變;
var a=10; //基本數(shù)據(jù)類型,在賦值是地,是傳值
var b=a; //將a的值,復制一份,傳給b
a=100; //給變量a重新賦值
document.write(b); //求變量b的值,是否會改變
引用數(shù)據(jù)類型(復合數(shù)據(jù)類型):它的存儲分兩個部分,一是把數(shù)據(jù)存到“慢內存”“堆內存”,二是將變量名稱和數(shù)據(jù)地址存到“快速內存”“棧內存”。
換句話說:就是新變量和舊變量,同時指向了同一個數(shù)據(jù)地址,只是變量名稱不一樣。
var arr1=[1,10,20,30];
var arr1=new Array(1,10,20,30);
var arr2=arr1; //將arr1賦給了arr2,其實,這里傳的數(shù)據(jù)地址,并不是具體的數(shù)據(jù)
arr1[0]=100; //對arr1中的第1個元素,重新賦值
document.write( arr2[0] );
補充知識點:for in循環(huán)
For ……in主要是循環(huán)或遍歷,數(shù)組元素或對象的屬性。
注意:如果遍歷數(shù)組的話,未定義的數(shù)組元素,不會輸出;只會輸出有效數(shù)據(jù)。
語法結構:
for(index in arr)
{
document.write( arr[index] );
}
參數(shù)說明:
arr代表一個數(shù)組;
index代表一個數(shù)組元素的下標;
舉例:
var arr=[1,2,,,,,3,,,,,,,,,,,,,,,,,4];
遍歷對象屬性
for(name in window)
{
document.write( name );
}
參數(shù)說明:
Name就是遍歷對象,返回的屬性名稱;
Window是一個窗口,代表當前瀏覽器窗口,比如:document、 history、screen、 navigator等
一個函數(shù)對應一個函數(shù)對象。
arguments屬性:函數(shù)對象的一個數(shù)組對象屬性,包含了所有接收到的參數(shù);
arguments.length:取得所有接收到的參數(shù)的個數(shù)
arguments是在函數(shù)內部來使用;
3.對象
對象是一組屬性和方法的集合。
JS中的對象分類:
自定義對象:自己根據(jù)需要定義自己的對象;var obj={}
JS內置對象:
String:字符串對象,提供字符串操作的屬性和方法。比如:length
Array:數(shù)組對象,提供數(shù)組操作的屬性和方法。比如:length
Date:日期時間對象,提供訪問系統(tǒng)時間日期的信息。比如:getDay()、toLocaleString()
Math:數(shù)學對象,提供數(shù)學處理的方法。比如:Math.floor()、Math.ceil()、Math.round()
Number:數(shù)字對象。比如:toFixed()
Function:函數(shù)對象。比如:arguments數(shù)組對象
Event:事件對象。比如:onMouseOver、onMouseOut、onClick、onLoad
正則對象:正則表達式,對數(shù)據(jù)進行更嚴格的驗證。(就業(yè)班講)
BOM和DOM對象(核心)
BOM提供了訪問和操作瀏覽器各組件的途徑;
DOM提供了訪問和操作網頁中各HTML元素的途徑
對象就是一組屬性和方法的集合。
一、創(chuàng)建自定義對象
(1)使用new關鍵字和Object()來創(chuàng)建一個空對象,然后添加屬性和方法
方法就是函數(shù),在對象中的函數(shù),就叫“方法”。
Var obj=new Object();
obj.name=“張三”; //增加一個屬性,并賦值
obj.sex=“男”;
obj.age=30;
obj.isMarried=true;
obj.school=null;
obj.showInfo=function(){
var str=this.name+“的基本資料”;
str +=“<br>姓名:”+this.name;
}
onload:當網頁加載完成,去執(zhí)行JS程序代碼。
當網頁的中所有HTML標記都加載完成后,才會觸發(fā)onLoad事件;
觸發(fā)onLoad事件后,會去調用相應的JS程序。
只要<body>中有一個HTML標記沒有顯示出來,onLoad就不會發(fā)生
<body>……</body>……onload事件……調用JS函數(shù)——document.write
(2)使用{}來創(chuàng)建對象
Var obj={
name:“張三”,
sex:true
}
一個字符串的變量,就是一個String對象。
一、創(chuàng)建String對象的方法
1)使用new關鍵字和String()構造函數(shù)來創(chuàng)建(不常用)
var strObj=new String(“Welcome”);
var len=strObj.length; //獲得字符串的長度
定義一個字符串變量,就對應一個String對象(最常用)
var str=“重蔚自留地”;
var len=str.length;
二、String對象的屬性和方法
length:獲得字符串的長度,var len=str.length
注意:JS的length是指字符個數(shù),并不是按字節(jié)來計算。
charAt(index):返回指定位置的一個字符。
提示:String中的下標與Array中的下標一樣。
index:表示指定位置的下標(索引號)
舉例:
var str=“Welcome”;
var str1=str.charAt(str.length-1) //取得最后一個字符
indexOf(substr[,startIndex]):
描述:從原字符串中,查找子字符串,如果找到,返回起點索引號;如果未找到,返回-1。
參數(shù):
substr:子字符串
startIndex:開始查找的位置索引號。如果省略,則從0開始查找。
lastIndexOf(substr[,startIndex])
描述:在原字符串中,從右往左搜索子字符串,如果沒有找到,則返回-1。
參數(shù):同indeOf()方法一樣
substr(startIndex[,length])
描述:返回一個子字符串。
參數(shù):
startIndex:開始索引號
length:返回幾個字符。如果length省略,返回到結束的所有字符。
舉例:
var str=“welcome”;
var str2=str.substr(3,2); // str2=co
substring(startIndex[,endIndex])
描述:返回索引號從startIndex到索引號endIndex之間的一個子字符串。
參數(shù):
startIndex:開始索引號
endIndex:結束索引號,如果省略,返回到結尾的所有字符。
split(separator)
描述:將一個字符串,用指定分割符separator分成一個數(shù)組。
參數(shù):separator就是一個分割符
舉例:
Var str=“星期一,星期二,星期三”;
Var arr=str.split(“,”);
search(substr)
描述:查找指定的子字符串,如果沒有找到,返回-1
replace(substr,replacement)
描述:在原始字符串中,將一個指定的子字符串,替換成指定的內容。
參數(shù):
Substr:要查找的內容
Replacement:要替換的內容
注意:如果不使用“正則表達式”,則只能替換一次。
var new=str.replace(/X/g,”itcast”); //JS中的正則,是放在//中間的,不能加引號。g參數(shù)代表全部替換。
toLowerCase()
描述:轉成小寫
舉例:str.toLowerCase()
toUpperCase()
描述:轉成大寫
舉例:str.toUpperCase()
localeCompare(str)
描述:對字符串使用本地規(guī)則進行比較。我們使用的操作系統(tǒng)是中文操作系統(tǒng),中文操作系統(tǒng)默認的排序規(guī)則就按“拼音”先后來排序的。
str1.localeCompare(str2)
如果str1 > str2 則返回一個大于0的值
如果str1=str2 則返回一個等于0的值
如果str1<str2 則返回一個小于0的值
onchange:當選擇內容發(fā)生改變時,去調用JS驗證函數(shù)。
length:取得數(shù)組元素的個數(shù)
shift():刪除第一個數(shù)組元素,數(shù)組的長度-1。
pop():刪除最后一個數(shù)組元素,數(shù)組的長度-1
unshift():在開頭添加一個數(shù)組元素,數(shù)組的長度+1
push():在最后添加一個數(shù)組元素,數(shù)組的長度+1
注意:delete刪除的是數(shù)組元素的內容,而shift()刪除的是內容和下標。
join([separator)):將數(shù)組各個元素,用指定的連接符,連成一個字符串。與split()正好相反
separator是可選項,如果省略,則用逗號連接。
reverse():反轉數(shù)組中各個元素,顛倒順序。
sort()
描述:對數(shù)組中各個元素進行排序,默認是按字母的先后順序排列。
格式:arr.sort([orderby])
參數(shù):orderby是可選參數(shù),它指定排序的規(guī)則,一般是一個函數(shù)。
(1)對數(shù)值進行排序
orderby函數(shù)必須接收兩個參數(shù),比如a和b;
orderby函數(shù)中使用return返回值;
如果a-b>0,返回1
如果a-b=0,返回0
如果a-b<0,返回-1
var arr=[1,2,10,12,3,31,15,19,25,39];
arr.sort(orderby);
function orderby(a,b)
{
return a-b;
}
document.write(arr);
一、創(chuàng)建Date對象的實例
(1)使用new關鍵字和Date()構造函數(shù)來創(chuàng)建
Var today=new Date(); //注意:如果不帶參數(shù),則創(chuàng)建一個當前系統(tǒng)時間的實例
(2)指定一個日期時間字符串參數(shù)
Var yestoday=new Date(“1990/10/23 10:09:00”); //可以創(chuàng)建基于某一個時間的一對象實例
二、Date對象的方法
getFullYear():取出四位的年份
getMonth():取出月份,取值0-11
getDate():取出天數(shù)
getHours():取出小時數(shù)
getSeconds():取出秒數(shù)
getMinutes():取出分鐘數(shù)
getDay():取出星期值,取值:0-6
getTime():取出距離1970年1月1日,0時0分0秒的毫秒數(shù)
toLocaleString():轉成字符串
*請認真填寫需求信息,我們會在24小時內與您取得聯(lián)系。