JS基础入门 5.0

82 阅读8分钟

一、对象

对象(Object)

对象的分类:①内建对象:由ES标准中定义的对象,在任何的ES的实现中都可以使用

比如:Math String Number Boolean Function Object...

②宿主对象:由JS的运行环境提供的对象,目前来讲主要指由浏览器提供的对象

比如:BOM DOM

③自定义对象:由开发人员自己创建的对象

创建对象:使用new关键字调用的函数,是构造函数constructor 构造函数是专门用来创建对象的函数

使用typeof检查一个对象时,会返回Object

如:var obj = new Object();

在对象中保留的值称为属性

①向对象中添加属性 语法:对象.属性名 = 属性值; 例:ovj.name = "张三";

读取对象中的属性 语法:对象.属性名; 例:console.log(obj.name);

注意:如果读取对象中没有的属性,不会报错而是会返回undefined

修改对象中的属性 语法:对象.属性名 = 新值; 例:obj.name = "李四";

删除对象中的属性 语法:delete 对象.属性名; 例:delete obj.name;


二、属性名和属性值

1、属性名

使用特殊的属性名,不能用 . 的方式来操作,要用另一种方式

语法:对象["属性名"] = 属性值;

例:obj["123"] = 789;

//变量值是什么就会读取哪个属性

var n = "123";

//在读取时也要同样要用这个方式读取

console.log(obj[n]);

2、属性值

属性值可以是任意数据类型,甚至可以是一个对象

//创建一个对象
var obj = new Object();
obj.name = "张三";
obj.test = true;
obj.test = null;

var obj2 = new Object();
obj2.name = "李四";
//将obj2设置为obj的属性值
obj.test = obj2;

3、in运算符

in运算符可以检查一个对象是否含有指定的属性,有返回true,否则返回false

语法:"属性名" in 对象 例:console.log("test2" in obj);


三、基本数据类型和引用数据类型

基本数据类型:String Number Boolean Null Undefined
引用数据类型:Object
JS中的变量都是保存在栈空间中的

①基本数据类型是直接在栈空间中存储,值与值之间独立存在。

var a = 123;

var b = a;

a++;

console.log("a = " + a);//124

console.log("b = " + b);//123

修改一个变量不会影响另一个变量

var obj = new Object();
obj.name = "张三";

var obj2 = obj;

//修改obj的name属性
obj.name = "李四";

console.log(obj.name);//李四
console.log(obj2.name);//李四

//设置obj2为null
obj2 = null;

//修改obj2的值obj不会产生影响
console.log(obj);//李四
console.log(obj2);//null

②对象是保存到堆内存中的,每创建一个新的对象,就会在内存中开辟一个新的空间,
而变量保存的是对象的内存地址

//每new一次就要在堆内存中开辟一个新的空间 地址值就不一样

var obj3 = new Object();

var obj4 = new Object();

obj3.name = "王五";

obj4.name = "王五";

两个基本数据类型比较的是,而引用数据类型比较的是地址值。两个对象一样,但地址值不同,返回false


四、对象字面量

使用对象字面量创建一个对象:var obj = {};

语法:{属性名:属性值, 属性名:属性值...}

名和值之间使用 : 连接,多个名值对之间使用 , 隔开

如果一个属性之后没有其他的属性了,就不要写,

var obj2 = {

name: "猪八戒",

age: 18,

gender: "男",

test: { name: "沙和尚" }

};


五、函数

①函数也是对象,可以封装一些功能(代码)

②使用typeof检查函数对象时,会返回function

构造函数:以字符串的形式传递给构造函数

var fun = new function("console.log('hello');");
//封装到函数中的代码不会立即执行
//函数中的代码会在函数调用的时候执行
//调用函数 语法:函数对象()
//当调用函数时,函数中封装的代码会按照顺序执行
fun();

函数声明function 函数名([形参1, 形参2...]){语句...} []:可写可不写

函数表达式var 函数名 = function([形参1, 形参2...]){语句...};这里的函数表达式最后要加分号,这也是一个匿名函数


六、函数的参数

 /*
  定义一个用来求两个和的函数
  可以在函数的()中来指定一个或多个形参(形式参数)
  多个形参之间使用,隔开,声明形参就相当于在函数内部声明了对应的变量
  但是并不赋值
*/

function sum(a, b) {
     console.log("a = " + a);
     console.log("b = " + b);
     console.log(a + b);
   }

//在调用函数时,可以在()中指定实参(实际参数)
//实参会赋值给函数中对应的形参
sum(1, 3);
sum(123, 456);

//调用函数时解析器不会检查实参的类型
//所以要注意,是否有可能会收到非法的参数,如果有可能则需要对参数进行类型的检查
//函数的实参可以是任意的数据类型
sum(123, "Hello");//123Hello
sum(true, false);//1

