JavaScript中数组定义使用中括号进行界定?

let声明变量和声明特性

  • 块级作用域:变量只在作用域里有效。(因为var声明的变量是添加在window中,所以可以在作用域外读取,而let声明的变量不会添加在window中,因此不能读取)

const声明常量和特点

  • 对于数组和对象的元素修改,不算做对常量做修改,不会报错。因为这个常量所指向的地址没有发生改变。

ES6允许按照一定模式从数组和对象中提取值,对变量进行赋值

ES6引入新的声明字符串的方式 [``]

  • 内容中可以直接出现换行符;
  • 可以直接进行变量的拼接
 
 
 
 
 
 
  • this是静态的,始终指向函数在声明时所在作用域下的this的值

  
 
 
 
 
 
 
 
 
 
 
 
ES6允许在大括号里面,直接写入变量和函数,作为对象的属性和方法。
 
 

  
 

  
  • 不能作为构造实例化对象
  • 箭头函数本身不绑定arguments参数,使用...rest参数代替(但如果箭头函数的 this如果指向普通函数,它的 argumens 继承于该普通函数)
  • 箭头函数不能变量提升,必须在声明之后调用
  • 普通函数有原型prototype属性,箭头函数没有原型属性
  • 箭头函数的简写:当形参有且仅有一个时,省略小括号;当代码体只有一句话时,可以省略花括号;此时,return必须省略,而且语句的执行结果就是函数的返回值。
  • 箭头函数适合与this无关的回调,比如定时器,数组的方法回调等
  • 箭头函数不适合与this有关的回调:事件回调,对象的方法

具有默认值的参数,一般位置要靠后(潜规则)

如果不传c这个参数,且不给c赋初始值,c就是NaN。

用于获取函数的实参,用来代替arguments

  • rest参数必须放在最后

扩展运算符能将【数组】转化为逗号分隔的【参数序列】

rest参数是将其放在函数声明的形参位置上,而扩展运算符是放在函数调用的实参上

将伪数组转为真正的数组

ES6引入了一种新的原始数据类型Symbol,表示独一无二的值,是一种类似于字符串的数据类型

  • Symbol的值是唯一的,用来解决命名冲突问题;
  • Symbol值不能与其他数据进行运算
  • Symbol定义的对象属性不能使用for…in循环遍历,但是可以使用Reflect.ownKeys来获取对象的所有键明

使用Symbol.for创建可以通过描述字符串得到唯一的symbol值

给对象添加属性和方法,表示独一无二的。

以下这种方法也可以,但是有一定的风险,我们不知道game对象中有没有up,有没有down;所以需要判断,就增加了复杂度

使用symbol:安全,高效

迭代器是一个接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署Iterator接口(js中Iterator接口其实就是对象的属性:symbol.iterator),都可以完成遍历操作。

  • symbol.iterator对应的函数创建一个指针对象,指向当前数据结构的起始位置
  • 第一次调用对象的next方法,指针自行指向数据结构的第一个成员
  • 接下来不断调用next方法,指针一直往后移动,直到指向最后一个成员
  • 每调用next方法返回一个包value和done属性的对象

生成器函数是ES6提供的一种异步编程解决方案,语法行为和传统函数不同
ES6之前:纯回调函数

  • 声明时需要加星号,星号在前,后,中间都可以,只要有就行
  • 不会直接输出结果,需要调用next函数
  • 在生成器函数中可以出现yield语句,yield相当于函数代码的分隔符
  • 生成器函数接受到的参数,如果里面有输出语句也必须使用next方法才能打印
  • next方法也能传参,而且这个参数将作为上一个yield语句的返回结果

Promise是ES6引入的异步编程的解决方案。语法上Promise是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果。

一个 Promise对象有以下三种状态:

  • pending: 初始状态,既不是成功,也不是失败状态。

Promise接受一个参数,该参数为一个函数类型的值,该函数有两个形参:resolve,reject。分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数;resolve是将Promise的状态置为fullfiled,reject是将Promise的状态置为rejected


 


传入的是一个匿名函数,因此会立即执行。所以我们用Promise的时候一般是包在一个函数中,在需要的时候去运行这个函数,如:

执行这个函数我们得到了一个Promise对象,这个对象上有then、catch方法。then 表示异步成功执行后的数据状态变为reslove ;catch 表示异步失败后执行的数据状态变为reject 。all表示把多个没有关系的Promise封装成一个Promise对象使用then返回一个数组数据

因此,.then里面的函数就跟我们平时的回调函数是一个意思,能够在runAsync这个异步任务执行完成之后被执行。

下面是回调函数的写法:

如果有多层回调,比如callback也是一个异步操作,而且执行完后也需要有相应的回调函数,这样就势必会造成回调地狱。

这样能够按顺序,每隔两秒输出每个异步回调中的内容,在runAsync2中传给resolve的数据,能在接下来的then方法中拿到。运行结果如下:
相对应的回调函数的写法:

reject的作用就是把Promise的状态置为rejected,这样我们在then中就能捕捉到,然后执行“失败”情况的回调

getNumber函数用来异步获取一个数字,2秒后执行完成,如果数字小于等于5,我们认为是“成功”了,调用resolve修改Promise的状态。否则我们认为是“失败”了,调用reject并传递一个参数,作为失败的原因。

