整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

那些吃灰产品的「正确」用法

那些吃灰产品的「正确」用法


它们通通变成数字时钟吧!

前段时间,一个「Kindle 疑似退出中国市场」的新闻登上热搜,很多人这才想起被自己冷落许久的 Kindle。虽然经常被吐槽为压泡面神器,但事实往往更残酷,大多数人即使是泡面时也懒得翻出它——假如就在手边能随时拿到,那也算不上是压箱底了。(看到这里,你可以把自己的 Kindle 拿出来充充电了)

在吃灰列表中,Kindle 只是最常被吐槽的那个,像它一样被打入冷宫的产品还有不少。过时或已经损坏的电子产品已经失去了其使用价值,情怀玩家只是拿来收藏。除了放在抽屉里吃灰,还有什么方法可以让它们「发挥余热」吗?


Kindle

先来说说 Kindle。网上很多人晒出的图都显示电量不足,也有人提供了一种新用法,把 Kindle 当数字时钟。Kindle 官方系统自然是不能随便安装应用,需要用「网页浏览器」来实现。

  • 输入网址:http://k.ilib.io/u/clock.html
  • 在主页搜索:~ds,回车

通过代码能让 Kindle 进入常亮状态(重启可以恢复),建议将背光亮度调到最低,同时打开飞行模式,这样能让续航时间长一点。


Switch

不知道有多少人是为健身环买了 Switch?能坚持锻炼(变秃)变强的人只是少数,更多人是一时冲动。如果你本身不是重度玩家,又找不到人一起玩聚会游戏,Switch 的使用场景其实很少,最终难逃吃灰命运。

任天堂官方出了一个《AAA 时钟》,售价 79 港元。是的你没有看错,它的功能就是让你的 Switch 显示数字时钟,颜值相当赞,可切换 24 小时制、更改颜色样式。配合颜色丰富的手柄或贴纸保护套,放在桌上当摆件也是不错的。

这款闹钟软体中还附送了一个游戏,类似 Chrome 的断网小恐龙,没什么游戏体验。

吃灰的还有健身环,健身器材怎么二次利用,不用我多说了吧?

图片来源于网络


iPad/iPhone/Android

iPad 的情况比前两者好一点,虽然不是所有人都把它当「生产力工具」使用,不过至少也能看看爱奇艺。iPad 的使用场景被手机电脑抢走许多,这么大又优秀的屏幕,放着实在是浪费,不如——把它变成数字时钟吧!

iPad 时钟应用我推荐「谜底时钟」,样式比较丰富,还带音效,可以利用快捷指令设置为充电时自动运行,或者添加小组件到桌面。

谜底时钟也有 iPhone 版本,推荐给家里有旧 iPhone 的朋友。

安卓端的时钟应用就多了,或者还有一种选择,买一个「坚果闹钟式无线充电座」,二手市场价格不到百元,几款支持无线充电的坚果手机可以直接放上去显示翻页闹钟,其他品牌需要安装「坚果时钟」App。


旧物改造

上面介绍的是过时或者使用场景较少的产品,并不是不能用,有的产品是真的完全失去了使用价值。

最近流行把数码零件装进展示框的玩法,有人把这做成了一门生意,你可以直接购买到裱好的成品来收藏:

(某宝店铺:寻乐造物)

有人把电路板做成了项链:

某宝店铺:1ceas

时尚圈和数码圈的组合也很有意思,AirPods 可以当配饰使用:

图片来源:《Vogue》

人们购买数码产品时,大多把实用性放在第一位,买之前会详细对比价格和参数,设想好了各种用法。但事与愿违,人每天可支配的时间有限,而数码领域最不缺的就是新品迭代。当旧的物件失去其使用价值,除了卖二手之外,不如想想如何才能让自己不要忘记它。


本文作者:刘丢丢

本文首发于极客之选,转载请联系极客君(ID:geekparker)。

不久用JS+html<canvas>标签实现了简易时钟(见HTML使用Canvas绘制动画时钟),最近学习C/C++语言(话说怎么区分写的是c还是c++?),恰好看到一个有趣的绘图库EasyX,拿它来练练手,就先做个简易时钟看看吧。

