<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
/*
es6基本语法:
1.变量的声明: var
es6: let(限制作用域 所声明的变量,只在let命令所在的代码块内有效)
const(const声明一个只读的常量。一旦声明,常量的值就不能改变。)
*/
/*var a=6;
console .log(a);
a=20;
console .log(a);
const PI=3.14;
console .log(PI);*/
//2.es6引入的语法 :代码块 内外层互不干扰,外层无法读取内层变量。
/*let a=1;
{
let a=3;
console.log(a);
}*/
// es5
{
// var a=[];
// for(var i=0;i<10;i++){
// a[i]=function (){
// console.log(i)
// }
// }
// a[6](); //10 变量i是var声明的,在全局范围内都有效。所以每一次循环,新的i值都会覆盖旧值,导致最后输出的是最后一轮的i的值。
}
/*
//es6
let a=[];
for(let i=0;i<10;i++)
{
a[i]=function (){
console.log(i);
}
}
a[6](); //6 变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,
}*/
// 3.ES6 变量的解构赋值,按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构
// “模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值
//如果解构不成功,变量的值就等于undefined
// var a=1;
// var a=1,b=2,c=3;
/*{
//let [a,b,c]=[1,2,3];
// console.log(a);
// console.log(b);
// console.log(c);
// let [[a,b,c],[a,[b,c]]]=[[1,2,2],[3,[4,5]]];
}*/
//不完全解构,可以成功
/*let [x, y] = [1, 2, 3];
x // 1
y // 2*/
let [head, ...tail] = [1, 2, 3, 4];
head // 1
tail // [2, 3, 4]
//...a 数组 ...执行不在写
let [...b] = [1, 2, 3, 4, 5, 6];
console.log(b); //123456
// 对象的解构赋值
/*var { foo, bar } = { foo: "aaa", bar: "bbb" };
foo // "aaa"
bar // "bbb"*/
//字符串的解构赋值
/*{
const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
c // "l"
d // "l"
e // "o"
}*/
/*
es5 给字符串 绑定值 直接是拼接 ++
es6 使用模板字符串来动态绑值 模板字符串中嵌入变量,需要将变量名写在${}之中。
es6 : ``
*/
{
let a = 10;
let h = 10;
let str = `我的年龄是:${a}岁!我身高:${h}M`;
console.log(str);
}
// 函数参数
/*[[1, 2], [3, 4]].map(([a, b]) => a + b);
[ 3, 7 ]*/
// 解构赋值对提取JSON对象中的数据,尤其有用。
var jsonData = {
id: 42,
status: "OK",
data: [867, 5309]
};
let { id, status, data: number } = jsonData;
console.log(id, status, number);
// 42, "OK", [867, 5309]
//es6里面的函数默认值问题:
{
//如果参数x赋值了,但是对应的布尔值为false,则该赋值不起作用。
//如果在调用函数的时候,传入的x参数是一个空字符串,那么x就会被修改为默认值。
stu(undefined, 2)
function stu(x, y) {
x = x || '0';
console.log(x, y); //0 2
}
stus(undefined, 2)
function stus(x = 0, y = 0) {
console.log(x, y); // 0 2
}
}
// 遍历Map结构
{
let map = new Map();
map.set("first", 'hello');
map.set("secod", 'world');
for (let [key, value] of map) {
console.log(key + " is " + value);
}
}
// Set结构和Map数据结构
// 数据结构Set 它类似于数组,但是成员的值都是唯一的,没有重复的值,本身是构造函数
{
var s = new Set();
[1, 2, 3, 3, 4, 4, 5, 5].map(x => s.add(x)),
console.log(s); //1 2 3 4 5
}
//Map 类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键
{
var map = new Map();
var o = { p: 'kjckdjkd' };
map.set(o, 'hello');
console.log(map.get(o));
}
{
var map = new Map([
['name', '张三'],
['age', '12'],
]);
console.log(map.size); //size属性返回Map结构的成员总数。
console.log(map.set('age', 6)); // set方法设置key所对应的键值,然后返回整个Map结构
console.log(map.has('name')); //has方法返回一个布尔值,表示某个键是否在Map数据结构中。
console.log(map.get('name')); //get方法读取key对应的键值,如果找不到key,返回undefined。
console.log(map.delete('name')); //delete方法删除某个键,返回true。如果删除失败,返回false。
console.log(map.clear()); //clear方法清除所有成员,没有返回值。
}
// es6的箭头函数 =>
{
/*箭头函数有几个使用注意点。
(1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
(2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
(3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用Rest参数代替。
(4)不可以使用yield命令,因此箭头函数不能用作Generator函数。
this指向的固定化,并不是因为箭头函数内部有绑定this的机制,实际原因是箭头函数根本没有自己的this,
导致内部的this就是外层代码块的this。正是因为它没有this,所以也就不能用作构造函数。
*/
}
// let res=function (){}
{
let res = () => { console.log(1) } //圆括号里是参数 大括号里是返回值
res();
}
/*{
var f = v => v;
var f = function (v) {
return v;
}
//2.如果箭头函数不需要参数或需要多个参数,就使用一个圆括号代表参数部分。
var m = () => 5;
var m = function () {
return 5;
}
var sum = (num1, num2) => num1 + num2;
var sum = function (num1, num2) {
return num1 + num2;
}
,
//, ,3.果箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,并且使用return语句返回。
var sum = (num1, num2) => { num1 + num2 };
var sum = function (num1, num2) {
return num1 + num2;
}
//4.由于大括号被解释为代码块,所以如果箭头函数直接返回一个对象,必须在对象外面加上括号。
var my = id => ({ id: 'id', name: 'hh' });
// 5.自执行函数
(function (x) {
console.log(x)
})(1);
(x => { console.log(x) })(1);
}*/
{
// 箭头函数的应用
let a = [1, 8, 2, 3, 5, 6, 7, 9]
console.log(a.sort((n1, n2) => n2 - n1)); //987654321
}
{
Array.prototype.mysort = () => {
console.log(this); // //箭头函数保持上下文对象一致 window
}
var n = new Array(1, 2, 3, 4, 5, 6);
n.mysort();
}
//枚举对象里的this
{
let student = {
init() {
document.addEventListener("click", () => {
console.log(this);
});
}
}
student.init();
// setInterval(function (){
// console.log(this);
// },1000);
// }
}
/*
es6 for----of--- 遍历
for...of循环内部调用的是数据结构的Symbol.iterator方法
*/
{
let a = ["red", "orange", "black"];
for (let item of a) {
console.log(a[item]); //undefined
console.log(item); //red orange black item 直接是值
}
}
{
let m = [{ name: "jiasijai", age: "12", sex: "男" }, { name: "jiasijai", age: "12", sex: "男" }]
for (let item of m) { // of后边的必须是可迭代的集合
console.log(item);
}
}
/* 在es5中,构造函数生成的对象实例一般包括私有属性和共用方法,其中共用方法一般是通过构造函数的原型进行定义。
而es6中,通过class类进行定义构造函数则不用借助于原型…. */
{
// es5构造函数
function list() {
this.name = null;
this.age = 12;
this.sex = "男"
}
var l = new list();
console.log(l.sex)
}
{
// es6 class类 没有变量提升
class student {
constructor(w, h) {
//是给属性初始化默认值的
//es6里面的属性的定义在constructor
this.width = w;
this.heighth=h;
}
sleep() {
console.log('睡觉');
}
toString() {
console.log(1);
}
// 获取值 get方法
get num() {
return this.width;
}
//set 设置值方法
set setnum(value) {
this.width = value;
}
}
let stu = new student(100,200);
stu.sleep();
stu.toString();
console.log(stu);
console.log(stu.num);
stu.width=200; //已经改变width的值
console.log(stu.width);
/* student.prototype={ 原型链追加
sleep(){},
toString(){}
} */
}
{
/*
es6里面import(导入) export(导出) 变量--export--import 一一对应
export命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能。
一个模块就是一个独立的文件。该文件内部的所有变量,外部无法获取。
如果你希望外部能够读取模块内部的某个变量,就必须使用export关键字输出该变量。
export语句输出的接口,与其对应的值是动态绑定关系,即通过该接口,可以取到模块内部实时的值。
使用export命令定义了模块的对外接口以后,其他 JS 文件就可以通过import命令加载这个模块。
import Vue from 'vue'; Vue其他模块导入的变量名 vue模块文件的位置
*/
import React,{Components} from 'react';
class stu extends Components{
constructor(props){
super(props);
this.state={
}
}
}
// export default stu; export default命令,为模块指定默认输出。
}
</script>
</body>
</html>