1.字符串扩展

1. includes(str) : 判断是否包含指定的字符串
2. startsWith(str) : 判断是否以指定字符串开头
3. endsWith(str) : 判断是否以指定字符串结尾
4. repeat(count) : 重复指定次数

2.数值扩展

1. 二进制与八进制数值表示法: 二进制用0b, 八进制用0o
2. Number.isFinite(i) : 判断是否是有限大的数
3. Number.isNaN(i) : 判断是否是NaN
4. Number.isInteger(i) : 判断是否是整数
5. Number.parseInt(str) : 将字符串转换为对应的数值
6. Math.trunc(i) : 直接去除小数部分

3.数组扩展

1. Array.from(v) : 将伪数组对象或可遍历对象转换为真数组
2. Array.of(v1, v2, v3) : 将一系列值转换成数组
3. find(function(value, index, arr){return true}) : 找出第一个满足条件返回true的元素
4. findIndex(function(value, index, arr){return true}) : 找出第一个满足条件返回true的元素下标

4.对象的扩展

1. Object.is(v1, v2):判断2个数据是否完全相等
2. Object.assign(target, source1, source2..):将源对象的属性复制到目标对象上
3. 直接操作 __proto__ 属性
let obj2 = {};
obj2.__proto__ = obj1;

5.深度克隆

  • 数据类型:

    • 数据分为基本的数据类型(String, Number, boolean, Null, Undefined)和对象数据类型
      • 基本数据类型:存储的是该对象的实际数据
      • 对象数据类型:存储的是该对象在栈中引用,真实的数据存放在堆内存里
  • 复制数据:基本数据类型直接复制

  • 克隆数据:对象/数组

  • 常用的拷贝技术:

    • arr.concat(): 数组浅拷贝

    • arr.slice(): 数组浅拷贝

    • JSON.parse(JSON.stringify(arr/obj)): 数组或对象深拷贝, 但不能处理函数数据

    • 对象/数组的深浅拷贝

例子:

数组的浅拷贝:

 let arr = [1,2,[5,6],3,4];  //嵌套数组
let arr1 = arr.concat([]); //不会改变现有的arr和[]数组,仅仅将返回被连接数组的一个副本
console.log(...arr1); // 1 2 [5, 6] 3 4 arr1[2][0] = 100;
console.log(...arr1); //1 2 [100, 6] 3 4
console.log(...arr); //1 2 [100, 6] 3 4 内部值被修改为浅克隆 let arr2 = arr.slice(2); //不会改变现有的arr数组,只是返回一个子数组
console.log(...arr2); //[100, 6] 3 4 arr2[0][1] = 101;
console.log(...arr2); //[100, 101] 3 4
console.log(...arr); //1 2 [100, 101] 3 4 内部值被修改为浅克隆

对象浅拷贝:

 let obj = {
name: 'wzh',
age: 25,
friend:{
name1:"pppp",
name2:"qqqq"
}
} let obj1 = obj;
obj1.name = "123";
console.log(obj1); //Object {name: "123", age: 25, friend: Object}
console.log(obj); //Object {name: "123", age: 25, friend: Object} 修改源数据为浅拷贝 let obj2 = {};
Object.assign(obj2,obj); obj2.name = "qwe";
obj2.friend.name1 = "ttttt";
console.log(obj2);
console.log(obj); //内部friend.name1被改变,浅拷贝

对象和数组深克隆:

 // 获得变量类型
function getType(target){
return Object.prototype.toString.call(target).slice(8,-1);
} // 深克隆函数
function cloneUtil(target){
let result; if(getType(target) === 'Object'){
result = {};
}else if(getType(target) === 'Array'){
result = [];
}else{
return target;
} // 防止内部还有对象或数组
for (let i in target) { // 获得value
let item = target[i]; if(getType(item) === 'Object' || getType(item) === 'Array'){
result[i] = cloneUtil(item)
}else{
result[i] = item;
}
} return result;
} let obj = {
name: 'wzh',
age: 25,
friend:{
name1:"pppp",
name2:"qqqq"
}
} let obj2 = cloneUtil(obj);
obj2.friend.name1 = "xxxxxx";
console.log(obj2);
console.log(obj); //没有修改为深克隆

6.Set和Map容器

  • Set容器 : 无序不可重复的多个value的集合体

    • 方法:Set(),Set(array),add(value),delete(value),has(value),clear(),size
  • Map容器 : 无序的 key不重复的多个key-value的集合体
    • 方法:Map(),Map(array),set(key,value),get(key),delete(key),has(key),clear(),size

例子:使用set将数组去重

 let uniqArr = target => [...new Set(target)];

 let arr = [2,1,2,4,6,1,3,3,7];
let arr1 = uniqArr(arr); console.log(...arr); //2 1 2 4 6 1 3 3 7
console.log(...arr1); //2 1 4 6 3 7

7.for in和for of遍历

  • for in:遍历数组下标或对象的key

  • for of:遍历数组值或有iterator接口的容器,不能遍历不同Object对象

 let arr = [9,8,7,6,5,4,3];