EasyX Graphics Library 是针对 Visual C++ 的免费绘图库,支持 VC6.0 ~ VC2022。EasyX可以帮助 C/C++ 初学者快速上手图形和游戏编程。

比如,可以基于 EasyX 图形库很快的用几何图形画一个房子,或者一辆移动的小车,可以编写俄罗斯方块、贪吃蛇、黑白棋等小游戏,可以练习图形学的各种算法,等等。

简单了解了EasyX后,就可以开干了。本文开发环境是windows 11和Visual Studio 2022。首先打开vs2022并创建一个空的控制台项目,在项目里新建main.cpp,#include EasyX的头文件graphics.h。提示:由于EasyX是针对C++的绘图库,必须用cpp文件来开发编译,但是编码可以是c也可以是c++。

EasyX使用非常简单,可以一边阅读EasyX在线文档(https://docs.easyx.cn/zh-cn/intro)一边开发。基本流程:

#include <graphics.h>		// 引用图形库头文件
int main()
{
	initgraph(600, 400);	// 创建绘图窗口,大小为 600x400 像素
	//绘图操作
	closegraph();			// 关闭绘图窗口
	return 0;
}

下面基于以上基础代码逐步添加。

准备工作

由于EasyX默认情况下生成的绘图界面是黑色的背景,我们可以使用setbkcolor函数更改界面背景色为白色:

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

绘制钟面内外框

时钟可以分成钟面外框、大小刻度和指针。由于指针指向是需要随时间动态变化,因此不能固定不变。而钟面外框是固定不变的,可以只绘制一次。(大小刻度也是固定不变的,但是由于与秒针行走路径有重叠,也要动态绘制)

示例中钟面外框绘制成两个大圆,都有一定的宽度。

绘制圆形的函数是void circle( int x, int y, int radius );参数分别是圆心的x、y坐标以及半径长度,如果要绘制宽度,可以使用setlinestyle()函数设置线条的形状和宽度:

setlinecolor(BLACK);//设置线条颜色
setlinestyle(PS_SOLID, 10);//设置线条样式和宽度
circle(0, 0, oY - 10); //绘制时钟外黑框
//画出时钟的内框
setlinestyle(PS_SOLID, 4);
circle(0, 0, R);
setlinestyle(PS_SOLID, 1);//绘制完钟面内外两个框后恢复线条宽度为1

绘制钟面内外两个框

绘制大小刻度和12个数字

由于大小刻度与指针有部分重叠,因此也要跟随指针一起反复动态绘制。因此都将它们放入一个while循环中。

示例中,大刻度画小实心圆,小刻度画短线条。画刻度和指针都需要定位坐标,需要用上数学计算,须先引入头文件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个数字,如果有更好的定位方式欢迎告知,谢谢。
	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);

效果图:

绘制大小刻度和圆心

绘制指针

指针有三种,时针粗短,分针适中,秒针细长,示例中将秒针绘制成红色以示区别。指针的位置是根据时间动态更新的,所以先要获取当前的系统时间,可以简单地引入time.h头文件。

//绘制时针,参数为当前时,分,秒
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);
}
//绘制分针,参数为当前分,秒
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);
}
//绘制秒针,参数为当前秒
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);
}
//根据指针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);

让我们看看效果如何。

绘制了指针的时钟,出现了好多的秒针轨迹

哈哈,闹笑话了。由于我们在实时地?计算新的指针坐标并更新绘制新的指针位置,因此界面上绘制出了很多的秒针轨迹。怎么解决呢?方法肯定是有的,可以绘制前先清除设备(调用cleardevice()函数,将清除整个绘图窗口),我们这里不打算清除全部,只把钟面圆框内的部分清除:

clearcircle(0, 0, oY-25);//先清除内圆框之内的全部
//然后再写动态绘图刻度和指针的代码

看看效果如何:

到此为止,一个简单的时钟已经绘制完成了。但是你可能发现有点小问题:界面有时会闪烁一下。这是由于动态更新指针位置并实时绘制出来造成的闪烁,可以使得经典的双缓冲技术来解决。EasyX很贴心地提供了这个技术,只需要三个函数:

