今天好像是情人节?因此最适合面向对象,JavaScript 也有对象,咱们也能够随时面向对象,方便得很,那怎样才有对象呢?下面告诉你!python
数组,字面意思就是一堆数的组合,可是它是有顺序的,学了数组就不只能够存储一个数据,还能够存储一堆数据,这就是咱们为何学了简单数据类型以后还要学数组的缘由。数组
能够看到,数组里面的定义和 python 里的差很少,也能够存储不一样数据类型。获取数组元素也是同样经过下标获取,下标从 0 开始,并且 JavaScript 的数组能够随意根据下标进行赋值,无论你的数组长度,由于 JavaScript 的数组长度是动态的。闭包
遍历数组,根据数组长度能够轻易知道循环次数,因此可使用 for 循环,获取数组的长度能够经过 length 属性进行获取。函数
这里有个提升效率的地方,就是在获取数组的长度时放在了 for 语句的初始化表达式里,而不是放在判断表达式里,当你这个值须要运算才能得到的时候,这样作就能够不用在每次判断时都须要经过运算得到,减小运算,也就提升效率了,固然,数组的长度在这里只是一个属性,不须要运算,放不放在初始化表达式都差很少。源码分析
JavaScript 这里清空数组简单粗暴,直接将长度赋值为 0 便可。this
找出数组中最大的值3d
这个直接经过遍历数组,而后将每一个值进行比较便可,很容易。cdn
翻转数组对象
这个就是将数组中的元素先后互相替换,也很少说了。blog
当咱们须要在对多个数组进行上面的其中练习之一,好比进行寻找最大值,咱们总不能每一个数组都各自写一段寻找最大值的代码,不然这样子的话代码的复用性过低了。
函数的出现就是解决这个问题的,函数就是把一段相对独立的具备特定功能的代码抽取出来进行封装,造成一个独立的个体。当须要屡次使用的时候,咱们只须要使用函数名调用便可。
函数定义这里有两种方法,以下:
使用函数声明,语法为
使用函数表达式,语法为:
上面只是函数的定义而已,并不会去执行,只有你调用函数的时候才会去执行。
调用函数的语法也比较简单,就是函数加上一个括号就好了。
因此当须要屡次使用这段功能的时候,就屡次调用便可,不须要每次都写一段相同的代码。
不须要屡次写同一段代码解决了,可是当有不一样的数据内容参与运算时,好像我还须要重复写呀!就好比前面说的求数组最大值。这个时候就须要咱们的函数参数了,函数参数就是解决这个不肯定的数据内容的。当咱们须要对不肯定数据内容进行操做时,只须要在调用函数的时候把数据内容看成参数传进去便可。
函数的参数定义与调用语法:
形参:在声明函数时,有些值是固定的,而有些值不是固定的,对于这些不固定的值,咱们能够给它们设置参数,可是这个参数不是具体的值,只是一个形式而已,因此叫作形参
实参:在函数声明设置的形参,咱们调用函数就须要传入对应的参数,而这个参数就是实参。
了解了这个以后,是否是很容易就能够写出一个求数组最大值的函数了?
咦?上面的我都看明白了,可是 return 那个语句又是什么?return 后面跟的内容就是函数的返回值,当函数运行到这里的时候就会结束函数而且把该值返回给调用处,就相对于一段代码执行以后的反馈。因此 return 语句也会经常用于终止函数的运行,还有也能够不写 return 语句,可是会默认返回 undefined
JavaScript 中,函数的内部都有一个 arguments 对象,用来记录在调用函数时所传进来的参数,能够说是一个伪数组。
这个对象能够用于当咱们须要传进来的参数个数不肯定时就可使用这个,就好比求一堆数的和。
匿名函数就是没有名字的函数,当咱们只须要只须要调用一次的话就可使用匿名函数,或者须要回调函数的时候就会使用匿名函数,至于什么是回调函数,之后遇到了就说,匿名函数声明以下:
这是将匿名函数赋值给一变量,而后能够经过该变量进行调用,也能够传参的,除了这样子调用匿名函数,匿名函数还能够进行自调用。
这里须要注意的是在自调用的时候别忘了定义函数的部分须要加括号括起来。这自调用的匿名函数就经常使用于防止全局被污染,就是当你写的代码量大了,不免会有些全局变量会有重名的可能,这时候使用匿名函数自调用就能够新开辟了一个做用域,不一样做用域的变量就算同名也不怕了,至于具体的后面我也会应用到,到时再详讲。
函数也是一种数据类型,能够说是一个对象吧,至于具体的后面再详讲,如今了解就好。
函数不只能够做为参数进行传递,还能够做为返回值,毕竟函数也是一种数据类型。做为参数传递主要就是咱们所说的回调函数,遇到就会说,做为返回值的应用,闭包就是一个应用,也很少说,之后会讲。
做用域就是变量能够起做用的范围,在 JavaScript 中定义的变量符合词法做用域,就是说变量的做用域是在定义时决定的,不是在执行时决定的,即变量做用域只须要经过源码分析就知道了。
1. JavaScript 中 词法做用域的规则为:
函数内部的变量容许访问函数外部的。
整个代码结构只能函数限定做用域,这就是为何上文说使用自调用函数来开辟新的做用域的缘由了。
做用域规则首先使用提高规则分析,下文说的预解析就是这个
若是当前做用域有该变量了,就不会考虑外面的了。
2. 下面再看看 JavaScript 中三种做用域
全局做用域:JavaScript 中认为在函数外部定义的变量就是全局变量,而这个全局变量所在的做用域就是全局做用域。
局部做用域:在函数内部就是局部做用域,在这里定义的内部变量也就是局部变量。
块级做用域:这个是 ES6 才有的,简单说下,就是只使用一对大括号{} 括起来的就是块级做用域。
3. 做用域链
只有函数才能够限定做用域,那么在要有代码,这里就至少存在一个全局做用域,而写代码不免又会有函数,这里的函数就会构成另外一个做用域,若是函数中还有函数,则他还会构成一个新的做用域,等等。将上面的这些做用域列出来,就会造成一个结构,这个结构就是做用域链。以下面代码:
按照全局做用域就是 0 级链,函数就是 1 级链,函数的函数就是 2级链,就会有下图:
JavaScript 的解释器在执行代码的时候有两个过程,就是预解析和再从上往下执行代码过程。预解析就是先把代码中的变量提高,而后函数提高,接着再执行代码。
变量提高:变量的声明会被提高到做用域的最上面,注不会将赋值提高。
函数提高:把当前做用域的函数声明提高到当前做用域的最上面。
若是你懂了再看看下面几段代码会不会报错?
1.
解答:不会报错,由于通过预解析后代码成这样
2.
解答:也不会报错,不过 a 打印的值为 undefined
3.
解答:会报错,缘由能够结合上下两张图看便可。
对象是一个具体的事物,好比你和我都是对象,可是汽车和手机不是事物,能够说它们是一个类别。
JavaScript 中的对象能够说是一个无序的属性的集合,属性能够包括基本值、对象或函数,也能够把 JavaScript 中的对象想像为一组键值对。
把现实中的事物抽象为代码中的对象,其的特征能够做为对象的属性,其的行为能够做为方法。
JavaScript 中建立对象的方法有四种,并不像其余语言中只能经过 new 来建立。
直接声明一个键值对的集合
这个 obj 变量就是一个对象了里面有两个属性和一个方法。使用这种方法也只适合建立一个类,由于当须要建立大量同类型的对象时,使用这个方法就须要写大量的方法。
使用 new Object() 建立
这个是先建立一个空对象,而后动态增长对象的属性和方法,也是只适合建立只有一个对象的类型,还不如第一种,也不推荐。
使用工厂模式建立
这种方法就是使用一个模板函数,就至关于一个工厂,还有记得返回建立的对象。当须要建立对象的时候只须要调用一下函数传参就能够了,就比上面两种代码的复用性提升了。
可是这有一个问题,咱们在判断对象类型的时候,结果都是 Object
判断对象类型使用 instanceof,而使用 typeof 判断对象,不管什么对象的结果都是 Object
自定义构造函数来建立
这个自定义构造函数名字须要首字母大写,固然这只是个规范而已。
里面使用了 this 关键字,这个 this 的指向就是使用构造函数建立的对象,也不须要返回 对象了。
注意:建立对象也须要使用 new 关键字,如上图,经过这种方法就既能够建立大量同类型的对象,也能够判断所属类型,很是方便。
这个 new 建立对象的过程为:
在内存中先建立一个空的对象
让构造函数的 this 指向刚刚建立的对象
执行构造函数内部的属性和方法定义
返回当前对象
访问属性语法为对象.属性,还能够 对象['属性名'] 这样, 固然也能够经过这两个来修改对象属性的值
固然,当对一个不存在的属性访问的时候就会返回 undefined,如果修改一个不存在的属性就是向该对象动态增长一个新的属性。
这两种方法推荐第二种,由于有时咱们获得的属性是一个变量名,并不知道具体的名字,这时候就只能使用第二种方法
访问方法直接使用 对象.函数名() 便可
遍历对象成员
可使用 for...in... 语句
删除对象成员
使用 delete 关键字
基本类型又叫作值类型,复杂类型又叫作引用类型
值类型:简单数据类型,基本数据类型,在存储时,变量中存储的是值自己,所以叫作值类型。
引用类型:复杂数据类型,在存储时,变量中存储的仅仅是地址(引用),所以叫作引用数据类型。
终于写完了,下一篇经常使用内置对象走起。