一.变量

- javascript是一种弱类型脚本语言。

- 变量的声明使用var,由数值决定数据类型。

- 变量的命名规则

    (1)变量名必须以字母或者是下标符号“_”或者是“$”开头,数字不能开头。

    (2)变量名长度不能超过255个字符

    (3)变量名称中不能有空格

    (4)不能使用脚本语言中的保留字和关键字作为变量名

    (5)变量名称严格区分大小写

-全局变量

    在方法外部声明的变量

    方法内部没有加var关键字声明的变量

-局部变量

    方法内部使用var声明的

   全局变量和局部变量的示例代码

var a = 3;//全局变量
    function test(){
        b = 3;//全局变量
        alert(a);
    }
    alert(b);

 这段代码会报错,b weil定义,原因是因为javascript代码执行顺序和声明提前导致的,a是全局变量,但是alert(a)在函数体里 面执行的,只有函数被调用时函数体里面的变量才会声明提前,函数体才会执行,所以程序要正常执行需要在alert(b);之前调用test()。

var a = 3;//全局变量
    function test(){
        var b = 3;//局部变量
        alert(a);
        alert(b);
    }
    test();//调用完弹出3在弹出3
    alert(b);//报错b is not defined,局部变量全局不能访问到只有在局部才能访问到

二.变量类型

变量的数据类型分两大类基本数据类型和应用数据类型

1.基本数据类型如下:

(1)number类型(整数,小数,NaN,Infinity,-Infinity)

//以下的类型都是Number

var a1 = 10;
console.log(a1);//10
var a2 = 10.5;
console.log(a2);//10.5这里需要注意浮点型最高精度是17位不要小数相加的方式做判断
var a3 = NaN;//not a number
console.log(a3);//NaN
var a4 = 1/0;
console.log(a4);//Infinity
var a5 = -(1/0);
console.log(a5);//-Infinity
var a6 = parseInt("abc");
alert(a6);//NaN
var a7 = parseInt("123abc");
alert(a7);//123类型是number
var a8 = parseInt("a123abc");
alert(a8);//NaN
(2)undefined //值就是undefined,变量声明了未赋值
var b;
console.log(b);//undefined
var b;
alert(b);//undefined

(3)null //代表对象的引用为空

var b2 = null;
alert(b2);//null

(4)string //字符串类型加单引号或者单引号的

var string1 = "1124";
var wtring2 = "qwe123";

(5)boolean //布尔类型,值是true或false

var a = true;
var b = fasle;

2.引用数据类型(数组 函数 对象)

var array = [1,2,3];//数组
var data = new Data();//日期对象
var obj = {}//空对象,字面量的方式定义对象
funcetion a (){
}//函数

typeof操作符用来判断数据类型

typeof只能判断基本数据类型(基本数据类型里面的null 是object)引用数据类型只能判断出来函数。

var a = 10;//typeof(a);number
var b = 10.5;//typeof(b);number
var c = "nnnn";//typeof(c);string
var d = null;//typeof(d);object
var e = undefined;//typeof(e);undefined
var f = false;//typeof(f);boolean
var g = {};//typeof(g);object
var h = [1,2,3,4];//typeof(h);objec
var j = function(){};//typeof(j);function

三.操作符

ECMA标准也定义了很多操作符,主要分以下几种:

[1]一元操作符

只能操作一个值的操作符叫做一元操作符,是ECMAScript中做简单的操作符。

1.递增和递减操作符(分前置和后置型)

前置递增操作符:

var age = 29;
++age;
alert(age);//30

执行前置递增与下面的代码执行效果相同

var age = 29;
age = age+1;
alert(age);//30

前置递减操作符:

var age = 29;
--age;
alert(age);//28

执行前置递增或递减操作时,变量的值都在语句被求值之前改变的。

var age = 29;
var anotherAge = --age+2;
alert(age);//28
alert(anotherAge);//30

后置递增和递减与前置的有一个非常重要的区别:变量的值都在语句被求值之后改变的。再某些情况下不是问题,如:

var age = 29;
age++;
alert(agg);//30

当语句中包含其他操作时上述区别就非常明显了,如下

var num1 = 2;
var num2 = 20;
var num3 = num1-- +num2;
alert(num3 );//22
var num4 = num1+num2;//21

递增和递减操作符还适用于除了整数以外的值,如字符串,布尔值浮点值和对象,试用不同的值时遵循下列规则:

