简介:javascript
ES6(es2015), ES7(es2016)php
经常使用命令行:html
切换盘e:java
进入文件夹cd testnode
返回上一级目录cd..git
使用compilees6
https://www.tslang.cn/play/index.htmlgithub
npm -v //检查你电脑是否安装了node,是否有npm
npm install -g typescript //全局安装typescript
tsc -v//检查tsc(typescript简写)的版本号看是否安装好
新建ts文件 test.tsweb
命令行找到ts文件位置,执行下面命令,就会发现js文件自动生成了ajax
xxxxxxxxxx
tsc test.ts
前提是的安装compile=》依赖babel
一、在webstorm中新建一个ts文件,
二、输入内容时,webstorm顶部会出现一行提示:Compile Typescript to Javascript? OK NO cONFIGURE/
三、点击OK
声明let,const,箭头函数,class
Symbol,Array.from
做用:与var相似,用于声明一个变量
特色:
应用:
做用:定义一个常量
特色:
应用:保存不用改变的数据
从对象或数组中提取数据,并复制给变量(多个)
变量名必定要对应对象的属性名
xxxxxxxxxx
let { n,a } = { n:'tom',a:12};
console.log(n,a);
xxxxxxxxxx
let obj = { name:'Lily',age:18 ,sex:'女'};
let { name,age } = obj;
console.log(name,age);
变量名和数组下标对应
xxxxxxxxxx
let arr = [1,2,3,5];
let [,a,b,c] = arr;//不须要的用逗号占位置
console.log(a, b,c);
xxxxxxxxxx
let obj = { name:'Lily',age:18 ,sex:'女'};
function foo({name,sex}) { //进行解构赋值
console.log(name, sex);
}
foo(obj);
简化字符串的拼接
xxxxxxxxxx
let obj = { name:'Lily',age:18 ,sex:'女'};
let str1 = '个人名字叫'+obj.name+',个人年龄是'+obj.age; //es5的写法
let str2 = `个人名字叫${obj.name},我得年龄是${obj.age}`;//es6的写法
xxxxxxxxxx
let name = 'Lily';
let age = 18;
let obj = {
name,//同名的属性能够省略
age,
getName() {//能够省略函数的function
return this.name
}
};
console.log(obj);
console.log(obj.getName());
xxxxxxxxxx
let fun = ()=> console.log('我是箭头函数');
fun();
xxxxxxxxxx
let fun = a => console.log(a);
fun(5);
xxxxxxxxxx
let fun = (a,b) => console.log(a+b);
fun(5,10);
xxxxxxxxxx
let fun = (a,b) => a+b;
console.log(fun(5, 10));
箭头函数内的this指向取决于所处的环境,es5中的this指向取决于调用的对象
this,能够简单地看 () 外层的this指向谁,函数体内的this就指向谁
如下案例能够助你理解;
xxxxxxxxxx
let obj = {
name:'箭头函数',
getName:function () {
console.log(this);//obj 普通function函数,this指向调用该函数时的obj
btn2.onclick = ()=>{
console.log(this);//obj 箭头函数,this指向 同于 ()外部的this
}
}
};
obj.getName()
xxxxxxxxxx
let obj = {
name:'箭头函数',
getName: ()=> {
console.log(this);//window 箭头函数,this指向 同于 ()外部的this,此处外部就是obj所处的全局window
btn2.onclick = ()=>{
console.log(this);//window 箭头函数,this指向 同于 ()外部的this
}
}
};
obj.getName()
function foo(...value) {
console.dir(arguments); //是伪数组,不能用forEach遍历
console.dir(value); //是真数组,不能用forEach遍历
value.forEach(function (item,index) {
})
}
foo(1,2)
xxxxxxxxxx
function foo(a,...value) {
console.dir(a); //1
console.dir(value); //去掉a以外的后面的参数
value.forEach(function (item,index) {
})
}
foo(1,2,3)
xxxxxxxxxx
let arr = [1,6];
let arr1 = [2,3,4,5];
arr = [1,...arr1,6];
console.log(arr); //[1, 2, 3, 4, 5, 6]
console.log(...arr); //1 2 3 4 5 6
xxxxxxxxxx
function Point(x=0,y=0) { //给形参设置默认值,用于调用时未传参时生效
this.x = x;
this.y = y;
}
let point = new Point(23,35);
let point2 = new Point();
console.log(point2);
实测发现:promise会报错,估计暂不支持
一、建立对象
xxxxxxxxxx
var promise = new Promise((resolve,reject)=>{
/*初始化promise状态:pending:初始化*/
/*执行一步操做,一般是ajax请求, 开启定时器*/
setTimeout(()=>{
/*根据异步任务的返回结果去修改promise的状态*/
/*异步任务执行成功会执行的函数*/
resolve('哈哈');//修改promise的状态为fullfilled:成功的状态
/*异步任务执行失败会执行的函数*/
reject('嘿嘿');//修改promise的状态为rejected:失败的状态
},2000)
});
二、调用then方法
xxxxxxxxxx
/*外部调用,避免层层嵌套*/
promise.then((res)=>{
console.log(res+'成功了');
},(res)=>{
console.log(res+'失败了');
});
三、改良后使用
xxxxxxxxxx
function ajax(type,url) {
var promise = new Promise((resolve,reject)=>{
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function () {
console.log(xmlHttp.readyState);
/*此处会执行4次,readyState=1,2,3,4*/
if(xmlHttp.readyState === 4 && xmlHttp.status === 200){
resolve(JSON.parse(xmlHttp.responseText));//成功执行
}else {
/*此处会执行3次,readyState=1,2,3*/
reject(JSON.parse(xmlHttp.responseText));//失败执行,
}
};
xmlHttp.open(type,url,false);
xmlHttp.setRequestHeader('Content‐Type', 'application/x‐www‐form‐urlencoded');
xmlHttp.send();
});
return promise
}
/*外部调用,避免层层嵌套,第一个回调成功状态,第二个回调失败执行*/
ajax('get','https://iqiyi.yscase.com/gugong/api').then((res)=>{
console.log(res);
},(res)=>{
console.log(res);
});
四、链式回调
xxxxxxxxxx
function ajax(type,url) {
let promise = new Promise((resolve,reject)=>{
setTimeout(function () {
resolve(111);
},1000)
});
return promise
}
/*外部调用,避免层层嵌套,第一个回调成功状态,第二个回调失败执行*/
ajax('get','https://iqiyi.yscase.com/gugong/api/aaa.php').then((res)=>{
console.log(res);
var url = 'https://iqiyi.yscase.com/gugong/api/bbb.php';
/*再请求返回一个,实现链式写法*/
return ajax(url);
},(res)=>{
}).then(()=>{//链式写法:第二个请求回调
},()=>{
});
es6添加的一种原始数据类型
已有的数据类型:numble,string,boolean,undefined,null,对象
一、传参标志,只要是symbol类型,都不相等
xxxxxxxxxx
let symbol1 = Symbol('111');
let symbol2 = Symbol('111');
console.log(symbol1);
console.log(symbol2);
console.log( symbol1 === symbol2); //不相等,
二、Symbol做为对象的属性名
xxxxxxxxxx
let symbol1 = Symbol();//没有参数的
let symbol2 = Symbol('111');//有参数的
let obj = {};
obj[symbol1] = 'hello';//做为属性名
obj[symbol2] = 'my';
console.log(obj);
三、内置Symbol值
除了定义本身使用的Symbol值之外,WS6还提供了11个内置的Symbol值,指向语言内部使用的Symbol
for...of
循环,Iterator 接口主要供for...of
消费next
方法,能够将指针指向数据结构的第一个成员。next
方法,指针就指向数据结构的第二个成员。next
方法,直到它指向数据结构的结束位置。每一次调用next
方法,都会返回数据结构的当前成员的信息。具体来讲,就是返回一个包含value
和done
两个属性的对象。其中,value
属性是当前成员的值,done
属性是一个布尔值,表示遍历是否结束。
如下模拟next方法返回值的例子
xxxxxxxxxx
var it = makeIterator(['a', 'b']);
it.next() // { value: "a", done: false }
it.next() // { value: "b", done: false }
it.next() // { value: undefined, done: true }
function makeIterator(array) {
var nextIndex = 0;
return {
next: function() {
return nextIndex < array.length ?
{value: array[nextIndex++], done: false} :
{value: undefined, done: true};
}
};
}
xxxxxxxxxx
function* helloWorldGenerator() {
yield 'hello';
yield 'world';
return 'ending';
}
var hw = helloWorldGenerator();
function
关键字与函数名之间有一个星号;yield
表达式,定义不一样的内部状态(yield
在英语里的意思就是“产出”)。xxxxxxxxxx
function* myGenerator(){
console.log('开始');
let aaa = yield 'hello';
console.log(aaa);//aaaaaaaaa next传的参就是启动时yield的回调,
console.log('暂停后,再次执行');
yield 'generator';
return 'bbb'
}
let MG = myGenerator();
console.log(MG);//遍历器对象
console.log(MG.next());//{value: "hello", done: false}
console.log(MG.next('aaaaaaaaa'));//{value: "generator", done: false}
console.log(MG.next());//{value: "bbb", done: true}
xxxxxxxxxx
var obj = { name : '岳想玲', age:'27' };
console.log(obj);
obj[Symbol.iterator] = function* () {
yield 1;
yield 2;
yield 3;
};
console.log(obj);
for(var i of arr){
console.log(i);
}
xxxxxxxxxx
function gotoOauch(url,data) {
$.ajax({
type: 'GET',
data: data,
url: 'https://iqiyi.yscase.com/gugong/api'+url,
success: function(data){
console.log((data));
let userid = data.data.user_id;
aaa.next(userid);
}
})
}
function* myGenerator() {
let userid = yield gotoOauch('/create_user.php',null);
yield gotoOauch('/query_help_count.php',{user_id:userid});
}
let aaa = myGenerator();
aaa.next();
(源于ES2017,暂时还不能用)
概念:真正意义上解决异步回调的问题,同步流程表达异步操做
本质:Generator语法糖
语法:
一、内置执行器。Generator 函数的执行必须靠执行器,因此才有了
co模块,而
async函数自带执行器。也就是说,
async`函数的执行,与普通函数如出一辙,只要一行。
二、async
和await
,比起星号和yield
,语义更清楚了。async
表示函数里有异步操做,await
表示紧跟在后面的表达式须要等待结果。
三、co
模块约定,yield
命令后面只能是 Thunk 函数或 Promise 对象,而async
函数的await
命令后面,能够是 Promise 对象和原始类型的值(数值、字符串和布尔值,但这时会自动转成当即 resolved 的 Promise 对象)。
四、async
函数的返回值是 Promise 对象,这比 Generator 函数的返回值是 Iterator 对象方便多了。你能够用then
方法指定下一步的操做。
xxxxxxxxxx
async function foo(url,data) {
return new Promise((resolve,reject) => {
$.ajax({
type: 'GET',
data: data,
url: 'https://iqiyi.yscase.com/gugong/api' + url,
success: data => resolve(data),
error:error => reject(error)
})
})
}
async function myFunc() {
console.log('开始执行');
let userid = (await foo('/create_user.php',null)).data.user_id;
console.log(userid);
await foo('/query_help_count.php',{user_id:userid});
console.log('执行完毕');
}
console.log(myFunc());
xxxxxxxxxx
class Person{
constructor(name,age){ //构造函数
this.name = name;
this.age = age;
}
showName(){//原型上的方法
console.log(this.name);
}
}
let person = new Person('哈哈',18); //实例化对象
console.log(person);
继承
class StarPerson extends Person{//继承了父类的全部属性和方法 constructor(name,age,salary){ super(name,age); //调用父类的构造函数,传参 this.salary = salary; } } let p1 = new StarPerson('bbbb',18,10000); console.log(p1); p1.showName(); //调用原型链上的方法(父亲的)
console.log(str.includes('j'));//判断是否包含指定的字符串
console.log(str.startsWith('a'));//判断是否以指定字符串开头
console.log(str.endsWith('a'));//判断是否以指定字符串开头
console.log(str.repeat(2));//判断是否以指定字符串开头
console.log(Number.isFinite(Infinity));//是不是有限大的数
console.log(Number.isNaN(NaN));//是不是NaN(非数值)
console.log(Number.isInteger(2.2));//是不是整数
console.log(Number.parseInt(2.2));//转为整形
console.log(Math.trunc(-2.2));//直接去除小数部分
console.log(Array.from(btns))//返回值为真数组,便可使用真数组的方法如:forEach
let arr = Array.of(1,4,'abc',true);//将一系列值转成一个数组
找到第一个知足条件的元素
let arr2 = [3,5,1,8,54]; let result = arr2.find(function (item,index) { return item > 4 }); console.log(result);//5
找到第一个知足条件的元素的索引值
let arr2 = [3,5,1,8,54]; let result = arr2.findIndex(function (item,index) { return item > 4 }); console.log(result);//5
底层是字符串的形式在判断
console.log(0 == -0); //true console.log(Object.is(0, -0)); //false console.log(NaN == NaN); //false NaN不等于任何值 console.log(Object.is(NaN, NaN)); //true
此方法是浅拷贝,新对象会影响原对象
let obj = {}; let obj1 = { username:'hahaha',age:18}; let obj2 = { sex:'男'}; Object.assign(obj,obj1,obj2); //将源对象的属性复制到目标对象上 console.log(obj);
直接操做对象的proto属性,隐士原型指向,es6以前,对象的隐士原型是不容许改变的,只有prototype才能改变,但es6已结能够改变了
let obj3 = {}; let obj4 = { qian : 5000000}; obj3.__proto__ = obj4; console.log(obj3);
参考:http://www.javashuo.com/article/p-zdppnnxl-x.html
stack为自动分配的内存空间,它由系统自动释放;而heap则是动态分配的内存,大小不定也不会自动释放。
存放在栈内存中的简单数据段,数据大小肯定,内存空间大小能够分配。
5种基本数据类型有Undefined、Null、Boolean、Number 和 String,它们是直接按值存放的,因此能够直接访问。
拷贝时会生成一份新的数据,修改后不会影响原数据
存放在堆内存中的对象,变量实际保存的是一个指针,这个指针指向另外一个位置。每一个空间大小不同,要根据状况开进行特定的分配。
当咱们须要访问引用类型(如对象,数组,函数等)的值时,首先从栈中得到该对象的地址指针,而后再从堆内存中取得所需的数据。
拷贝时不会生成新数据,只是拷贝的引用,修改后的数据会影响原数据
理解什么是“浅拷贝”和“深拷贝”。
基本类型与引用类型最大的区别实际就是传值与传址的区别。
1 var a = [1,2,3,4,5]; 2 var b = a;//传址 ,对象中传给变量的数据是引用类型的,会存储在堆中; 3 var c = a[0];//传值,把对象中的属性/数组中的数组项赋值给变量,这时变量C是基本数据类型,存储在栈内存中;改变栈中的数据不会影响堆中的数据 4 alert(b);//1,2,3,4,5 5 alert(c);//1
stack栈内拷贝,heap堆未拷贝
基本数据类型,浅拷贝便可
影响了原数据的就是浅拷贝
对于复杂数据类型:对象和数组,要想深度拷贝就得建立一个新的(开辟新的堆内存)数组或对象进行拷贝
浅拷贝和深拷贝主要是针对于数组和对象,
浅拷贝就是拷贝引用,修改后会影响原数据,
深拷贝拷贝的时候会生成新数据,修改后不会影响原数据
//浅拷贝
//浅拷贝,新对象会影响原对象
针对数组元素是基本数据类型的数组来讲是深拷贝
若是数组元素是数组或对象时是浅拷贝
let arr = [1,3,{name:'Lily'}]; let arr2 = arr.concat(); console.log(arr2); arr2[2].name = 'Dave'; console.log(arr);
//同concat
//深拷贝
利用了基本数据拷贝的特色,JSON.stringify()出来的是基本数据类型字符串
拷贝的数据里不能有函数!
JSON格式里没有函数,只有数组或对象
let arr = [1,3,{name:'Lily'}]; let arr4 = JSON.parse(JSON.stringify(arr)); arr4[2].name = 'Dave'; console.log(arr); console.log(arr4);
拷贝的数据里有对象或数组
var arr = [1, 10, { name: 'lily' }]; /*判断类型*/ function checkedType(target) { return Object.prototype.toString.call(target).slice(8, -1); } function clone(target) { var result, targetType = checkedType(target); if (targetType === 'Object') { result = {}; } else if (targetType === 'Array') { result = []; } else { return target; } /*遍历数据*/ for (var i in target) { var value = target[i]; if (checkedType(value) === 'Object' || targetType === 'Array') { result[i] = clone(value); } else { result[i] = value; } } return result; } var arr2 = clone(arr); arr2[2].name = 'aaa'; console.log(arr); console.log(arr2);
无序的,不可重复的,多个value的集合体
let set = new Set([1,5,62,5,10]); //Set(4) {1, 5, 62, 10}
let arr = [1,4,4,6,2,3,7]; let arr1 = arr; arr = []; let set = new Set(arr1); for(let i of set){ arr.push(i); }
无序的、key不重复的多个key-calue的集合体
let map = new Map([['aaa','usename'],[36,'age']]); //Map(2) {"aaa" => "usename", 36 => "age"}