BeginBatchDraw();
while(true){
  //反复的绘制操作
	FlushBatchDraw();
}
EndBatchDraw();

就是这么简单。在我们的示例代码中加上它们就行了。

简单优化:节流

示例中将动态时间计算和实时更新绘图都放在了while循环中,计算机超强的计算速度下,每秒可将会计算非常多次,示例中时钟是按秒走的,我们可以采用节流思想,在一段时间的指定时间间隔内只执行一次回调函数,限制在一定时间内的执行次数,从而控制高频率触发的事件,避免过多的计算或操作影响性能。最简单的做法是一次绘图更新完成后,sleep一定时间。也可以根据系统时钟打点数计算fps:

const clock_t FPS=1000 / 2;//每秒只执行两次
clock_t startTime, freamTime;
while (true) {
	//计算帧率
		startTime=clock();
		freamTime=clock() - startTime;

		if (freamTime < FPS)
		{
			Sleep(FPS - freamTime);
		}
  //将各种动态绘图代码写在此处
}

完整代码(Visual stdio 2022 编译通过)

.昨日回顾

函数

函数的概念:将一段常用代码进行命名,这个名称就叫“函数”。

函数的步骤:(1)先定义函数,函数定义后不能直接执行,必须调用函数,函数才会执行

(2)调用函数:直接写函数名称,后面直接跟一个小括号,小括号中可以有“实参”

函数语法格式:

function functionName([形参1][,形参2][,形参3])

{

实现一个功能的程序代码;

[return 参数]

}

语法说明:

函数名称的命名同变量一样;

形式参数:定义函数的参数就叫“形式参数”,该参数接受调用函数时传递过来的值

形式参数的命名,同变量也一样;

形式参数不能是具体的值;比如:function getMax(10,20)是错误的

函数定义了,就必须要调用;

调用函数用时,直接写函数名称,后跟小括号,括号中是“实参”;

实际参数:调用函数时,传递的参数叫“实参”,就是“实际的数据”;

形式参数和实际参数的个数和顺序应保持一致;

Return语句:可以调用函数者返回一个结果;

Return语句执行后,立即结束函数的运行;

如果return语句后面,还有其它程序代码,将不再执行;

因此,return语句放在函数的最后面;

JS中是区分大小写的,但关键字一律小写;对象的方法:today.toLocaleString()

全局变量和局部变量

全局变量:可以在任何地方(函数内部和函数外部)使用的变量,就叫“全局变量”;

一般来说,在函数外部定义的变量,是“全局变量”;

省略关键字var定义的变量,也是“全局变量”,一般情况下不要省略;

局部变量:只能在函数内部使用的变量,叫“局部变量”。

注意:在JS中,在函数外部定义的变量,可以在函数内部使用;但在函数内部定义的变量,只能在函数内部使用。

将函数定义作为数据,赋给其它变量

  • 将函数定义,赋给一个基本数据类型的变量

function showInfo()

{

return “我是一个函数”;

document.write(“我是一个函数”);

}

var a=showInfo; //将函数定义(地址),赋给一个变量,变量a是复合数据类型

document.write(a() );

var b=showInfo(); //将函数的执行结果,赋给一个变量b,变量b是基本数据类型

注意的是:函数名showInfo后不能跟小括号;

如果showInfo后面跟了小括号,就是调用函数,将函数的执行结果,赋给a变量,而不是地址

  • 将函数定义,赋给一个数组元素,那么,该数组元素就是一个函数了;

Var arr=[10,20,30];

arr[1]=showInfo(); //arr[1]的值是“我是一个函数”

arr[2]=showInfo; //arr[2]就变成了函数

document.write( arr[1] );

document.write( arr[2]() ); //既然arr[2]是一个函数,在调用时,一定要写小括号

3)将函数定义,赋给一个对象属性,那么,该对象的属性就是一个函数了;

var obj={

name:“张三”,

age:30,

show:showInfo //将函数定义,赋给了一对象属性

};