(1)在包含有效数字字符串的时候,先将其转换为数字值,在执行+1的操作字符串变量变成数值变量如下:‘

var s = "2";
var s1 = s++;
alert(s);//3
alert(s1);//2

(2)在不包含有效数字字符串的时候,将转换为NaN,字符串变量变成数值变量。如下:

var s2 = "afh123";
var s3 = s2++;
alert(s3);//NaN

(3)在应用于布尔值false时,先将其转换成0,在做加1减1操作。布尔值变量变成数值变量。如下:

var b = false;
b++;//值变成1

 

(4)在应用于布尔值true时,先将其转换成1,在做加1减1操作。布尔值变量变成数值变量。

(5)在应用于浮点数时,执行加减1操作。

var f = 1.1;
f--;//值变成0.10000000000000009

(6)应用于一个对象时,先调用对象的valueof()方法,已取得一个可操作的值。还厚对该值应用前述规则,如结果是NaN,则在调用toString(),在应用前述规则。对象变量变成数值变量。

var o = {
 valueOf:function(){
  return -1;
 }
}
o--;//值变成-2

2.一元加和减操作符

主要应用于基本的算数运算,也可以用于转换数据类型。

var age = 25;
age = +age;//25
age = -age;//-25

[2]位操作符

不常用

[3]布尔操作符(逻辑! 逻辑&& 逻辑||)

布尔操作符堪比相等操作符,如果灭有测试两个值关系的能力那么if(){}else{}就无用了。

(1)逻辑非(!)

    操作数是一个对象返回false

    操作数是一个空的字符串返回true

    操作数是非空字符串返回false

    操作数是0返回true

    操作数是任意非0数值,返回false

    操作数是null返回true

    操作数是NaN返回true

    操作数是undefined返回true

(2)逻辑与(&&,有两个操作数)

针对两个布尔值使用时,只要有一个值是false都会返回false,还可以应用于其他类型的操作数。

&&具有短路操作,如第一个操作数是false就不会计算第二个操作数,如第一个操作数是true会继续计算第二个操作数,注意返回的是操作数。