let obj = {
name:"wzh",
age:25
} for (let i in arr) {
console.log(i); //返回数组下标
} for (let i in obj) {
console.log(i); //返回对象的key
console.log(obj[i]); //返回对象value
} for (let i of arr) {
console.log(i); //返回数组value
} //对具有iterator的接口的容器可以遍历,不能对普通对象遍历
let set = new Set(arr);
for (let i of set) {
console.log(i); //返回set的value }

JS的ES6扩展的更多相关文章

  1. (译+注解)node.js的C++扩展入门

    声明:本文主要翻译自node.js addons官方文档.部分解释为作者自己添加. 编程环境: 1. 操作系统 Mac OS X 10.9.51. node.js v4.4.22. npm v3.9. ...

  2. ES6...扩展运算符(数组或类数组对象)

    数组和类数组对象定义 数组:[] 类数组对象:只包含使用从零开始,且自然递增的整数做键名,并且定义了length表示元素个数的对象,我们就认为他是类数组对象. 数组使用 let foo_arr = [ ...

  3. Atitit js es5 es6新特性 attilax总结

    Atitit js es5 es6新特性 attilax总结 1.1. JavaScript发展时间轴:1 1.2. 以下是ES6排名前十的最佳特性列表(排名不分先后):1 1.3. Es6 支持情况 ...

  4. ES6扩展运算符的几个小技巧

    es6扩展运算符,也就是...  ,作用是将一个数组转为用逗号分隔的参数序列. 那么问题来了,我们为啥要用这么奇怪的东东涅,当然因为它能大大提高我们的开发效率.所以,可别小看这三个点. 1.复制数组( ...

  5. ExtJs对js基本语法扩展支持

    ExtJs对js基本语法扩展支持 本篇主要介绍一下ExtJs对JS基本语法的扩展支持,包括动态加载.类的封装等. 一.动态引用加载 ExtJs有庞大的类型库,很多类可能在当前的页面根本不会用到,我们可 ...

  6. 让 Node.js 支持 ES6 的语法

    为了让 Node.js 支持 ES6 的语法, 需要使用 Babel. 安装 es-checker 在使用 Babel 之前 , 我们先检测一下当前 node 对 es6 的支持情况. 在命令行下执行 ...

  7. JS的ES6的Generator

    JS的ES6的Generator 1.Generator函数的概念: ES6提供的解决异步编程的方案之一,现在已经不怎么用了被淘汰了. Generator函数是一个状态机,内部封装了不同状态的数据. ...

  8. JS的ES6的基础语法

    JS的ES6 1.let let age = 12; (1). 作用: 与var类似, 用于声明一个变量 (2). 特点: 在块作用域内有效 不能重复声明 不会预处理, 不存在提升 (3). 应用: ...

  9. ES6 模版字符串及常用的es6扩展方法

    1.ES6 模版字符串es6 模版字符串主要用于简化字符串的拼接 <script type="text/javascript"> let obj={name:'rdb' ...

随机推荐

  1. python装饰器的使用场景(转)

    原文:https://www.cnblogs.com/wupeiqi/articles/4980620.html 1.必备 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #### ...

  2. golang学习笔记 ---interface

    1. 什么是interface接口 interface 是GO语言的基础特性之一.可以理解为一种类型的规范或者约定.它跟java,C# 不太一样,不需要显示说明实现了某个接口,它没有继承或子类或“im ...

  3. 面试题 js重写原生函数(以push为例)

    先说明一下为什么要写这个,因为最近在面试,面试的时候面试官问了这个问题,当时是真的没有答上来,回来之后自己考虑了一下,现在给大家分享 要求如下: 重写js push函数,使其能够在push的同时打印出 ...

  4. markdown使用emoji

    前几日写博客的时候在想是否能够在markdown中使用emoji呢

  5. [转]解决ubuntu16.04 ‘E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用) ’ 问题

    当运行sudo apt-get install/update/其他命令时,会出现如下提示: E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不 ...

  6. 在ZYNQ上裸机跑ARM程序的演示

    今天给大家演示如何在ZYNQ上,裸机跑ARM程序,本测试用的是米尔Z-turn Board单板,测试代码用的XILINX官方的C语言测试程序,用于测试挂接在ARM总线上的设备是否正常,并在串口终端打印 ...

  7. BUAA-OO-2019 第二单元总结

    第五次作业 本次作业,需要完成的任务为单部多线程傻瓜调度(FAFS)电梯的模拟. 设计策略 先来先服务的单电梯是一个标准的"生产者-消费者"模型.虽然在本次作业中调度器似乎是不必要 ...

  8. python 之 sys.stdout输出不换行

    在处理程序打进度条时,希望不换行显示进度,可以使用sys.stdout相关函数来进行处理. 1.print 输出不换行 首先可以使用print函数来整体输入,利用,结尾就可以在同一行内显示: # py ...

  9. android中实现service动态更新UI界面

    案例:通过service向远程服务器发送请求,根据服务器返回的结果动态更新主程序UI界面,主程序可实时关闭或重启服务. 注册BroadcastReceiver 在主程序activity中注册一个Bro ...

  10. Linux 系统管理 : last 命令详解

    原文 last命令用于显示用户最近登录信息.单独执行last命令,它会读取/var/log/wtmp的文件,并把该给文件的内容记录的登入系统的用户名单全部显示出来 语法 last(选项)(参数) 选项 ...