2020-01-06 JavaScript 进阶2

global
都是reference,global是绝对引用
没有全局函数:对变量的直接使用,实际是global的方法。
全局污染:非闭包环境的var和直接定义变量,闭包环境的直接定义变量。
this
this是相对引用,与定义位置无关。
非闭包this===global,闭包环境,在调用时动态绑定
技巧:默认指向“方法宿主”(全局函数是global的方法!)
特例:node在文件中执行的函数,仍然是this被绑定为global!!
三个绑定函数:apply,call,bind

name='global name';
this.name="this name"
function sayName() {
    console.log(this.name)
}
let sn=()=>console.log(this.name)
let person={
    name:'person name',
    sayName:sayName,
    sayName1:sn,
    sayName2:function () {
        sn()
    }
}
sayName()
sn()
person.sayName()
person.sayName1()
person.sayName2()

结果
···
global name
this name
person name
this name
this name
···

回调函数
回调地狱

去回掉函数
promise()
.then
.catch

async 异步修饰符

const util=require('util')

function sum(a,b,callback) {
setTimeout(function () {
// if(a>=0)
callback(a+b);
// else
// callback("a must be great than 0")
},1000)
}

// let sum2=util.promisify(sum)
// sum2(1,2)
// .then((m)=>console.log(m))
// .catch(e=>console.log(e))

function multi(a,callback){
setTimeout(function () {
let m=a*2;
callback(m)
},1000)
}

function sum1(a,b) {
return new Promise(function (resolve,reject) {
setTimeout(function () {
if(a>=0){
resolve(a+b)
}
else{
reject("a must be great than 0")
}
},1000)
})
}

function multi1(a){
return new Promise((resolve,reject)=>{
if(a<=10){
resolve(a*2)
}
else {
reject("too diffcult")
}
})
}

async function test1(){
let m=await sum1(1,2);
let x=await multi1(m)
console.log(x)
}
test1();


//
// sum1(9,2)
//     .then(m=>multi1(m))
//     .then(m=>console.log(m))
//     .catch(error=>console.log(error))


// sum(1,2,function (err,m) {
//     if(!err)
//         multi(m,function (x) {
//         console.log(x)
//         })
// })

console.log("end...")

数组的新玩法

array-like和iterable特征(for..in/for...of)
生成数组的新方法:
Array.from
Array.of(item...)
copyWithin(target, start, end)

let m=[2,1,3];
let m2 = m;   引用
let m1 = Array.of(...m);  浅克隆
let m3=m.slice(0);   浅克隆

几个数据的操作
push, pop, unshift, shift
slice(纯函数,不改变数组本身), splice(不是纯函数,改变数组本身)
forEach, some, every, filter 里面的回调 函数都是三个参数item, index, ary
map, reduce ,flat多维数据变成, flatMap
let mm = [1,3,2,5,7]
let mmm=[4,6]
let x=mm.reduce(function(prev,cur){
return prev+cur
},0);
let x=[mm,mmm].flat(1)

indexOf, findIndexOf
sort

set map

set 可能去重
map 放k-v对。但是k可以是任何类型。也去重。

WeakSet() WeakMap()

模板语法和模板标签

let s= this is a test.

对象克隆

深度克隆使用lodash

函数参数

默认形参
function fn(a=0,b=0){}
副作用:此形参个数不会计入fn.length
rest形参(无需argumets)
function fn(...values){values为数组形式}

模块系统

传统的JS没有模块
ES6模块必须依赖工具。webpack
webpack.conf.js放到工程的主目录中。
npm install webpack-cli -g

类编程

static 可以被继承。java中static不可以继承。

function Person() {
    
}
class Animal {
    constructor(age){
        this.age=age;
    }
    sayAge(){
        console.log(this.age)
    }
    static staticFn(){
        console.log("static fn...")
    }
}
class Human extends Animal{
    constructor(name,age){
        super(age)
        this.name=name;
    }

