DAY12数组、函数, 预解析,对象,错误

1数组定义

所谓数组,就是将多个元素(通常是同一类型)按一定顺序排列放到一个集合中,那么这个集合我们就称之为数组。

数组是一个有序的列表,可以在数组中存放任意的数据,并且数组的长度可以动态的调整。

2 创建数组

// 创建一个空数组
var arr1 = []; 
// 创建一个包含3个数值的数组,多个数组项以逗号隔开
var arr2 = [1, 3, 4]; 
// 创建一个包含2个字符串的数组
var arr3 = ['a', 'c']; 

// 可以通过数组的length属性获取数组的长度
console.log(arr3.length);
// 可以设置length属性改变数组中元素的个数
arr3.length = 0;

3遍历数组

for(var i = 0; i < arr.length; i++) {
    // 数组遍历的固定结构
}

4案例

求一组数中的所有数的和 和平均值

 var sum1 = 0;
  for (var i = 0; i < arrNum.length; i++) {
    sum1 += arrNum[i];
  }
  console.log(sum1);//338
  // 平均值
  var abg = sum1 / arrNum.length;
  console.log(abg.toFixed(2));

翻转数组

 var newArr2 = [];
  for (var i = arrNum.length - 1; i >= 0; i--) {
    console.log(arrNum[i]);
    newArr2.push(arrNum[i]);
  }
  console.log(newArr2);

 5函数

函数声明
function 函数名(){  // 函数体}
函数表达式
var fn = function() {  // 函数体}

6函数参数

形参和实参

1) 形式参数:在声明一个函数的时候,为了函数的功能更加灵活,有些值是固定不了的,对于这些固定不了的值。我们可以给函数设置参数。这个参数没有具体的值,仅仅起到一个占位置的作用,我们通常称之为形式参数,也叫形参。

2) 实际参数:如果函数在声明时,设置了形参,那么在函数调用的时候就需要传入对应的参数,我们把传入的参数叫做实际参数,也叫实参。

7函数案例

求圆的面积

function getArea(r){
      // 数学对象:Math
      console.log(Math);
      var area = Math.PI * r * r;
      console.log(area.toFixed(2));
    }
    getArea(10);

8函数返回值

当函数执行完的时候,并不是所有时候都要把结果打印。我们期望函数给我一些反馈(比如计算的结果返回进行后续的运算),这个时候可以让函数返回一些东西,也就是返回值。函数通过return返回一个返回值。

语法:

//声明一个带返回值的函数function 函数名(形参1, 形参2, 形参...){  //函数体  return 返回值;
}​//可以通过变量来接收这个返回值var 变量 = 函数名(实参1, 实参2, 实参3);

返回值总结:

1、如果函数没有显示的使用 return语句 ,那么函数有默认的返回值:undefined

2、如果函数使用 return语句,那么跟再return后面的值,就成了函数的返回值

3、如果函数使用 return语句,但是return后面没有任何值,那么函数的返回值也是:undefined

4、函数使用return语句后,这个函数会在执行完 return 语句之后停止并立即退出,也就是说return后面的所有其他代码都不会再执行。

推荐的做法是要么让函数始终都返回一个值,要么永远都不要

9  new

构造函数,是一种特殊的函数。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。

1.、构造函数用于创建一类对象,首字母要大写。

2.、构造函数要和new一起使用才有意义。

new在执行时会做三件事情:

1、new会在内存中创建一个新的空对象

2、new会让this指向这个新的对象

3、new会返回这个新对象

10this

函数内部的this几个特点:

1. 函数在定义的时候this是不确定的,只有在调用的时候才可以确定

2. 一般函数直接执行,内部this指向全局window

3. 函数作为一个对象的方法,被该对象所调用,那么this指向的是该对象

4. 构造函数中的this其实是一个隐式对象,类似一个初始化的模型,所有方法和属性都挂载到了这个隐式对象身上,后续通过new关键字来调用,从而实现实例化

预解析、对象、错误

1函数命名规则:

        由字母、数字、下划线、$符号组成,不能以数字开头
        2.不能是关键字和保留字,例如:for,while,this, name
        3.区分大小写

    规范
        1.函数名必须有意义
        2.遵守驼峰命名法
        3.建议不要用$作v

2函数覆盖问题

如果两个函数都是函数的声明,且函数名相同,那么后边的函数会覆盖前边的

function fn1() {
    console.log("函数声明");
  }
  function fn1() {
    console.log("我是第二个fn1");
  }
fn1();//我是第二个fn1

如果两个函数都是函数表达式,且函数名相同,函数的调用会调用最近的一个

  var fn2 = function () {
    console.log("第一个函数表达式fn2");
  } 
  fn2();//第一个函数表达式fn2
var fn2 = function () {
    console.log("我是第二个fn2表达式");
  }

3函数的内置对象

arguments数组中前几个元素是函数的参数

callee属性:函数的本身

callee.name:函数的名字

length属性:实参的个数

callee.length:形参的个数

4匿名函数

匿名函数:没有名字的函数
匿名函数如何使用?
匿名函数不能通过直接调用来执行,因此可以通过匿名函数的自调用的方式来执行
(function () {      alert(123);   })();

5函数是一种引用数据类型

因为函数也是一种类型,可以把函数作为参数传入

