一、变量
顾名思义,变量就是用var定义的、可用于存储信息的"容器"。您可以把变量看做存储数据的容器。就像代数那样:
x=5;
y=6;
z=x+y;
javascript中将这些字母定义为变量。
实列:
var x=5;
var y=6;
var z=x+y;
二、变量命名规则
Javascript变量可以存放值或表达式
你可以用短名称(比如:x,y,z),也可以使用描述性更好的名称(比如:num,age,sex)等等。
①变量有字母,数字,下划线或$符号组成。
②变量必须以字母,或下划线,或$符号开头。
③变量对大小写敏感。(x与X是不同的变量);
④变量名不能和JavaScript关键词同名。
⑤复数形式变量采用“驼峰”命名。
⑥变量首字母不宜采用大写。(英文中首字母大写通常表示类),javascript程序中首字母为下划线通常视为对象的私有属性。
当然,很多规则都是约定俗成。正如鲁迅先生的哲理:“世上本无路,走的人多了便有了路”。
三、变量声明
在 JavaScript 中创建变量通常称为"声明"变量。
javascript变量为松散类型。当一个变量被申明出来可以保存任何类型的值,而不像SQL申明某个键值为int就只能保存整型数值,申明varchar只能保存字符串。
javascript中申明变量通过var关键字,申明的变量会成为其作用域内的局部变量(全局申请的为全局变量,函数内申请的为局部变量),局部变量会在函数执行完毕销毁,未通过var关键字申明的变量默认为全局变量。可以同过var关键字一次申请多个变量:
var age=12,
num=13,
name='张三';
一个好的编程习惯是,在代码开始处,统一对需要的变量进行声明。
四、变量的基本数据类型
值类型:数字(number),字符串(string),布尔值(Boolean),空(Null),未定义(undefined),唯一值(Symbol);
引用类型:函数(Function),数组(Array),对象(Object);
① Undefined类型
Undefined只有一个唯一的值即undefined。所有已声明未赋值的变量都为undefined。
var age;
console.log(age);//结果为:undefined
② Null类型
Null类型也只有唯一的值即为null,亦可当作空对象指针,正由于这个特性,如果你定义某个变量不确定当前如何赋值,但未来要赋值某个object类型数据,可将该变量初始化为null类型。
**null == undefined 比较时,会返回true,因为undefined派生自null。
③Boolean类型
Boolean俗称布尔,包含两个值true和false。
Boolean()转型函数可以对任何类型的值使用,将类型值转换为布尔型。当遇到if语句时会对数据进行自动的类型转换
String型:非空字符串-true,空字符串("")-false
Number型:任何非0数-true,0与NaN-false
Object型:任何对象-true,null-false
Undefined型:false
④Number类型
JavaScript 只有一种数字类型。数字可以带小数点,也可以不带;
Number类型支持十进制,八进制以及十六进制的数字。
var x=33;//整形
var y=3.1415926;//浮点型
注意:javascript中0.1与.1相等,但不建议此种写法。由于保存浮点型数据是整形的两倍,所以javascript会在适当的时候将不必要的浮点型保存为整形,比如10.0自动保存为10。特别需要注意的是 浮点型的数据计算远没有整型数据精确。浮点型的最高精度即为显示的17位小数,过大或过小的数可以使用科学计数法e来表示。
在Number类型中还有个很特殊的值,那就是NaN,即非数值(Not a Number)。这个特殊值的存在是为了避免在某些需要返回数值时因为运算问题未返回数值报错,影响程序运行。比如一个数除以0,在其他编程语言中会抛出错误,而在JavaScript中会返回NaN。
注意:NaN不与任何数值相等,包括它本身。检测一个值是否为NaN,用isNaN()函数,它会尝试将接受的参数转换为数值。
数值转换
Number类型的数值转换方式可能通过三个函数:Number()、parseInt()、parseFloat()。由于Number()转换函数转换规则奇葩(复杂且不合理),所以这里主要介绍parseInt()与parseFloat()。
parseInt()
parseInt(""); //NaN
parseInt(3.14); //3
parseInt("4.12"); //4
parseInt("xyx123"); //NaN
parseInt("123xyx"); //123
parseInt(100111,2); //39
parseInt(123,8); //83
parseInt("0xBC",16); //188
总结:parseInt转换数字会忽略前面的空格直到找到第一个非空字符。如果第一个非空字符不是数字字符或者负号则返回NaN。如果第一个字符是数值字符会继续解析第二个,直到解析完整个字符串或者遇到了一个非数值字符
parseFloat()
parseFloat("123xyx"); //123
parseFloat("xyx123"); //NaN
parseFloat("012.3"); //12.3
parseFloat("34.5"); //34.5
parseFloat("34.5.6"); //34.5
总结:parseFloat()也是从第一个字符开始解析,直到字符串末尾或者遇到一个无效的浮点数字字符为止。比如,第一个小数点是有效的,第二个是无效的,因此后面的字符会被忽略。与parseInt()不同的是它始终会忽略开头的0,且不具备传入基数的能力,即只能解析十进制数值。
**⑤String类型
字符串是存储字符(比如 “Bill Gates”)的变量。用单引号或双引号包裹。任何字符串都可以通过length计算长度。
var str = 'Hello World';
alert(str.length); //11
字符串转换有两种方式:toString()或String();
区别是:null,undefined类型没有toString()方法。任何类型值都可以用String();
var num = 123;
num.toString(); //"123"
var boo = false;
boo.toString(); //"false"
多数情况下,调用toString()方法不必传递参数。当要确定输出数值的不同进制时,可以传入一个基数。
var num = 10;
num.toString(); //"10"
num.toString(2); //"1010"
num.toString(8); //"12"
num.toString(10); //"10"
num.toString(16); //"a"
不确定转换的值是null或undefined时,建议使用String()方法。如果该值有toString()方法则调用该方法,如果是null或undefined则返回其字符串表示…总之String()转型函数就不会错。
String(10); //"10"
String(true); //"true"
String(null); //"null"
String(undefined); //"undefined"
⑥Function类型
Function实际上是对象,与其他引用类型一样具有属性和方法。Function可以通过三种方法进行定义,分别是函数声明语法定义,函数表达式定义和Function构造函数定义。
- ****函数声明法定义
function getParams(agment,obj){
//函数体
}**
2.函数表达式定义
var getParams = function(agment,obj){
//函数体
}
3.Function构造函数
var fun = new getParams(value1,……,函数体);
通过Function构造函数创建函数,可向构造函数中传入任意数量的参数,但值得注意的是传入的最后一个参数会作为函数体,而其他参数则作为参数传入函数中。用该方法去定义函数是不推荐使用的,因为该语法会导致解析两次代码,第一次解析常规ECMAScript代码,第二次解析传入构造函数的字符串,影响性能。
注:函数是引入值类型,所以函数名仅仅是指向函数的指针,当使用函数名去赋值给另一个变量名时,仅仅复制的是一个指针。即在下列a设置为null时,仅将a存的指针消除而已,不会影响b调用函数。
var a = b = function(value1){
return value1;
}
a = null;
b(1);
函数的重载
函数本身是没有重载的,因为在JavaScript中,函数可接收任意个参数,故不会因参数数量不同而发生函数重载。但可以通过特殊的写法实现函数重载。
思路:利用函数内部属性arguments.length去判断,进行传入不同参数的不同处理,从而实现函数的重载。
函数声明与函数表达式的区别
解析器对这两种定义函数方法的解析是不一样的。解析器会将函数声明的函数优先解析,使其在代码执行前可用(函数声明提前)。而函数表达式会在执行到该行代码才会被解析。(解析方式不同)
闭包
函数内部属性
1.arguments:包含函数所有参数的伪数组。其arguments.callee属性指向含有该arguments对象的函数。该属性可用于递归函数的函数调用。
function factorial(num){
if(num<=1){
return 1;
}else{
return num*arguments.callee(num-1);
}
}
2.this:函数执行的环境变量。
3.caller:调用当前函数的函数引用。
函数的属性和方法
1.length:该属性指定义函数时,需要传入参数的个数。使用为:函数名.length;
2.prototype:原型函数。
3.apply和call:方法均改变调用函数的环境对象,简而言之就是改变函数的this值。两者除了传入参数的方式不同外,没有什么区别。apply在传参时,可传入数组或伪数组arguments,call是将参数依次列出传入函数的,具体看以下语法。
apply(环境对象,[value1,…])或apply(环境对象,arguments)。
call(环境对象,value1,value2…)
4.bind() :创建一个函数实例,其this值会被绑定到传给bind()函数的值。
⑦Array类型
Array类型是除了Object类型之外最常用的类型,因此必须要掌握它的方法
1.创建数组
var arr = new Array(); // 空数组
var arr = new Array(5); // 数组的长度为5
var arr = new Array(2, 1, 3, 5, 4);
===
也可以省略new关键字
var arr = Array();
var arr = Array(5);
var arr = Array(2,1,3,5,4);
二维数组的创建
2.使用字面量
var arr = []; // 空数组
var arr = [2, 1, 3, 5, 4];
3.检测数组
instanceof
if (value instanceof Array) {
// 对数组执行某些操作
}
isArray()
if (Array.isArray(value)) {
// 对数组执行某些操作
}
⑧Object类型**
第一种是使用new操作符后跟Object构造函数,如下:
var person = new Object(); //创建Object引用类型的一个新实例,并且把该实例保存在变量person中。
person.name = "CC";
person.age = 23;
第二种方法是使用对象字面量表达式,对象字面量是对象定义的一种简写形式,目的在于简化创建包含大量属性的对象的过程。
var person = {
name : "CC",
age : 23
};