03ES6扩展

Posted mingliangge

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了03ES6扩展相关的知识,希望对你有一定的参考价值。

模板字符串

模板字符串与一般字符串的区别

1、一般字符串用 ‘ ‘ 或者 " " 拼接起来的,模板字符串是用 ` ` 来拼接的。

2、一般字符串和变量的连接是用  + 连接起来的,模板字符串是在 ` ` 里面用 ${ 变量名 } 方式来拼接的,如:

function haha(name,age){
//一般字符串的方式拼接
div1.innerText = ‘我的名字是‘ + name + ‘,我今年‘ + age + ‘岁了‘;

//模板字符串的方式拼接
div2.innerText = `我的名字是 ${name} ,我今年 ${age} 岁了`

//明显看出了模板字符串比一般字符串简洁、容易书写、不易出错的特点
}

 

3、 另外模板字符串还可以进行嵌套,如

div2.innerText = `我的名字是 ${ `Mr. ${name} ` } `; //在名字前面加了个Mr.

 

4、一般字符串换行 必须在尾部用    而模板字符串换行  在尾部直接回车即可,如:

div1.innerhtml = ‘<span>好人</span>;
//一般字符串:一个字符串必须一行填写完,若要换行就得在尾部加上  ,否则就会报错

div2.innerHTML = `<span>
好
人
</span>`
//模板字符串:一个字符串可以分多去写,只要在尾部换行即可

 

字符串新方法

padStart

//padStart顾名思义在xx字符串前面填充

{
    const str1 = ‘bb‘;

    let str2 = str1.padStart(8,‘hello‘);

    //就是以bb结尾,前面循环hello字符串达到8位。

    console.log(str2); //结果是 hellohbb 
}

padEnd

//padEnd顾名思义在xx字符串后面填充

{
    const str1 = ‘aa‘;

    let str2 = str1.padEnd(8,‘hello‘);

    //就是以aa开头,后面循环hello字符串达到8位。

    console.log(str2); //结果是 aahelloh
}

 

repeat

//repeat顾名思义就是重复输出字符串n次

{
    const str = ‘ha‘;

    let str1 = str.repeat(10);

    //就是将str常量循环10次

    console.log(str1);  //结果是 hahahahahahahahahaha
}

 

startsWith

//startsWith顾名思义就是检测字符串是否以xx开头,如:

{
    const str = "I am happy!";

    let status = str.startsWith(‘I‘); //检测字符串是否以I开头,是返回true,否返回false

    console.log(status);  //结果是true
}

endsWith

//endsWith顾名思义就是检测字符串是否以xx结尾,如:

{
    const str = "I am happy!";

    let status = str.endsWith(‘happy!‘); //检测字符串是否以happy!j结尾,是返回true,否返回false

    console.log(status);  //结果是true
}

 

includes

//includes顾名思义就是用来检测字符串中是否含有xx,如:

{
    //es6之前,检测字符串里是否含有xx
    var str = "I am happy!";
    if(str.indexOf(‘am‘) !== -1){  //判断表达式可以改成(~str.indexOf(‘am‘)),因为 ~x = -(x+1)
        console.log("存在")
    } 

    //es6的includes方法,检测字符串里是否含有xx
    const stt = "I am happy!";
    if(stt.includes(‘hap‘)){
        console.log(‘includes方法检测到hap存在‘);
    }
}

 

遍历字符串

for of 方法

//遍历字符串(es6的for of 方法)
const str = ‘zhangzhanghaha‘;

for(let word of str){
    console.log(word);
}

 

其他方法

//遍历字符串(字符串方法)
const str = ‘zhangzhanghaha‘;

for(var i = 0, len = str.length; i < len; i++){
    // console.log(str[i]);  //这两种方法都行
    console.log(str.charAt(i)); //这两种方法都行
}

 

//遍历字符串(字符串转数组后遍历)
const str = ‘zhangzhanghaha‘;

let arr = str.split(‘‘);  //将字符串转为数组,两种方法都行
let arr = Array.prototype.slice.call(str);  //将字符串转为数组,两种方法都行

// console.log(arr);

arr.forEach(function(word){  //遍历输出
    console.log(word);
});

 

//遍历字符串(扩展运算符转为数组,后遍历)
const str = ‘zhangzhanghaha‘;

// const stt = [...str]; //两种扩展方式都可以
const [...stt] = str; //两种扩展方式都可以

//console.log(stt); 

stt.forEach(function(word){  //遍历输出
    console.log(word);
});

 

Unicode表示法

