1、JS是一门什么语言?
- 是一门解释性的语言
- 是一门脚本语言
- 是一门弱类型语言,声明变量都用var
- 是一门基于对象的语言
- 是一门动态类型的语言:
- 1. 代码(变量)只有执行到这个位置的时候,才知道这个变量中到底存储的是什么,如果是对象,就有对象的属性和方法,如果是变量就是变量的作用
- 2. 对象没有什么,只要点了,通过点语法,那么就可以为对象添加属性或者方法
2、函数(方法):
函数定义:function 函数名(){
代码
}
函数调用:函数名();
注意:JS的函数没有Java的重载,一旦函数名重复,后面的会覆盖前面
函数参数:与Java不同的是JS的参数无需定义参数类型,只需要形参名
函数的返回值:
- 函数有没有返回值取决于函数体内有没有return;
- 如果函数有return,但是return后面没有任何内容,结果就是undefined
3、变量
如何获取某个变量的类型? typeof 变量
函数是有数据类型,数据类型:是function 类型的
4、作用域
全局变量:
- 声明的变量是使用var声明的,那么这个变量就是全局变量,全局变量可以在页面的任何位置使用
- 除了函数以外,其他的任何位置定义的变量都是全局变量
- 全局变量,如果页面不关闭,那么就不会释放,就会占空间,消耗内存
局部变量:
- 在函数内部定义的变量,是局部变量,外面不能使用
* 全局作用域:全局变量的使用范围
* 局部作用域:局部变量的使用范围
* 块级作用域:一对大括号就可以看成是一块,在这块区域中定义的变量,只能在这个区域中使用,但是在js中在这个块级作用域中定义的变量,外面也能使用;
* 说明:js没有块级作用域,只有函数除外
隐式全局变量:
声明的变量没有var,就叫隐式全局变量
- 全局变量是不能被删除的,隐式全局变量是可以被删除的
- 定义变量使用var是不会被删除的,没有var是可以删除的
5、预解析:提前解析代码
* 预解析做什么事?
- 把变量的声明提前了(注意是声明,还没有赋值)----提前到当前所在的作用域的最上面
- 函数的声明也会被提前---提前到当前所在的作用域的最上面
1 // 函数调用的时候,把会函数的声明提升到作用域的上面 2 f1();//调用 3 var num=20;//这个变量的声明会提升到变量使用之前 4 function f1() { 5 console.log(num);//undefined 6 //var num=10; 7 } 8 9 // 上面这段代码其实就是这样: 10 var num; 11 function f1() { 12 console.log(num);//undefined 13 //var num=10; 14 } 15 num = 20; 16 // 所以是undefined
- 预解析中,变量的提升,只会在当前的作用域中提升,提前到当前的作用域的最上面
- 函数中的变量只会提前到函数的作用域中的最前面,不会出去
- 预解析会分段(多对的script标签中函数重名,预解析的时候不会冲突)
6、JS—基于对象的语言
js不是面向对象的语言,但是可以模拟面向对象的思想。js是一门基于对象的语言。这里的对象也可以理解为Java的对象。
js创建对象的方式1:
1 //实例化对象
2 var obj = new Object();
3 //对象有特征---属性和行为---方法
4 //添加属性-----如何添加属性? 对象.名字=值;
5 obj.name = "小苏";
6 obj.age = 38;
7 obj.sex = "女";
8 //添加方法----如何添加方法? 对象.名字=函数;
9 obj.eat = function () {
10 console.log("我喜欢吃油炸榴莲凉拌臭豆腐和大蒜");
11 };
12 obj.play = function () {
13 console.log("我喜欢玩飞机模型");
14 };
15 obj.cook = function () {
16 console.log("切菜");
17 };
18 console.log(obj.name);//获取--输出
19 obj.eat();//方法的
js创建对象的方式2(工厂模式):
1 //工厂模式创建对象
2 function createObject(name,age) {
3 var obj = new Object();//创建对象
4 //添加属性
5 obj.name = name;
6 obj.age = age;
7 //添加方法
8 obj.sayHi = function () {
9 console.log("阿涅哈斯诶呦,我叫:" + this.name + "我今年:" + this.age);
10 };
11 return obj;
12 }
13 //创建人的对象
14 var per1 = createObject("小芳",20);
15 per1.sayHi();
16 //创建一个人的对象
17 var per2 = createObject("小红",30);
18 per2.sayHi();
js创建对象的方式3(自定义构造函数):
1 //自定义构造函数创建对象,我要自己定义一个构造函数,自定义构造函数,创建对象 2 //函数和构造函数的区别;名字是不是大写(首字母是大写) 3 function Person(name,age) { 4 this.name=name; 5 this.age=age; 6 this.sayHi=function () { 7 console.log("我叫:"+this.name+",年龄是:"+this.age); 8 }; 9 } 10 11 //自定义构造函数创建对象:先自定义一个构造函数,创建对象 12 var obj=new Person("小明",10); 13 console.log(obj.name); 14 console.log(obj.age); 15 obj.sayHi(); 16 17 var obj2=new Person("小红",20); 18 console.log(obj2.name); 19 console.log(obj2.age); 20 obj2.sayHi();
js创建对象的方式4(字面量方式):缺点是一次性的对象
1 var obj={}; 2 obj.name="小白"; 3 obj.age=10; 4 obj.sayHi=function () { 5 console.log("我是:"+this.name); //我是:小白 6 }; 7 obj.sayHi(); 8 9 //优化的第二种写法 10 var obj2={ 11 name:"小明", 12 age:20, 13 sayHi:function () { 14 console.log("我是:"+this.name); //我是:小明 15 }, 16 eat:function () { 17 console.log("吃了"); 18 } 19 }; 20 obj2.sayHi(); 21 obj2.eat();
7、JS的数据类型
原始数据类型:number,string,boolean,undefined, null,object
基本类型(简单类型),值类型:number,string,boolean
复杂类型(引用类型):object
空类型:undefined,null
值类型的值在哪一块空间中存储? 栈中存储
引用类型的值在哪一块空间中存储? 对象在堆上存储,地址在栈上存储
var num=10; //值类型,值在栈上
var obj={}; //复杂类型,对象在堆,地址(引用)在栈
值类型之间传递,传递的是值
引用类型之间传递,传递的是地址(引用)
值类型作为函数的参数,传递的是值
引用类型作为函数的参数,传递的是地址
8、JS的三种对象
- 内置对象----js系统自带的对象
- 自定义对象---自己定义的构造函数创建的对象
- 浏览器对象---BOM的时候讲
instanceof :验证变量是不是对象