1.变量 :内存中存储数据的空间(程序中临时存储数据,都存放在变量中)
2.变量的命名规则:
(1).必须以字母(严格区分大小写)、下划线或美元符号开头,后面可以跟字母、下划线、美元符号和数字
如:1、one ;2、$one;3、_one
(2).严格区分大小写。A和a是两个不同的变量
(3).不允许使用JavaScript中的关键字和保留字
(关键字: break、else、new、var、case、finally、return、void 、catch、for 、switch、while、continue、function、this、with 、default、if、throw、delete、 in 、try 、do 、instranceof、typeof;保留字: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)
(4).不能包含特殊符号,一般起有意义的名字,见名知意
3.变量的声明与赋值;
声明:给变量起一个名字(在内存中为变量开辟存储空间)
定义:给变量分配一个保存空间
赋值(初始化):将等号右侧的值存储到左边的变量中;
4.变量的声明:
var a;
a=4-1;
console.log(a); //定义变量不用立即赋值
var a=3;
var b=4;
var c=5;
等同于: var a=3,b=4,c=5 //可以同时声明多个变量
var a=3;
a=5;
function(){
a=16;
}
alert(a); //同一变量可以多次声明,但是意义不同
总结:
(1).使用var多次声明同一个变量,是合法的,不会因此语法的错误;重复的声明并初始化变量值,只是相当于普通的赋值语句。
(2).读取一个未声明的变量值,js会产生一个错误。
(3).尝试给一个未经var 声明的变量赋值,js会隐式声明该变量,隐式声明的变量被创建为全局变量。
(4).无论是全局变量还是局部变量,最好都使用var进行声明。
5.变量的作用域-全局变量和局部变量
全局(global)变量的作用域是全局的,即在js代码中处处有定义。
局部(local)变量的作用域是局部性的,只在特定的范围内,比如函数内部定义的变量,函数的参数变量,这些变量的作用范围是局限在函数的内部的。
(1).声明全局变量可以不适用var 关键字,局部变量则必须使用var关键字来声明,为了避免不必要的麻烦,养成所有的变量都使用var关键字来声明。
(2).变量的定义没有块级作用域 –在函数中声明的所有的变量,无论是在哪里声明的(只要是在函数内部),在整个的函数中都是有声明的
6.未定义的变量和未赋值的变量
未定义的变量:指没有声明并且没有初始化的变量,尝试读取这种变量会产生一个错误。注: 这里要区分开没有声明但初始化了的变量,这种变量不会引起错误,程序会在全局变量中隐式的声明该类变量。
未赋值的变量:指已经声明但没有初始化的变量,尝试读取该类变量将得到一个默认值undefined.
7.var声明的变量是不可配置的,无法用delete运算符删除(在严格模式下会报错)
var num1=1;
(function num(){
var num2=2;
delete num2;
console.log(num2); // 2
})();
delete num1;
console.log(num1);// 1
8.省略var初始化变量会是一个全局变量
(function num(){
a=1;
console.log(a);// 1
})();
console.log(1);//1
9.变量的声明提升:JS在执行的时候,会把所有变量的声明都提升到当前作用域的最前面。
声明提升,这步操作是在JS引擎“预编译”阶段实现的,是在代码开始运行之前。
var a=1;
(function num(){
var a=2;
console.log(a);// 2
})();
var a=1;
(function num(){
console.log(a);//undefine
var a=2;
})();
var a=1;
(function(){
var a;
console.log(a);
a=2;
})();
10.基本类型和引用类型
基本类型:number,string,undefine,null,boolean;按值访问
引用类型:object
对于基本类型值,在复制变量的时候,会在新的变量上创建一个新值,这个新值是原值的一个副本,它们相互独立。基本类型值之间的比较,只是单纯的值的比较。
引用类型值是保存在变量中的对象;引用类型值就是指对象。
保存引用类型值的变量,实际上保存的是一个指向该对象的指针。
当复制保存着对象的某个变量时,复制的其实是指针;复制操作结束后,两个变量指向同一个对象。
对于引用类型值,可以为其添加属性和方法,也可以修改或者删除其属性和方法。
var person={
name: "A"
}
var person1=person;
console.log(person1.name);// A
person.name="B";
console.log(person1.name);// B
引用类型值的比较并非值的比较:即使两个对象包含相同的属性和值,它们也是不相等的;各个索引元素完全相等的两个数组也不相等。
引用类型值的比较是引用的比较,当且仅当它们引用同一个对象时,它们才
var person1 = {
name : “CC”
};
var person2 = {
name : “CC”
};
console.log(person1==person2); //false
var person1 = {
name : “CC”
};
var person2 = person1;
console.log(person1 == person2); //true
“`
11.类型检测:
typeof操作符,检测一个变量是不是基本数据类型;具体而言,typeof操作符是确定一个变量是不是字符串、布尔值、数字、undefined的最佳工具;如果变量的值是一个函数,则会返回function;如果变量的值是null或者是一个其它的对象,则会返回object。
instanceof操作符,如果一个变量是给定的某一个引用类型的实例,则会返回true。(instanceof操作符的本质,在于确定左边的操作数的原型链上是否有右边的操作数的prototype属性)