Unicode是一项标准,包含字符集、编码方案等。

//它是为了解决传统的字符编码方案的局限而产生的,为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

1、一般浏览器只支持 0000 - ffff 的Unicode编码字符,为了解决这个局限性就有了Unicode表示法。

2、ES6对这一点做出了改进,只要将码点放入大括号,就能正确解读该字符。如:

"u{20BB7}"
// "?"

"u{41}u{42}u{43}"
// "ABC"

let hello = 123;
hellu{6F} // 123

‘u{1F680}‘ === ‘uD83DuDE80‘
// true

 

3、javascript共有6种方法可以表示一个字符。

‘z‘ === ‘z‘  // true
‘172‘ === ‘z‘ // true
‘x7A‘ === ‘z‘ // true
‘u007A‘ === ‘z‘ // true
‘u{7A}‘ === ‘z‘ // true

 

正则修饰符扩展

//之前学过有i、m、g修饰符,现在es6新增有u、y

ES6构造函数的变化

const reg = new RegExp(/w/g,‘i‘);  //第一个参数写的g修饰符,会被第二个参数的i修饰符代替掉

u修饰符

//匹配Unicode码点,要求与正则表达式的码点保持一致

//没有加u的情况,只要含有与其对应的就返回true,后面可以增加多个
console.log(/^ud83d/.test(‘ud83dudc36‘));

//加了u的情况,将‘ ‘里面的Unicode码点看作一个整体来匹配,只要完全符合才返回true
console.log(/^ud83d/u.test(‘ud83dudc36‘));

y修饰符

//也称粘连修饰符。y 修饰符的作用与 g 修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。不同之处在于,g 修饰符只要剩余位置中存在匹配就可,而 y 修饰符确保匹配必须从剩余的第一个位置开始,这也就是“粘连”的含义。

var s = ‘aaa_aa_a‘;
var r1 = /a+/g;
var r2 = /a+/y;
 
console.log(r1.exec(s)) //["aaa", index: 0, input: "aaa_aa_a"]
console.log(r2.exec(s)) //["aaa", index: 0, input: "aaa_aa_a"]
console.log(r1.exec(s)) //["aa", index: 4, input: "aaa_aa_a"]
console.log(r2.exec(s)) //null
console.log(r1.exec(s)) //["a", index: 7, input: "aaa_aa_a"]
console.log(r2.exec(s)) //["aaa", index: 0, input: "aaa_aa_a"]

 

数值扩展

新的进制表示法

//八进制(octonary),以0o或0O开头,o可以大写也可以小写
console.log(0o16); //结果为14

//二进制(binary),以0b或0B开头,b可以大写也可以小写
console.log(0b1111); //结果是15

 

新的方法

parseInt 与 parseFloat

//本来parseInt是window的对象方法,现在转为Number对象了
 zhi = Number.parseInt(‘28px‘);    //必须以数字开头才可以提取出来,如果不是,结果NaN。

//本来parseFloat是window的对象方法,现在转为Number对象了
zhi1 = Number.parseFloat(‘0.123abc‘); //从第一个字符开始解析每个字符,直至遇到一个无效的浮点数字符为止。

//注: 如果字符串中包含有效的16进制格式,paseInt(‘0xf‘)将‘0x‘转换为相同大小的十进制,而paseFloat(‘0xf‘)只会输出0

 

isNaN

//判断某个数字是否是NaN
console.log(Number.isNaN(NaN)); //ture
console.log(Number.isNaN(-NaN));//ture
console.log(Number.isNaN(33));//false
console.log(Number.isNaN(‘HI‘));//false

 

isFinite

//判断某个数字是否是有限的
console.log(Number.isFinite(123)); //true
console.log(Number.isFinite(‘123‘)); //false
console.log(Number.isFinite(8 / 0)); //false
console.log(Number.isFinite(8 / 4)); //true

 

安全数

//最大安全数是: 2的53次减1 (Number.MAX_SAFE_INTEGER)
console.log(Number.MAX_SAFE_INTEGER);

//最小安全数是: -2的53次减1 (Number.MIN_SAFE_INTEGER)
console.log(Number.MIN_SAFE_INTEGER);

//判断某个数字是否是安全数: Number.isSafeInteger
console.log(Number.isSafeInteger(1234567)); //true
console.log(Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1)); //false

 

幂运算

//Number对象的幂运算
console.log(2**3); //2的3次
console.log((2**53) - 1); //2的53次减1
console.log(2**3**2); //不加括号的时候是从右到左运算的,先算3的2次(是9),再算2的9次
console.log( (2**3) ** 2); //先算2的3次(是8),在算8的2次