    sayAge() {
        super.sayAge();
        console.log("attach....")
    }
}
let a1=new Animal(100);
a1.sayAge()
Human.staticFn();

闭包

测试

Mocha

在项目目录下建 一个test
在目录下,建以test或spec结尾的文件。

describe(" ",function(){
    it("",fn(){
    });

})

运行mocha

在package.json中,把

  "scripts": {
    "test": "Mocha"
  },

这样就可以通过npm run test进行测试了。

chai

VUE

vdom缺点: 浪费内存。

生成vdom时遇到自定义标签,如果是自定的模块,把这个标签作为一个VM,递归下去。

参值绑定,缺省会转义其中的Html标签。{{title}}
如果特别要展示富文本,可以使用如下。

属性绑定

pp!


引号中只能是表达式,不能是语句。
条件渲染

a=1


a=2


a=other


Show


循环渲染

  • {{ fav.type}},{{fav.id}}, {{index}}

favs=[{id:3, type:"basketball"},{id:4,type:"football"}]

事件绑定
#加空括号,则没有了缺省的event参数。ok($event).没有括号,缺省是有event的。
@click.prevent 阻止缺省行为
@click.stop 防止冒泡
@click.once 只一次有效

methods:{

}
双向数据绑定
v-mode
v-mode.lazy 不是每一次都改变,鼠标移走后才改变。
单选radio


{{fav}}

多选checkbox

select

VUE的监听器

watch

例 子




    
    Title
    
    


    
{{title|toUpper}}, {{new Date()|dateFormat}}


pp !

a=1

a=2

a=other

show

{{age}}
{{fav}}
{{favs1}}
{{favs1}}

{{x}}

过滤器

比如格式化,可以使用管道
{{title|a|b}}
filters:{
toUpper(val){
return val.
}
}

{{title|toUpper}}

全局的
vue.filter("dataFormate",function(){})
vue.directive('johns',

)

//现金额大写转换函数
//ecDo.upDigit(168752632)
//result:"人民币壹亿陆仟捌佰柒拾伍万贰仟陆佰叁拾贰元整"
//ecDo.upDigit(1682)
//result:"人民币壹仟陆佰捌拾贰元整"
//ecDo.upDigit(-1693)
//result:"欠人民币壹仟陆佰玖拾叁元整"
function upDigit(n) {
    var fraction = ['角', '分', '厘'];
    var digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
    var unit = [
        ['元', '万', '亿'],
        ['', '拾', '佰', '仟']
    ];
    var head = n < 0 ? '欠人民币' : '人民币';
    n = Math.abs(n);
    var s = '';
    for (var i = 0; i < fraction.length; i++) {
        s += (digit[Math.floor(n * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, '');
    }
    s = s || '整';
    n = Math.floor(n);
    for (var i = 0; i < unit[0].length && n > 0; i++) {
        var p = '';
        for (var j = 0; j < unit[1].length && n > 0; j++) {
            p = digit[n % 10] + unit[1][j] + p;
            n = Math.floor(n / 10);
        }
        s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s;
        //s = p + unit[0][i] + s;
    }
    return head + s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整');
}

晚上

多组件技术

带冒号,表示变量。没有冒号代表字符串。
子组件中的data必须使用函数
data(){
return{}
})
子组件向父组件发消息$emit

获取远端数据

可以在load或mount阶段来获取数据
在method中
created(){
window.fetch('url',{type:"GET"])
.then(res->res.json())
.then(da=>alert(da))
}

axios库代替fetch




    
    Title
    


    

登录页面示例
···




Title





欢迎:{{currentUser.uname}},退出登录



请登录













···
测试数据

{
  "users": [
    {
      "uname": "john",
      "password": "123"
    },
    {
      "uname": "tom",
      "password": "234"
    },
    {
      "uname": "mike",
      "password": "345"
    }
  ]
}

你可能感兴趣的:(2020-01-06 JavaScript 进阶2)