一、语法:
1.区分大小写:变量test 和变量Test不是一回事,typeof是关键字,所以不能用做函数名,但是typeOf就可以!!!
2.标识符:标识符就是指变量、函数、属性的名字,规范是采用驼峰样式,如:sayHi();
开头以字母或者是下划线或者$符号,除了开头其他的用数字也行!!!谨记规范最重要!
注意:关键字、保留字、null、true、false不可以充当标识符!
3.注释:
单行注释:用//
,块级(多行)注释:用/**/
4.语句最好以分号;结尾:压缩代码的时候不出错!你不加分号,解析器也会加,别浪费资源了!!!
判断的写法:
if(test)
{
//推荐使用,让编码意图更加清晰!!!
alert(test);
}
if(test)
//有效,不推荐使用,用这个的真装逼,就不怕出错吗?
alert(test);
二、关键字和保留字
如果你不想让自己的程序报类似"Identifier Expected"的错误的话,就不要将关键字和保留字当做标识符来用就对了!!!
关键字(26):
break、do、 instancsof 、typeof 、case、 else 、new 、var、 catch 、finally 、return、 void、 continue、 for、 switch、 while、 debugger、 function 、this 、with 、default 、if 、throw 、delete、 in 、try
保留字(32):
abstract、 enum、 int 、short、 boolean 、export、 **interface**、 **static**、byte 、extends 、long 、super、 char、 final 、native、 synchronized、class 、float 、**package**、 throws、const 、goto 、**private** 、transient 、debugger 、**implements**、 **protected** 、volatile 、double、 import 、**public**、**let**、yield、eval
我觉得不管以后的版本怎样更改,在挑选标识符的时候永远都把关键字和保留字作为禁区,不去碰它就不会出错了!!!
三、变量
var message;
上面这种写法,没赋值,message的值就实际就是undefined
变量就是在内存中开辟了空间,来存储数据的,var message=“hello”,这并不能说就是给变量message设定字符串类型,而仅仅是给它赋值而已,此时如果message=10,也是可以的,但是并不推荐!!!
同时创建多个变量的方法,鉴于ECMASCRIPT语法的松散,同时定义不同数据类型的变量也是没有问题的:
var message=“hi”,found=false,age=29;
四、数据类型
每一种语言都有它的基本数据类型:
布尔型Boolean
未定义---------Undefined
空---------Null
数字---------Number
字符串---------String
对象---------Object
如果你想知道当前变量的数据类型,那么一个很好的照妖镜就是typeof
typeof是操作符,并不是函数,typeof后面可以跟括号,也可以不跟,理论上来讲函数其实是一个对象,而不是数据类型!!!不同的浏览器对函数typeof会返回不同的值如:function或者object
什么是字面量?
typeof 99 ,其中99就是字面量
null是空对象指针,当你用typeof null的时候,你会发现返回的是一个object类型,它的用处是如果你预先定义了一个变量,但是不知道用它来保存什么数据类型,那么就让他等于Null吧,可以写作var message=null;
但是值得注意的是null==undefined返回的是true
Boolean的字面量就两个,true和false,记住一定是小写的,必须是小写的!!!
Boolean(),这是一个函数,里面放的东西返回的不是true就是false!!!
|数据类型|转换为true的值|转换为false的值|
|Boolean| true | false |
|String| 任何非空字符串 | “” |
|Number| 任何非空数字值,包括无穷大 | 0或者NaN |
|Object| 任何对象 | null |
|Undefined| n/a(意思是不适用,是not applicable) | undefined |
Number的格式可以是整数,也可以是浮点数
整数都是以十进制做基本的字面量的,八进制和16进制也可以储存,只不过在处理的时候都会被处理成十进制
八进制 0开头
十六进制 0x开头
最终的转化:
----------------------------------------》
(十六进制)0xA=10(十进制)
(八进制) 070=56(十进制)
浮点数都是包含了小数点的数字值,有的人习惯0.1写成.1,虽然有效,但是不推荐!!!
内存给浮点数开辟的空间是整数的两倍,为了节省资源,当你用到类似1.0的浮点数时,处理时就按照整数型对待的!!!
3.7125e8,这个数其实就是3.7125乘以10的8次方!!!
0.0000003,这个数的表示方法就是3e-7
浮点数的最高精度是17位小数
计算的过程中0.1+0.2 是不等于0.3的,所以用a+b==0.3的时候返回的是false,其实这就是特定的浮点数,所以不要去用他们反馈就好了!!!至于为什么会不等于0.3,那就是IEEE754浮点计算的事了!!!
浮点数的范围是:
Number.MIN_VALUE=5e-324
Number.MAX_VALUE=1.7976931348623157e+308
如果你获取到的数值超出了上面的范围,得到的值就会使Infinity(正无穷),小数的范围是-Infinity(负无穷)。这种数是不能够参与计算的,想要判断数是否有穷尽,用isFinite()函数,这个函数测的是参数是不是在最大值和最小值之间,如果在,返回的就是true
Number.NEGATIVE_INFINITY:负无穷-Infinity
Number.POSITIVE_INFINITY:正无穷Infinity
NaN是非数值的特殊值,意味着本来是要返回一个数值,但是未返回数值的情况!!!谨记NaN和NaN是不等的,也就是说NaN==NaN返回的是false
isNaN()函数,里面的参数如果可以转化为数值,返回的就是false,不能转化为数值,就是true!
isNaN()的参数适用于对象,本身在验证的过程中会调用toString()和valueOf()方法来执行的。
数值转换:
Number()、parseInt()、parsefloat()
Number()适用于各种数据类型,parseInt()、parsefloat()适用于字符串
Number()的参数是布尔类型的话,true就是1,false就是0
Number()的参数是数字,那就是数字
Number()的参数是null,返回0
Number()的参数是undefined,返回NaN
Number()的参数是字符串,"123"就是123,"011"就是11,"1.1"就是1.1,字符串是空的就是0,十六进制转换为十进制,字符串非法就是NaN。
parseInt()解析"1234blue"的得到的结果是1234
parseInt()解析空字符串得到的结果是NaN
parseInt()解析NULL的得到的结果是0
parseInt()解析十六进制或者八进制时,最好在添加一个参数来确定解析成什么进制的!!!
parseInt(“0xAF”,16)就是说这个是十六进制的!!!参数可以使2、8、10、16,建议就是无论什么时候都要制定参数!!!为了避免出错。
parseFloat()的参数如果是可以解析位整数的数,那么直接就解析成了整数了。
String类型:
用单引号或者双引号都行!!!
\n------------换行
\t------------制表
\b------------退格
\r------------回车
\f------------进纸
\\------------斜杠
\'------------单引号
\"------------双引号
\xnn------------十六进制表示一个字符
\unnn------------十六进制表示一个unicode字符
\u03a3 (转义序列)代表一个字符∑
\x41代表一个字符A
获取字符串的长度要用length的点属性方法来拿!!!
text.length
toString();将所有的值都转化为字符串,null和undefined就没有这个方法
传个参数怎么样?
这个参数是用来定义拿回来的字符串是什么进制的?
var num=10;
alert(num.toString(2));//转化为2进制了,默认不填就是十进制
String();将值先强制转化为字符串,为了防止null和undefined的出现
Object数据类型:
定义一个对象
var o=new Object();//不推荐删除括号,不管有没有参数
Object是所有对象的基础,所以都具备对象的基础属性和方法:
1.constructor--------构造函数
2.hasOwnProperty(propertyName)--------检查给定的属性在当前实例中是否存在
3.isPrototypeOf(object)-------用于检查传入的对象是否是当前对象的原形
4.propertyIsEnumerable(propertyName)用于检查给定的属性是否能够使用for-in循环来枚举。
5.toLocaleString()--------返回对象的字符串表示,该字符串与执行环境的地区对应
6.toString()--------返回对象的字符串表示
7.valueOf()----------返回对象的字符串、数值、布尔值。
五、操作符
一元操作符:++ 、–
var a=10;
var b=++a+1//这里是先+1,a值改变为11,当前b为12,a在打印的话为11
var b=1+a++//这里是后+1,a值不改变,当前b为11,a在打印的话为11
一个+代表正数,一个-代表负数
位操作符,也使用来计算的,了解一下就好,如果你的计算是进制的话就用到未操作符了
布尔操作符:! && ||
加减乘除运算符:+ 、-、 *、 /、 %
在运算的时候如果不是数值类型,会强制转换成数值类型,比如空字符串就是0,true就是1
关系操作符:返回的都是布尔类型的值:
小于等于<=
小于<
大于等于>=
大于>
相等操作符:返回的也是布尔类型的值,要么为true,要么为false
双等于==
不等于!=
全等===(不仅是值相等,数据类型也要相等)‘
不全等!==
条件运算符:?:
A?B:C
如果A为true则A=B,否则=C
赋值操作符:
+=
*=
/=
-=
%=
<<=
>>=
逗号操作符:,
var num=(5,6,7,8,9,0);
num的值就是0//逗号的表达式最后一项是0
将右边的值赋值给左边
var num=10;
num=num+10;
六、流程控制语句:
if判断语句:
if(i=0)//括号里放的是表达式
{
alert("我是"+i)
}else if(i>10){
alert("我是"+i)
}else{
alert("我啥也不是")
}
do-while(后测试循环语句):
var i=0;
do{
i+=2;
console.log("我先来的")
}while(i<10)//括号里放的是表达式
while(前测试循环语句):
var i=0;
while(i<10){
i+=2;
}
for(前测试循环语句):
//写法1
for (var i =0;i<10;i++){
alert(i);
}
alert(i);//i值是可以得到的
//写法2
var i ;
for (i =0;i<10;i++){
alert(i);
}
alert(i);
for无限循环:
for(;;){
alert("我会无限次执行");
}
将for循环当做while循环
var count=10,i=0;
for(;i<count;){
alert(i);
i++;
}
for-in语句
for(var propName in window){
document.write(propName);
}
label+break||continue
label语句:
label:for(var i=0;i<10;i++){
for(var j=0;j<10;j++){
if(i==5 &&j==5){
break label;//跳出循环
}
num++;
}
}
OR
label:for(var i=0;i<10;i++){
for(var j=0;j<10;j++){
if(i==5 &&j==5){
continue label;//跳出循环,执行下一次
}
num++;
}
}
用了label语句,就要避免嵌套过多的循环,标签的名称也要是描述性的最好!!!
with语句:
with(location)
{
var qs = search.substring(1);
var hostName=hostname;
var url =href;
}
with语句的意思就是说关联这个对象,但是这个with语句最好就不用,会影响性能!!!
switch语句
switch(num)//参数可以使任意类型,以数字类型为例
{//没有break就要注释
case num:document.write("数据是"+num);break;
case num:document.write("数据是"+num);break;
case num:document.write("数据是"+num);break;
case num:document.write("数据是"+num);break;
case num:document.write("数据是"+num);break;
case num:document.write("数据是"+num);break;
default:
alert("匹配不成功!");
}
六、函数
sayHi(name,message)
{
document.write(name+","+message);
}
sayHi(“司马麟迦”,“你好吗?”);
函数可以有返回值,也可以没有返回值,返回的东西可以任意!!!
要想返回就要在代码块里面用return,return语句后面的语句是不执行的!!!
computed(a,b)
{
if(a<b){
return true;
}else{
return false;
}
}
computed(100,40);
computed(a,b)中的a,b相当于数组中的元素0,1
arguments.length可以获取传入数组的长度;
arguments[0]其实就是a,arguments[1]其实就是b
如果用的时候报错了,说明实在严格模式下编写的!!!
JS,没有重载一说,两个相同名字的函数,用的一定是后面的,如果一定要重名字,可以通过执行函数的时候,在里面判断有多少个参数在执行!!!