//Math对象也有幂运算
console.log(Math.pow(2,53) - 1); //2的53次减1

 

函数扩展

默认参数

ES6之前

//es6之前设置默认参数
function add(a,b){
    a = a || 1; //设置默认值为1
    b = b || 1; //设置默认值为1
    return a + b;
}
console.log(add());

 

ES6

//es6设置默认参数
function add(a = 1 , b = 1){
    return a + b;
}
console.log(add());

 

剩余参数(...)

//跟扩展运算符一样是...  ,但是扩展运算符是做扩展,剩余参数是做结合的

...当扩展运算符时:

//将abc三个数组的值提取出来,合并到一个新的数组里面
const a = [1,2,3];
const b = [4,5,6];
const c = [7,8,9];

const d = [...a,...b,...c];  //...a表示继承a里面的全部值

 

...当剩余参数时:

function add(type,...number){    //除了第一个参数,剩下的参数都结合在number里面
    console.log(type);
    console.log(...number);
}
add(‘sum‘,1,2,3,4,5,6);

再如:

function sum(...numbers){
    return numbers.reduce(function(a,b){
        return a+b;
    },0);
}
console.log(sum(1,2,3,4,5));

 

箭头函数

//当函数只有一行代码,并且有返回值时,可以
const add = ( a , b ) => a + b; //箭头前面是接收的参数,箭头后面的是返回值代码
console.log(add(1,2));

//当函数只有一行代码,并且不需要返回值时,可以
const aadd = ( a , b ) => void console.log(a + b);
aadd(3,3);

//当函数有多行代码,有返回值时,可以
const ha = (a,b) => {
    a +=2;
    b +=2;
    return a+b;
}
console.log(ha(1,2));

//当函数有多行代码,但不需要返回值,可以
//在 { } 里面省略掉 return 即可

注意:箭头函数没有类数组 argument ,若需要类数组可以利用剩余参数方法做,如:

const count = (...arg) => {     //利用剩余参数方法做一个类数组
    console.log(arg[0]);
    console.log(arg[1]);
}
count(1,2,3,4,5,6,7);

注意:箭头函数没有自己的this指向,一般函数的this指向是函数本身,箭头函数的this是自身所处环境的this

 

对象扩展

简洁表示法

一般表示形式

const hah = () => {
    const name = ‘静静‘;
    const age = 23;
    return{
        name : name, //返回一个name属性,属性值是上面定义的name
        age : age, //返回一个age属性,属性值是上面定义的age
        happy : function(){  //返回一个函数
            console.log(this.name + this.age);    
        }
    };
};
const mei = hah();

 

简洁表示法

const bbc = () => {
    const name = ‘萱萱‘;
    const age = 23;
    return{
        name, //相当于name=name
        age,  //相当于age=age
        happy(){ //可以省略function字段
            console.log(this.name + this.age);
        }
    }
}
const bb = bbc();

 

属性名表达式

const name = ‘ying‘;
const age = 23;

const aa = {
    [name] : ‘好‘, //属性名用上面的name变量
    [‘a‘ + (age - 1)] : ‘非常好‘  //同时属性名还可以进行简单的运算
}

 

扩展运算符及新方法

扩展运算符

扩展运算符之 复制操作

const oo = {    //const声明的常量,引用数据可修改,但不能清空
    a : 1,
    b : 2,
    c : {
        cc : ‘cc‘,
    }
}
const bb = {...oo}; //拷贝oo对象的数据: 基本数据类型是深拷贝,引用数据类型是浅拷贝
console.log(bb);

bb.c.cc = ‘ddddddd‘; //因为是引用数据类型,修改bb的数据oo也会修改
console.log(oo);    

扩展运算符之 合并操作

const a1 = {
    a:1,
    b:2
}
const b1 = {
    c:3,
    d:4
}
const ab = {...a1,...b1};  //拷贝a1,b1,里面是基本数据类型的话就深拷贝
console.log(ab);

ab.a = 33;     //更改ab.a的话,a1.a不会受到影响
console.log(a1.a);

 

Object.is

// 与 === 作用几乎一样,不一样的地方就是:

console.log(+0 === -0); //全等判断下是返回true
console.log(Object.is(+0,-0)); //Object.is判断下返回false

console.log(NaN === NaN); //全等判断下返回false
console.log(Object.is(NaN,NaN)); //Object.is判断下返回true

 

Object.assign

// 与   ...扩展运算符的合并对象操作   几乎一样。

