JavaScript 基础知识整理

来源:互联网 发布:程序员成长电影 编辑:程序博客网 时间:2024/06/04 14:36

for….of 循环遍历集合,它只循环集合本身的元素
for….in循环,它遍历的实际上是对象的属性名称。一个Array 数组实际上也是一个对象那个,它的每个元素的索引都被视为一个属性。
更好的方式是直接使用iterable内置的forEach 方法,它接收一个函数,每次迭代就自动回调该函数。

请注意:函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回。因此,函数内部通过条件判断和循环可以实现非常复杂的逻辑。

javaScript 关键字arguments,它只在函数内部起作用,并且永远指向当前函数的调用者传入的所有参数。

JavaScript 的函数可以嵌套,此时内部函数可以访问外部函数定义的变量,反过来则不行。
JavaScript 的函数在查找变量时从自身函数定义开始,从内向外查找,如果内部函数定义了与外部函数重名的变量,则内部函数的变量将‘屏蔽’外部函数的变量。

变量提升
JavaScript 的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量提升到函数顶部。
‘use strict’;

function foo() {
var x = ‘Hello, ’ + y;
alert(x);
var y = ‘Bob’;
}

foo();虽然是strict模式,但语句var x = ‘hello’ +y;并不报错,原因是变量y在稍后申明了,但是alert显示hello,undefined,说明变量y 的值为undefined。这正是因为JavaScript引擎自动提升了变量y的声明,但不会提升变量y 的赋值。
由于JavaScript的这一怪异的“特性”,我们在函数内部定义变量时,请严格遵守“在函数内部首先申明所有变量”这一规则。最常见的做法是用一个var申明函数内部用到的所有变量。
全局作用域
不在任何函数内定义的变量就具有全局作用域,实际上,JavaScript默认有一个全局对象window,全局作用域的变量实际上被绑定到window的一个属性。
以变量方式var foo = function(){}定义的函数实际上也是一个全局变量。顶层函数的定义也被视为全局变量,并绑定到window对象。
JavaScript实际上只有一个全局作用域。任何变量(函数也视为变量),如果没有在当前函数作用域中找到,就会继续往上查找,最后如果在全局作用域中也没有找到,则报ReferenceError错误。
名字空间:全局变量会绑定到window上,不同的JavaScript文件如果使用了相同的全局变量,或者定义了相同名字的顶层函数,都会造成命名冲突,并且很难被发现。减少冲突的一个方法是把自己的所有变量和函数全部绑定到一个全局变量中。
局部作用域:由于JavaScript的变量作用域实际上是函数内部,我们在for循环等语句块中是无法定义具有局部作用域的变量的。
为了解决块级作用域,ES6引入了新的关键字let,用let替代var 可以神马一个块级作用域的变量

常量:
由于var和let声明的是变量,如果要声明一个常量,在ES6之前是不行的,我们通常用全部大写的变量来表示:“这是一个常量,不要修改它的值”:新的关键字:const来定义常量,const和let 都具有块级作用域

方法:
在一个对象中绑定函数,称为这个对象的方法
在一个方法内部,this是一个特殊变量,它始终指向当前对象。

JavaScript的函数内部如果调用了this,那么这个this指向谁视情况而定。
ECMA决定,在strict模式下让函数的this指向undefined,因此,在strict模式下,你会得到一个错误:

JSON
反序列化–拿到一个json格式的字符串,直接用JSON.parse()把它变成一个JavaScript 对象 .JSON,parse()还可以接收一个函数,用来转换解析出的属性

RegExp
字符串是编程时涉及到的最多的一种数据结构。对字符串的操作的需求几乎无处不在。正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的
在正则表达式中,如果直接给出字符,就是精确匹配。
\d可以匹配一个数字
\w可以匹配一个字母或数字
\s可以匹配一个空格(也包括Tab等空白符),所以\s+表示至少有一个空格
.可以匹配任意字符
要匹配变长的字符,在正则表达式中,用*表示任意个字符(包括0 个)
+表示至少一个字符,
用?表示0个或1个字符
用{n}表示n个字符用{n,m}表示n-m个字符。
在正则表达式中,要用‘\’转义

要做更精确地匹配,可以用[]*表示范围*
[a-zA-Z_$][0-9a-zA-Z_$]*可以匹配由字母或下划线、线组成的字符串,也就是JavaScript允许的变量名;

A|B 可以匹配A或B
^表示行的开头 ,^\d 表示必须以数字开头
\d 表示必须以数字结尾

JavaSCript有两种方式创建一个正则表达式
第一种是直接通过/正则表达式/
第二种是通过new RegExp(‘正则表达式’)创建一个RegExp 对象。
注意。如果使用第二种写法,因为字符串的转义问题,字符串的两个\实际上是一个\。
RegExp 对象的test()方法用于测试给定的字符串是否符合条件。
切分字符串
分组 用()表示的就是提取的分组(Group)
^(\d{3})-(\d{3,8})$分别定义了两个组
直接从匹配的字符串中提取区号和本地号码
如果正则表达式中定义了组,就可以在RegExp对象上用exec()方法提取出子串来。exec()方法在匹配成功后,会返回一个Array,第一个元素是正则表达式匹配到的整个字符串,后面的字符串表示匹配成功的子串。
exec()方法在匹配失败时返回null。

全局搜索
JavaScript的正则表达式 还有几个特殊的标志 最常用的是g ,表示全局匹配
全局匹配可以多次执行exec()

贪婪匹配
正则表达式默认是贪婪匹配,也就是匹配尽可能多的字符。

0 0
原创粉丝点击