//调用函数时,解析器不会检查实参的数量
//多余的实参不会被赋值
//如果实参的数量少于形参的数量,则没有对应实参的形参是undefined
sum(123, 456, "Hello", true);
sum(123);

七、返回值

可以使用return 来设置函数的返回值。

语法:return 值;

①return后的值将会作为函数执行结果返回,可以定义一个变量来接收该结果

②在函数中return以后的语句都不会执行

③如果return语句后不跟任何值就相当于返回一个undefined,如果函数中不写return,则也会返回undefined

④return后可以跟任意类型值

//创建一个函数,用来计算三个数的和

function sum(a, b, c) {
    var d = a + b + c;

      return d;
    }

//调用函数
//变量result的值就是函数执行结果
//函数返回什么result的值就是什么
var result = sum(1, 2, 3);

console.log(result);//返回结果为6

实参可以是任何数值类型(包括对象、函数)

//创建一个函数 使其在控制台输出一个人的信息
function sayHello(o){
  console.log("我叫" + o.name + ",我今年" + o.age + "岁了,我的性别是" + o.gender);
}

//创建一个对象
var obj = {
  name:"张三",
  age:18,
  gender:"男";
};

//将对象作为一个参数传给sayHello()
sayHello(obj);

/*
 sayHello()  这样调用函数相当于使用函数的返回值
 sayHello		 这样的话相当于直接使用函数对象
*/

返回值也可以是任意数据类型(包括对象、函数)

  • ✅break——结束当前循环
  • ✅continue——结束本次循环
  • ✅return——结束整个循环

八、立即执行函数

函数执行完,立即被调用,这种函数叫做立即执行函数,立即执行函数往往只会执行一次。

用法:(function(a, b){

console.log("a + b =" + (a + b));

};)(1, 2);


九、对象方法

函数也可以作为对象的属性保存

//如果函数作为一个对象的属性保存 那么我们称这个函数是这个对象的方法
var obj = {
  name: "张三",
  age:18,
  gender:"男",
  sayHello:function(){}
};

//当函数作为对象的属性保存时 那么我们调用的时候就称调用这个对象的方法
obj.sayHello();

对象的属性值可以是任何的数据类型

var obj = {name:"张三"}
//将函数作为对象的属性保存
obj.sayHello = function(){console.log(obj.name);};

枚举对象中的属性

<script>
  var obj = {
            name: "张三",
            age: 18,
            gender: "男"
        };

        //枚举对象中的属性
        //使用for ... in 语句
        /*
         语法:
          for(var 变量 in 对象){
         
          }
         
          for...in 语句对象中有几个属性,循环体就会执行几次
              每次执行时,会将对象中的属性赋值给变量
         */

        for (var n in obj) {
            console.log("属性名:" + n);

            console.log("属性值:" + obj[n]);
        }
 
 </script>

十、作用域

(一)全局作用域

①直接编写在script标签中的JS代码,都在全局作用域

②全局作用域在页面打开时创建,页面关闭时销毁

③全局对象window代表一个浏览器窗口,可直接使用

④创建的变量都会作为window对象的属性保存;创建的函数都会作为window对象的方法保存

⑤全局作用域中变量是全局变量,页面任意部分都可以访问

//这里的a变量会作为window对象的属性保存,因此window可以直接使用
var a = 10; 
console.log(window.a);

//这里的函数会作为window对象的方法保存,因此window可以直接调用
function fun(){
  console.log("fun函数");
}
window.fun();

(二)变量声明提前

①使用var关键字声明的变量,会在所有的代码执行之前被声明(但不会赋值),不使用var关键字则不会声明提前

②使用函数声明形式创建的函数会在所有代码执行之前被创建,所以可以在函数声明前调用函数

function fun(){}

③使用函数表达式的函数不会提前声明,所以不能提前调用

var fun = function(){};

(三)函数作用域

①调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁

②每调用一次函数就会创建一个函数作用域,他们之间是互相独立的

③在函数作用域中可以访问到全局作用域的变量, 在全局作用域中无法访问到函数作用域的变量

④当在函数作用域操作一个变量时,它会先在自身作用域中寻找,如果有就直接使用

如果没有则向上一级作用域中寻找,直到找到全局作用域,

如果全局作用域中依然没有找到,则会报错ReferenceError

⑤在函数中要访问全局变量可以使用window对象

⑥在函数中不使用var声明的变量都会变成全局变量

//使用var关键字声明的变量,会在函数中所有的代码执行之前被声明
//函数声明也会在函数中所有的代码执行之前执行
function fun() {
        fun2();

        var a;
        conole.log(a);//undefined
  
        a = 35;
        function fun2() {
            alert("Hello");
        }
}
fun();

//定义形参就相当于在函数作用域中声明了变量
function fun3(e) {
       var e;
       alert(e);
}
fun3();