//不一样地地方就是: ... 有更多地功能,而Object.assign没有

const a1 = {
    a:1,
    b:2
}
const b1 = {
    c:3,
    d:4
}
const ab = Object.assign( a1 , b1 , {e:5,f:6} );  //合并对象
console.log(ab);

 

 

Object.keys

//获取对象里每一个key值

const a1 = {
    a:1,
    b:2,
    c:3,
    d:4,
    e:5
}
console.log(Object.keys(a1)); //将对象里的key值都塞到一个数组里

Object.values

//获取对象里每一个value值

const a1 = {
    a:1,
    b:2,
    c:3,
    d:4,
    e:5
}
console.log(Object.values(a1)); //将对象里的key值都塞到一个数组里

Object.entries

//获取对象里每一个键值对

const a1 = {
    a:1,
    b:2,
    c:3,
    d:4,
    e:5
}
console.log(Object.entries(a1)); //将对象里的 每个键值对做一个数组  再将每一个数组塞到一个大数组里

 

遍历上面的数组

// 遍历key值
for(let i of Object.keys(a1)){
    console.log(i);
}
// 遍历value值
for(let j of Object.values(a1)){
    console.log(j);
}
//遍历键值对
for(let [k,v] of Object.entries(a1)){
    console.log(k,v);
}

 

 

新方法

__proto__

//某个对像都有的原型

//__proto__  对象里面的原型
const a1 = {a:1}; 
console.log(a1); //可以看出__proto__的原型是Object
//可以将这个原型打印出来
console.log(a1.__proto__);

 

Object.setPrototypeOf

//可以修改对象的原型。但性能比较低下,个人建议谨慎使用

const a = {
    a:1
}
const b = {
    b:1
}
const obj = Object.create(a); //将a对象作为原型,生成一个obj对象

//这样的话 obj.__proto__ === a
console.log(obj.__proto__); //这里跟输出a对象一模一样

//现在我们开始修改对象的原型
Object.setPrototypeOf(obj,b); //将obj对象的原型,修改成b对象的原型
console.log(obj.__proto__); //这样obj输出的就是b了

 

Object.getPrototypeOf

//可以读取对象的原型

const a = {
    a:1
}
const obj = Object.create(a); //将a对象作为原型,生成一个obj对象

//这样的话 obj.__proto__ === Object.getPrototypeOf(obj) === a
console.log(obj.__proto__); //这里跟输出a对象一模一样
console.log(Object.getPrototypeOf(obj)); //这里跟输出a对象一模一样

//我们还可以判断 obj.__proto__ 和 Object.getPrototypeOf(obj) 是否全等
console.log(obj.__proto__ === Object.getPrototypeOf(obj)); //结果是true的

 

super

//可以访问  原型对象上的属性和方法

const a = {
    name : ‘小蝴蝶‘
}
const b = {
    say(){ //只有对象里的函数,并且使用的是简洁表示法才会有super
        console.log(`我的名字是${super.name}`); //2、这样这里就能访问到a对象里面的方法
    }
}
Object.setPrototypeOf(b,a); //1、将a的原型赋值给b
b.say();

 

 

数组扩展

数组之扩展运算符

//数组分解成每一项参数。当然也可使用解构赋值的方法
const yy = (a,b,c,d) => {
    console.log(a);
    console.log(b);
    console.log(c);
    console.log(d);
}

// console.log(...[1,2,3,4]);
//或者
const bb = [1,2,3,4];
console.log(...bb);
//还可以
//console.log ( yy.apply(null,bb) ) ;  //结果跟上面这个扩展运算符没什么区别

 

数组扩展运算符的其他使用

// 合并数组
const a = [1];
const b = [2];
const c = [3];

const ob = [3,2,1,...a,...c]; //合并现有的数组 跟 已有的数组
console.log(ob)

const obj = [...a,...b,...c]; //合并已有的数组
console.log(obj);

//复制数组
const obj1 = [...a]; //复制了a数组
const [...obj2] = a; //这样也可以复制a数组

 

生成器函数

扩展运算符还可以: 将生成器函数传出来的值,作为数组对象形成数组

//扩展运算符可以: 将生成器函数传出来的值,作为数组对象形成数组

function *ha(){
    console.log(‘先输出这条语句‘);
    yield ‘传出去的第一个值‘; //[ji?ld],将引号里面的值传出去

    console.log(‘后输出这条语句‘);
    yield ‘传出去的第二个值‘; //[ji?ld],将引号里面的值传出去
}

const arr = [...ha()]; //接收生成器函数传出来的值,并放在一个数组里面
console.log(arr);

 