它和then的第二个参数一样,用来指定reject的回调,用法是这样:

效果和写在then的第二个参数里面一样。不过它还有另外一个作用:在执行resolve的回调(也就是上面then中的第一个参数)时,如果抛出异常了(代码出错了),那么并不会报错卡死js,而是会进到这个catch方法中。请看下面的代码:

在resolve的回调中,我们console.log(somedata);而somedata这个变量是没有被定义的。如果我们不用Promise,代码运行到这里就直接在控制台报错了,不往下运行了。但是在这里,会得到这样的结果:

也就是说进到catch方法里面去了,而且把错误原因传到了reason参数中。即便是有错误的代码也不会报错了,这与我们的try/catch语句有相同的功能。

Promise的all方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。

用Promise.all来执行,all接收一个数组参数,里面的值最终都返回Promise对象。这样,三个异步操作的并行执行的,等到它们都执行完后才会进到then里面。那么,三个异步操作返回的数据哪里去了呢?都在then里面呢,all会把所有异步操作的结果放进一个数组中传给then,就是上面的results。所以上面代码的输出结果就是


有了all,你就可以并行执行多个异步操作,并且在一个回调中处理所有的返回数据

all方法的效果实际上是谁跑的慢,以谁为准执行回调,那么race方法谁跑的快,以谁为准执行回调;我们把上面runAsync1的延时改为1秒来看一下

1秒后runAsync1已经执行完了,此时then里面的就执行了
在then里面的回调开始执行时,runAsync2()和runAsync3()并没有停止,仍旧再执行。于是再过1秒后,输出了他们结束的标志。

用race给某个异步请求设置超时时间,并且在超时后执行相应的操作


requestImg函数会异步请求一张图片,我把地址写为"xxxxxx",所以肯定是无法成功请求到的。timeout函数是一个延时5秒的异步操作。我们把这两个返回Promise对象的函数放进race,于是他俩就会赛跑,如果5秒之内图片请求成功了,那么遍进入then方法,执行正常的流程。如果5秒钟图片还未成功返回,那么timeout就跑赢了,则进入catch,报出“图片请求超时”的信息。运行结果如下:


 
 
 

上述代码可以.then方法返回一个promise对象,但是这个promise的状态是由回调函数的执行结果来决定的

  • 如果回调函数中返回的结果是非promise类型的数据,状态为成功,返回值为对象的成功值

then方法的链式调用

then方法在指定回调的时候是可以只指定一个的

ES6 提供了新的数据结构 Set(集合)。它类似于数组,但成员的值都是唯一的,集合实现了 iterator
接口,所以可以使用『扩展运算符』和『for…of…』进行遍历,集合的属性和方法:

  • size返回集合的元素个数
  • add增加一个新元素,返回当前集合
  • has检测集合中是否包含某个元素,返回boolean值;

ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合。但是“键”的范围不限于字符串,各种类
型的值(包括对象)都可以当作键。Map 也实现了iterator 接口,所以可以使用『扩展运算符』和
『for…of…』进行遍历;


ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过 class 关键
字,可以定义类。基本上,ES6 的 class 可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做
到,新的 class 写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已;


ES6之后通过类名来实例化对象

从上述例子中可以看出实例对象是没有构造函数对象上的属性,也没有构造函数上的方法.因此函数对象是函数对象,实例对象是实例对象

那么,实例对象上的属性跟什么是相同的呢?

实例对象上的属性跟构造函数上的原型对象是相同的。

上面中的name,change属于构造函数这个对象.并不属于实例对象。在面向对象中这样的属性就称为 静态属性

而类似的在类中,某些属性属于类而不属于实例对象就称为class的静态成员。

ES5中使用构造函数继承

在子类中声明一个同父类同名的方法,即重写

这个时候子类是不可以调用父类的同名call方法

  1. get和set是方法,因为是方法,所以可以进行判断
  2. get一般是要返回的;而set是设置,不用返回
  3. get负责查询,不带任何参数;set负责设置,是通过参数的形式传递。
  4. 如果调用对象内部的属性约定的命名方式是变量名前加_
  5. 每一个对象都有一个get和set方法。

输出的是price这个函数

set:对属性进行赋值

  • 只要两个数的差值小于EPSILON的属性值就认为这两数相等
  • ES6 提供了二进制和八进制数值的新的写法,分别用前缀 0b 和 0o 表示;
  • 用于去除一个数的小数部分,返回整数部分;
  • Math.sign判断一个数到底为正数,负数,还是零。正数返回1,负数返回-1,0返回0
  1. Object.is 比较两个值是否严格相等,与『===』行为基本一致(+0 与 NaN);
  2. Object.assign 对象的合并,将源对象的所有可枚举属性,复制到目标对象;

模块化是指将一个大的程序文件,拆分成许多小的文件,然后将小文件组合起来;

模块化的优势有以下几点:

ES6 之前的模块化规范有:

模块功能主要由两个命令构成:export 和 import;

  • export 命令用于规定模块的对外接口(导出模块);
  • import 命令用于输入其他模块提供的功能(导入模块);

我要回帖

更多关于 数组定义 的文章

 

随机推荐