(2)逻辑或(||,有两个操作数两个操作数都是布尔值时,第一个操作数求值结果是true就返回true,不需要对第二个操作数求值(短路操作)。例如:

var Myobject = a || b;//当a值无效时,b赋值给这个对象

[4]乘性操作符(3个乘性操作符乘法除法和求模)

操作数为非数字的情况下会执行自动的类型转换空字符串被当做0,布尔值true当作1。

乘法(*)

(1)如一个操作数是NaN,结果是NaN。

"123d"*1//NaN

(2)Infinity与0相乘,结果是NaN

Number.MAX_VALUE*2*0

(3)如果Infinity与非0的数相乘,结果是Infin

ity或者是-Infinity。

Number.MAX_VALUE*2*-3//-Infinity

(4)如果Infinity与Infinity相乘,结果是Infinity,这个是必然的

(5)如果有一个不是数字,后台会调用Number()将其转换为数值,然后在应用上面的规则

"150"*2//300

(6)如操作数都是数值,执行常规的乘法计算,不管乘积是整数还是负数,超出ECMAScript数值的表示范围,就会返回Infinity或-Infinity。可以想通是必然的。

除法(/)与乘法操作符规则相同。

(1)如一个操作数是NaN,结果是NaN。

"1234c"/1 //NaN
1/"1234c" //NaN

(2)如果Infinity除以Infinity,结果是NaN

Number.MAX_VALUE*1.5/(Number.MAX_VALUE*1.5) //NaN

(3)如果是0/0结果是NaN

(4)如果是非0的有限数被0除,结果是Infinity或-Infinity

256667/0 //Infinity

(5)如果Infinity被非0数值除,则结果是Infinity或-Infinity

Number.MAX_VALUE*2/1

(6)如操作数都是数值,执行常规的除法计算,不管商是整数还是负数,超出ECMAScript数值的表示范围,就会返回Infinity或-Infinity。

(7)如果有一个不是数字,后台会调用Number()将其转换为数值,然后在应用上面的规则

求模(余数)(%)

var result = 26%5;//1

(1)如操作数都是数值,执行常规的除法计算,返回除得的余数

(2)被除数是无穷大值,除数是有限大的数值,则结果是NaN

(3)如被除数是有限大,除数是0,结果是NaN

123%0 //NaN

(4)如果Infinity除以Infinity,结果是NaN

(5)如被除数是0,结果是0

0%100 //0

(6)被除数是有限大,除数是无穷大,结果是结果是被除数

133%(Number.MAX_VALUE*2)
//133

(7)如果有一个不是数字,后台会调用Number()将其转换为数值,然后在应用上面的规则

[5]加性操作符(加法和减法)

加法(+)

如果两个操作数都是数值,执行常规的加法运算,然后根据下列规则返回结果。

(1)如果一个操作数是NaN,结果就是NaN

(2)如果是Infinity加Infinity,结果是Infinity

(3)如果是-Infinity加-Infinity,结果是-Infinity

(4)如果是-Infinity加Infinity,结果是NaN

(5)如果是+0加+0,结果是+0

(6)如果是-0加-0,结果是-0

(7)如果是+0加-0结果是0

减法(-)遵循下面的规则

(1)如果两个操作数都是数值,执行常规的减法运算,并返回结果。

(2)如果一个操作数是NaN,结果就是NaN

"234a"-1 //NaN

(3)如果是Infinity减Infinity,结果是NaN

(4)如果是-Infinity减-Infinity,结果是NaN

(5)如果是-Infinity减Infinity,结果是-Infinity

(6)如果是Infinity减-Infinity,结果是Infinity

(7)如果是+0减+0结果是0

(8)如果是-0减+0结果是-0

(9)如果是-0减-0结果是+0

(11)如果有一个是字符串布尔值null 或undefined,后台会调用Number()将其转换为数值,然后在应用上面的规则执行减法计算,如果转换的值是NaN,则减法的结果就是NaN

(12)如果一个操作数是对象,调用对象的valueof()方法,已取得一个可操作的值。如对象没有valueOf(),则在调用toString(),并将得到的字符串转换为数字。 

[6]关系操作符(大于(>) 小于(<) 大于等于(>=) 小于等于(<=))

返回布尔值,当操作数使用了数值时也要进行数据转换

(1)两个操作数都是数值,则执行数值比较

3>2 //true

(2)都是字符串,比较字符串对应的字符编码值

"Brick"<"alphabet" //true 大写字母的字符编码小于小写字母的字符编码
"23"<"3" //true比较的还是字符编码

(3)如果一个操作数是数值,将另外一个操作数转换为一个数值,然后进行数值比较。

"23"< 3 //fasle字符串23转换为数值23在与3进行比较
"aa1"<3 //false "aa1"被转换成NaN怎么比较都是false

(4)如果一个操作数是对象,调用对象的valueof()方法,。如对象没有valueOf(),则在调用toString(),并将得到的结果跟前面的规则比较。

(5)如果一个操作数是布尔值,先将其转换为数值,然后在执行比较。

true<2 //true
true< "2" //true

[7]相等操作符(相等和不相等(==),全等和不全等(===))

(1)如一个操作数是布尔值,则在比较相等性之前将其转换成数值-false转成0,true转成1

(2)一个操作数是字符串,另外一个操作数是数值,比较之前将字符串转成数值

"123"==123//true

(3)如果一个操作数是对象,调用对象的valueof()方法,用得到的基本类型按照前面的规则进行比较。

(4)null和undefined是相等的

(5)要比较相等性之前不能讲null和undefined转换成其他任意值

(6)如果一个操作数是NaN,则相等操作符返回false,不相等操作符返回true。

(7)如果两个操作数都是NaN,相等操作符返回false,NaN不等于NaN。

(8)如果两个操作数都是对象,则比较是不是同一个对象,两个操作数都指向同一个对象返回true,否则返回false。

全等和不全等(===    !==)

数值和类型都相等才返回true

"55" ===55//false
null===undefined//false

[8]条件操作符(三元运算符)

var max = (num1>num2)?num1:num2

[9]赋值操作符(=)

作用就是把右侧的值赋值给左侧的变量。

var num = 10;
 num += 10;

符合赋值操作符

乘/赋值(*=)

除/赋值(/=)

模/赋值(%=)

加/赋值(+=)

减/赋值(-=)

左移/赋值(<<=)

有符号右移/赋值(>>=)

无符号右移/赋值(>>>=)

[10]逗号操作符

var num=1,num1=2,num2=3;

var num=(1,2,3,4,0);//num值是0