注:生成器函数的* ,可以跟function黏在一起,也可以跟函数名黏在一起,二选一

另外生成器函数是可以分段执行的

//另外生成器函数是可以断点执行的
const gg = ha(); 
gg.next(); //先执行第一个yield及以上的内容
setTimeout(function(){
    gg.next();  //后执行第二个yield及中间的内容
},1000);

 

 

set集合

//set集合
let set = new Set([1,2,3,4,5]);

//利用扩展运算符转成数组
const a = [...set];
console.log(a);

 

 

Array.from

//将类数组 转换 为数组

//手动创建一个类数组。手动创建的类数组,属性名必须是数组,必须手写一个length
const arg = {
    1:‘diyi‘,
    2:‘haha‘,
    3:‘en‘,
    4:false,
    length:2  //因为长度是2,所以转换成类数组的时候只会取前面两项
}

//开始将arg类数组转换为数组
// console.log(Array.from(arg));

//Array.from还有一个回调函数。该回调函数可以改变返回的数组
console.log(Array.from(arg,function(item){  //item表示数组的每一项
    return item + ‘123‘;  //每一项后面都加一个123的字符串
}));

 

还有其他将类数组转换为数组的方法,只是它们没有回调函数这个可选项

Array.prototype.slice.call();

[].slice.call();

[...]

 

 

Array.of

//将传进去的参数合成一个数组

//Array.of
console.log(Array.of(1,2,3,4,5,6)); //将传进去的参数和成一个数组

 

 

Array # fill

//填充数组

//新建一个长度为10的数组
let arr = new Array(10); //长度为10的数组创建好了,但是里面是空的

//所以我们可以进行填充
let arr1 = new Array(10).fill(3); //在里面填充10个3

//当然我们还可以指定填充多少个
let arr2 = new Array(10).fill(3,0,3);  
//第一个参数: 是填充的内容,
//第二个参数: 是从下标为0的数组开始,
//第三个参数: 填充到下标为3的值,不包括下标为3的

//最后还有,当数组是非空数组时,里面的值会被覆盖
let arr3 = [1,2,3,4,5];
arr3.fill(‘你好‘);  //这样里面的所有值都会覆盖成‘你好‘

 

 

Array.includes

//判断某数组  是否含有xx值,有就返回true,没有就返回false

const arr = [1,2,3,4,5];
console.log(arr.includes(2)); //判断arr数组是否含有2
console.log(arr.includes(22));

 

 

keys、values 和 entries

const arr = [‘aa‘,‘bb‘,‘cc‘,‘dd‘,‘ee‘];

// keys
for(let i of arr.keys()){  //输出数组每一项的下标
    console.log(i);
}

// values
for(let j of arr.values()){  //输出数组每一项的值
    console.log(j);
}

// entries
for(let [k,v] of arr.entries()){  //输出每一项下标 及 对应的值
    console.log(k,v);
}

 

 

find

//根据条件(回调函数),按顺序遍历数组,当回调返回true时,就返回当前遍历到的

const arr = [1,3,4,5].
find(function(value,index,array){  
//默认传入三个参数,命名随意
//第一个参数: 数组的值
//第二个参数: 数组的下标
//第三个参数: 数组本身

    console.log(‘value值为‘+value);
    console.log(‘对应的下标为为‘+index);
    // console.log(‘数组本身为‘+array);

    return value % 2 === 0; 
    //当values为偶数时,返回true
    //然后返回当前为true的那项数组,及前面遍历到的数组。即4为偶数,从值为1的开始遍历到值为4的
});
console.log(arr); //当打印这个数组时,返回的是 另其为true的value值,即4

 

 

findIndex

//根据条件(回调函数),按顺序遍历数组,当回调返回true时,就返回当前遍历到的下标

//用法跟find一模一样,但最后返回的是下标。
//用的是上面的例子,这里做一下简化
const arr = [1,3,4,5].findIndex((value,index,array) => value % 2 === 0);

console.log(arr); //这里返回的就是4对应的下标

 

//findIndex的回调函数,return那里可以做一下复杂的判断表达式:Number.isNaN(value)    .判断里面的值是否NaN

以上是关于03ES6扩展的主要内容,如果未能解决你的问题,请参考以下文章

Android 嵌套片段方法

03代码格式化+高亮

30秒就能看懂的JavaScript 代码片段

测试扩展类时的 ES6 基类(超级方法)的玩笑模拟方法

vue2.0 代码功能片段

ES6简单扩展和单文件组件