JavaScript基础之Symbol类型

Symbol() 类型不能当做普通对象(不能加属性值),只能当做一种永远都不会重复的字符串 定义 方法: Symbol(desc)、Symbol.for(desc) 1 2 3 4 5 6 7 8 let s1 = Symbol('d') let s2 = Symbol.for('d') let s3 = Symbol.for('d') console.log(s1.description);//d console.log(Symbol.keyFor(s2));//d console.log(s1 === s3);//false console.log(s2 === s3);//true 注意: 利用Symbol() 定义的值永远都不会相等,而Symbol.for() 定义的,如果描述相同,则值相等 定义对象时,key相同会覆盖的问题 普通方式定义: 1 2 3 4 5 6 7 8 9 10 11 let user1={ name:'李四' } let user2={ name:'李四' } let grade={ [user1.name]:{C:98,E:60}, [user2.name]:{C:99,E:59} } console.log(grade);//{'李四':{C:99,E:59}} 可以看到,后面的覆盖掉了前面的...

2020年8月24日 · 2 min · Archai

JavaScript基础之数组深倔

数组是经常用到的一种数据结构 定义方法 1 2 let a = new Array(3) let b = [1, 2, 3] 如何定义一个只有一个元素的数组? new Array(n)表示有n个空元素的的数组,利用Array.of(n),可以定义一个只有n元素的数组 类型转换 利用join 可以把数组转成字符串 1 2 3 let a = [1, 2, 3, 4, 5] let b = a.join('') console.log(b); 说明: join 的作用就是将数组中的所有元素用指定的符号连接,成为一个字符串 如何把DOM集合NodeList转换成普通数组形式? Nodelist形式无法使用.map(),reduce()等方法(能用forEach()),处理不太方便,因此需要转换成普通数组类型 1 2 3 4 5 6 let titles = document.querySelectorAll('h1'); [...titles].map((v, i,titles) => { console....

2020年8月24日 · 4 min · Archai

JavaScript基础之值类型

字符串 1.截取字符串 主要有slice()、substr()、substring() 三种方法 一个参数[i] 都是从i开始截取,返回n及其后面的全部字符串。 第二个参数[i,n] slice(i,n)和substring(i,n)表示从i开始截取到n;substr(i,n),表示从i开始截取n个 负参数 slice()和substr()将最后一位记为-1,然后依次编号;substring()则会将任何负参数变为0,然后查找 1 2 3 4 5 6 let w = 'fintinger.xyz' let a = w.slice(-4, w.length) let b = w.substring(-1, 2) let c = w.substr(-4, 4) console.log(a, b, c);//.xyz fi .xyz 2.查找字符串 主要有indexof()、includes()、lastIndexof() 三种方法 共同点: 两个参数[searchString,position],第一个为要检索的字符串,第二个为开始检索位置; 若position < 0,则position = 0 position可以省略 不同之处: lastIndexof()为从右往左找,找到第一个立即返回索引!其他两个都是从左往右 indexof(),lastIndexof()找不到则返回-1,includes()找不到返回false position 省略之后,includes(),indexof()默认值为0,lastIndexof()则为str....

2020年8月23日 · 3 min · Archai

JavaScript基础之JS黑洞

JavaScript中最容易忽视的一些点 let和var 都用来定义变量,但二者之间有些细微的差别 区别1: 是否有块作用域 1 2 3 4 5 6 7 8 var a = 1 { // var a=2 let a = 2 } console.log(a); //output var:a=2 let:a=1 1 2 3 4 5 6 7 8 var i=1 // for (var i = 0; i <3; i++) { for (let i = 0; i <3; i++) { //..do something } console....

2020年8月22日 · 2 min · Archai

JavaScript基础之运算符

++的前置与后置 1 2 3 4 5 6 7 8 9 let a1 = 1 let b1 = 2 let c1 = b1 + a1++ console.log(a1, b1, c1);//2,2,3 let a2 = 1 let b2 = 2 let c2 = b2 + ++a2 console.log(a2, b2, c2);//2,2,4 说明: 后置是先计算再++ 前置是先++再计算 短路运算 1 2 3 4 let a = 0; let b = 1; let c = a || b; console....

2020年8月22日 · 1 min · Archai

ES6之Promise用法小结

Promise 对象用于表示一个异步操作的最终完成 (或失败), 及其结果值。其目的主要是解决以往回调中嵌套回调的"嵌套地狱"问题,使代码可读性更好,更美观! 基本用法 对于一个标准的Prommise,其基本写法为: 1 2 3 4 5 6 7 8 9 10 11 12 13 new Promise(function (resolve, reject) { //do something... //success resolve('success') //fail & reject // reject('rejected') *resolve和reject只能出现一个 }).then( function (value) { //if succeed,do something... }, function (reason) { //if fail & reject,do something... } ) 如果采用ES6的箭头函数写法,则为: 1 2 3 4 5 6 7 new Promise((resolve, reject) => { resolve('success') //reject('rejected') })....

2020年8月18日 · 4 min · Archai

获取文件扩展名

该怎么去获得文件名字符串中的文件扩展名呢? 一种较为强大的解决方法是利用String的slice、lastIndexOf方法: 1 2 3 4 5 6 7 8 9 function getFileExtension(filename) { return filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); } console.log(getFileExtension3('')); // '' console.log(getFileExtension3('filename')); // '' console.log(getFileExtension3('filename.txt')); // 'txt' console.log(getFileExtension3('.hiddenfile')); // '' console.log(getFileExtension3('hiddenfile.')); // '' console.log(getFileExtension3('filename.with.many.dots.ext')); // 'ext' 说明 filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2) 本方法中的>>>运算目的是 找到最后一个.所在索引,然后索引-1+2,相当于+1,则slice方法返回.后面的后缀名 .不会再开头,否则索引会是0,因为-1>>>0 = 4294967295,所不会匹配到 .出现在末尾,索引会等于length+1,也不会匹配到 slice(start,end) 说明:start必须指定,负值为从后往前数,若只指定start值,则返回start位置及后面一直到数组结尾所有的元素 **注意:**区别于删除数组中的一段元素的方法 Array.splice() lastIndexOf(searchvalue,fromindex) **说明:**如果要检索的字符串值没有出现,则该方法返回 -1,该方法对大小写敏感 使用: 1 2 3 4 var str="Hello world!...

2020年7月9日 · 1 min · Archai

一组循环数组

做网页轮播图,或者音乐播放列表时经常要用到一组循环的数组,到最后一项返回第一项,第一项返回最后一项 利用两次判断 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 function doLoop( arr ){ arr.loop_idx = 0; // 返回当前的元素 arr.current = function(){ if( this.loop_idx < 0 ){// 第一次检查 this.loop_idx = this.length - 1;// 更新 loop_idx } if( this.loop_idx >= this.length ){// 第二次检查 this.loop_idx = 0;// 更新 loop_idx } return arr[ this....

2020年7月8日 · 1 min · Archai

ES6中新增关于Array的方法

在javascript中,Array()经常用到,利用ES6中的一些新特性会让数组的处理更加方便快捷 1.迭代空数组 直接创建一个数组 1 2 const arr=new Array(4); //Output:[undefined,undefined,undefined,undefined] 利用map方法,转化成新的数组,企图得到 [0,1,2,3] 数组 1 2 3 const arr=new Array(4); arr.map((ele,index) => index); //Output:[undefined,undefined,undefined,undefined] 解决这个问题可以在创建数组时用到Array.apply apply与call类似,都是用来继承父类的方法的,不同之处是: call() 方法分别接受参数。person.fullName.apply(person1, ["Oslo", "Norway"]); apply() 方法接受数组形式的参数. person.fullName.call(person1, "Oslo", "Norway"); 如果要使用数组而不是参数列表,则 apply() 方法非常方便。 1 2 3 const arr = Array.apply(null, new Array(4)); arr.map((ele,index) => index); //Output:[0,1,2,3] 由此,我们可以创建一个指定最大值、最小值、或者长度生成指定数列的方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 /** * 生成自定义的连续数列 * @param{Number}min * @param{Number}max * @param{Number}len */ function newArr({min = null, max = null, len = null} = {}) { let newArray=[], skip = min if (len == null) {len = max - min + 1} if (min == null) {skip = -max} const arr = Array....

2020年7月6日 · 2 min · Archai

避免多条件并列

开发中有时会遇到多个条件,执行相同的语句,也就是多个||这种: 1 2 3 if (status === 'process' || status === 'wait' || status === 'fail') { doSomething() } 这种写法语义性、可读性都不太好。可以通过switch case或includes这种进行改造。 1 2 3 4 5 6 7 8 9 10 11 switch case switch(status) { case 'process': case 'wait': case 'fail': doSomething() } includes const enum = ['process', 'wait', 'fail'] if (enum.includes(status)) { doSomething()

2020年7月6日 · 1 min · Archai