obj.show(); //方法和函数的定义是一样的,只是在不同的地方叫法不一样

document.write( obj.name );

基本数据类型和复合数据类型

基本数据类型:是将变量名称和变量的值,都存入“快速内存”“栈内存”;

将基本数据类型的变量,赋给其它变量,是将原来变量的值“复制”一份,放到了新变量中,因此,这两个变量没有任何关系,换句话说:修改其中一个变量的值,另一个变量的值不会改变;

var a=10; //基本数据类型,在赋值是地,是传值

var b=a; //将a的值,复制一份,传给b

a=100; //给变量a重新赋值

document.write(b); //求变量b的值,是否会改变

引用数据类型(复合数据类型):它的存储分两个部分,一是把数据存到“慢内存”“堆内存”,二是将变量名称和数据地址存到“快速内存”“栈内存”。

换句话说:就是新变量和旧变量,同时指向了同一个数据地址,只是变量名称不一样。

var arr1=[1,10,20,30];

var arr1=new Array(1,10,20,30);

var arr2=arr1; //将arr1赋给了arr2,其实,这里传的数据地址,并不是具体的数据

arr1[0]=100; //对arr1中的第1个元素,重新赋值

document.write( arr2[0] );

补充知识点:for in循环

For ……in主要是循环或遍历,数组元素对象的属性

注意:如果遍历数组的话,未定义的数组元素,不会输出;只会输出有效数据。

语法结构:

for(index in arr)

{

document.write( arr[index] );

}

参数说明:

arr代表一个数组;

index代表一个数组元素的下标;

举例:

var arr=[1,2,,,,,3,,,,,,,,,,,,,,,,,4];

遍历对象属性

for(name in window)

{

document.write( name );

}

参数说明:

Name就是遍历对象,返回的属性名称;

Window是一个窗口,代表当前浏览器窗口,比如:document、 history、screen、 navigator等

2.函数对象

一个函数对应一个函数对象。

arguments属性:函数对象的一个数组对象属性,包含了所有接收到的参数

arguments.length:取得所有接收到的参数的个数

arguments是在函数内部来使用;

3.对象

对象是一组属性和方法的集合。

JS中的对象分类:

自定义对象:自己根据需要定义自己的对象;var obj={}

JS内置对象:

String:字符串对象,提供字符串操作的属性和方法。比如:length

Array:数组对象,提供数组操作的属性和方法。比如:length

Date:日期时间对象,提供访问系统时间日期的信息。比如:getDay()、toLocaleString()

Math:数学对象,提供数学处理的方法。比如:Math.floor()、Math.ceil()、Math.round()

Number:数字对象。比如:toFixed()

Function:函数对象。比如:arguments数组对象

Event:事件对象。比如:onMouseOver、onMouseOut、onClick、onLoad

正则对象:正则表达式,对数据进行更严格的验证。(就业班讲)

BOM和DOM对象(核心)

BOM提供了访问和操作浏览器各组件的途径;

DOM提供了访问和操作网页中各HTML元素的途径

4.自定义对象

对象就是一组属性和方法的集合。

一、创建自定义对象

(1)使用new关键字和Object()来创建一个空对象,然后添加属性和方法

方法就是函数,在对象中的函数,就叫“方法”。

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:当网页加载完成,去执行JS程序代码。

当网页的中所有HTML标记都加载完成后,才会触发onLoad事件;

触发onLoad事件后,会去调用相应的JS程序。

只要<body>中有一个HTML标记没有显示出来,onLoad就不会发生

<body>……</body>……onload事件……调用JS函数——document.write

2)使用{}来创建对象

Var obj={

name:“张三”,

sex:true

}

5.JS的内置对象——String对象

一个字符串的变量,就是一个String对象。

一、创建String对象的方法

1)使用new关键字和String()构造函数来创建(不常用)

var strObj=new String(“Welcome”);

var len=strObj.length; //获得字符串的长度

  • 定义一个字符串变量,就对应一个String对象(最常用)

var str=“重蔚自留地”;

var len=str.length;