6预解析

JavaScript引擎在对JavaScript代码进行解释执行之前,会对JavaScript代码进行预解析,在预解析阶段,会将以关键字var和function开头的语句块提前进行处理。

1)函数提升

(1)、函数提升
func();
function func(){
    alert("Funciton has been called");
}
由于JavaScript的预解析机制,上面的代码就等效于:
function func(){
    alert("Funciton has been called");
}
func()

2)变量提升

alert(a);
var a = 1;
由于JavaScript的预解析机制,上面这段代码,alert出来的值是undefined,如果没有预解析,代码应该会直接报错a is not defined,而不是输出值,不是说要提前的吗?那不是应该alert出来1,为什么是undefined?
所以我们说的提升,是声明的提升。
那么再回过头看,上面的代码就等效于
var a; //这里是声明
alert(a);//变量声明之后并未有初始化和赋值操作,所以这里是 undefined

3)函数同名

func1();
function func1(){
    console.log('This is func1');
}
func1();
function func1(){
    console.log('This is last func1');
}
输出结果为
This is last func1
This is last func1
原因分析:由于预解析机制,func1的声明会被提升,提升之后的代码为
function func1(){
console.log('This is last func1');
}
func1();
func1();
同名的函数,后面的会覆盖前面的,所以两次输出结果都是This is last func1。

4)变量和函数同名

alert(foo);
function foo(){}
var foo = 2;
当出现变量声明和函数同名的时候,只会对函数声明进行提升,变量会被忽略。所以上面的代码的输出结果为
function foo(){}
我们还是来把预解析之后的代码展现出来:
function foo(){};
alert(foo);
foo = 2;
再来看一种
var num = 1;
function num () {
alert( num );
}
num();
代码执行结果为:
Uncaught TypeError: num is not a function
按照常规的书写顺序,同名的函数与变量,变量会覆盖函数
直接上预解析后的代码:
function num(){
alert(num);
}
var num = 1;
num();

5)预解析式分作用域的

提升原则是提升到变量运行的环境(作用域)中去。
function showMsg()
{
var msg = 'This is message';
}
alert(msg); // msg未定义
还是直接把预解析之后的代码写出来:
function showMsg()
{
var msg;
msg = 'This is message';
}
alert(msg); // msg未定义

6)函数表达式不会提升

func();
var func = function(){
    alert("我被提升了");
};
这里会直接报错,func is not a function,原因就是函数表达式,并不会被提升。只是简单地当做变量声明进行了处理,如下
var func;
func();
func = function(){
    alert("我被提升了");
}

7作用域

(1)、全局作用域

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

  或者是一个单独的 JS 文件中的。

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

  在全局作用域中有一个全局对象 window(代表的是一个浏览器的窗口,由浏览器创建),可以直接使用。

所有创建的变量都会作为 window 对象的属性保存。

(2)、局部作用域(函数作用域):

  在函数内部就是局部作用域,这个代码的名字只在函数的内部起作用

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

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

将这样的所有的作用域列出来,可以有一个结构: 函数内指向函数外的链式结构。就称作作用域链。

(3)、隐式全局变量

声明变量使用`var`, 如果不使用`var`声明的变量就是全局变量( 禁用 )

因为在任何代码结构中都可以使用该语法. 那么再代码维护的时候会有问题. 所以除非特殊原因不要这么用.

8对象

JavaScript中的对象其实就是生活中对象的一个抽象。

JavaScript的对象是无序属性的集合。

其属性可以包含基本值、对象或函数。对象就是一组没有顺序的值。我们可以把JavaScript中的对象想象成键值对,其中值可以是数据和函数。

                Class=”d1”

                Key = value

对象的行为和特征

    特征---属性

    行为---方法

Tips:

事物的特征在对象中用属性来表示。

事物的行为在对象中用方法来表示。

9创建对象

​
对象字面量
var o = {  name: 'zs',  age: 18,  sex: true,  sayHi: function () 
{    console.log(this.name);}

​}
​
new Object()创建对象
var person = new Object();  person.name = 'lisi';  person.age = 35;
  person.job = 'actor'; 

 person.sayHi = function(){  console.log('Hello,everyBody');}

​
工厂函数创建对象
function createPerson(name, age, job) {  var person = new Object();
  person.name = name;  



person.age = age;  person.job = job;  person.sayHi = function(){    console.log('Hello,everyBody');  }  return person;}
var p1 = createPerson('张三', 22, 'actor');
自定义构造函数
function Person(name,age,job){  this.name = name;  this.age = age;  this.job = job;  this.sayHi = function(){    console.log('Hello,everyBody');  }}var p1 = new Person('张三', 22, 'actor');

10 JavaScript 错误

  1. 、JavaScript try 和 catch

try 语句允许我们定义在执行时进行错误测试的代码块。

catch 语句允许我们定义当 try 代码块发生错误时,所执行的代码块。

JavaScript 语句 try 和 catch 是成对出现的。
    在下面的例子中,我们故意在 try 块的代码中写了一个错字。catch 块会捕捉到 try 块中的错误,并执行代码来处理它。

        2finally 语句

finally 语句不论之前的 try 和 catch 中是否产生异常都会执行该代码块。

                3Throw 语句:throw 语句允许我们创建自定义错误。

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值