二、String对象的属性和方法

length:获得字符串的长度,var len=str.length

注意:JS的length是指字符个数,并不是按字节来计算。

charAt(index):返回指定位置的一个字符。

提示:String中的下标与Array中的下标一样。

index:表示指定位置的下标(索引号)

举例:

var str=“Welcome”;

var str1=str.charAt(str.length-1) //取得最后一个字符

indexOf(substr[,startIndex])

描述:从原字符串中,查找子字符串,如果找到,返回起点索引号;如果未找到,返回-1。

参数:

substr:子字符串

startIndex:开始查找的位置索引号。如果省略,则从0开始查找。

lastIndexOf(substr[,startIndex])

描述:在原字符串中,从右往左搜索子字符串,如果没有找到,则返回-1。

参数:同indeOf()方法一样

substr(startIndex[,length])

描述:返回一个子字符串。

参数:

startIndex:开始索引号

length:返回几个字符。如果length省略,返回到结束的所有字符。

举例:

var str=“welcome”;

var str2=str.substr(3,2); // str2=co

substring(startIndex[,endIndex])

描述:返回索引号从startIndex到索引号endIndex之间的一个子字符串。

参数:

startIndex:开始索引号

endIndex:结束索引号,如果省略,返回到结尾的所有字符。

split(separator)

描述:将一个字符串,用指定分割符separator分成一个数组

参数:separator就是一个分割符

举例:

Var str=“星期一,星期二,星期三”;

Var arr=str.split(“,”);

search(substr)

描述:查找指定的子字符串,如果没有找到,返回-1

replace(substr,replacement)

描述:在原始字符串中,将一个指定的子字符串,替换成指定的内容。

参数:

Substr:要查找的内容

Replacement:要替换的内容

注意:如果不使用“正则表达式”,则只能替换一次。

var new=str.replace(/X/g,”itcast”); //JS中的正则,是放在//中间的,不能加引号。g参数代表全部替换。

toLowerCase()

描述:转成小写

举例:str.toLowerCase()

toUpperCase()

描述:转成大写

举例:str.toUpperCase()

localeCompare(str)

描述:对字符串使用本地规则进行比较。我们使用的操作系统是中文操作系统,中文操作系统默认的排序规则就按“拼音”先后来排序的。

str1.localeCompare(str2)

如果str1 > str2 则返回一个大于0的值

如果str1=str2 则返回一个等于0的值

如果str1<str2 则返回一个小于0的值

onchange:当选择内容发生改变时,去调用JS验证函数。

6.Array对象

length:取得数组元素的个数

shift():删除第一个数组元素,数组的长度-1。

pop():删除最后一个数组元素,数组的长度-1

unshift():在开头添加一个数组元素,数组的长度+1

push():在最后添加一个数组元素,数组的长度+1

注意:delete删除的是数组元素的内容,而shift()删除的是内容和下标。

join([separator)):将数组各个元素,用指定的连接符,连成一个字符串。与split()正好相反

separator是可选项,如果省略,则用逗号连接。

reverse():反转数组中各个元素,颠倒顺序。

sort()

描述:对数组中各个元素进行排序,默认是按字母的先后顺序排列。

格式:arr.sort([orderby])

参数:orderby是可选参数,它指定排序的规则,一般是一个函数。

(1)对数值进行排序

orderby函数必须接收两个参数,比如a和b;

orderby函数中使用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);

7.Date对象

一、创建Date对象的实例

(1)使用new关键字和Date()构造函数来创建

Var today=new Date(); //注意:如果不带参数,则创建一个当前系统时间的实例

(2)指定一个日期时间字符串参数

Var yestoday=new Date(“1990/10/23 10:09:00”); //可以创建基于某一个时间的一对象实例

二、Date对象的方法

getFullYear():取出四位的年份

getMonth():取出月份,取值0-11

getDate():取出天数

getHours():取出小时数

getSeconds():取出秒数

getMinutes():取出分钟数

getDay():取出星期值,取值:0-6

getTime():取出距离1970年1月1日,0时0分0秒的毫秒数

toLocaleString():转成字符串