内容主要来自网络,主要来自 MDN
ES(JavaScript)是一门大家都要努力学习语言,也是一门努力不让开发者精通的语言。
ES678 大部分功能能通过Polyfill或者Babel来解决。
也就是说ES5能实现这些功能
/**
* ie78 没有 trim方法
* @returns {string}
*/
if(!String.prototype.trim){
String.prototype.trim = function(){
return this.replace(/(^\s*)|(\s*$)/g, "");
}
还有一些 语法糖 ,语法糖就是指那些没有给语言添加新功能,而只是对人类来说更“甜蜜”的语法。
比如 class ES5的继承
function Base(opt){
}
function SubClass(opt){
Base.call(this,opt);
}
SubClass.prototype = new Page;//继承属性
SubClass.prototype.constructor = SubClass;//防止指向父类的constructor
var obj = new SubClass(opt);//实例化对象
ES6继承的写法:
class Base(opt){
}
class SubClass(opt) extends Base {
super(opt);
}
let obj = new SubClass(opt);
String.prototype.padStart(targetLength [, padString])
String.prototype.padEnd(targetLength [, padString])
'abc'.padStart(10); // " abc"
'abc'.padStart(10, "100"); // "1001001abc"
'abc'.padStart(6,"123465"); // "123abc"
'abc'.padStart(8, "0"); // "00000abc"
'abc'.padStart(1); // "abc"
注意:这是一个实验中的功能,未来浏览器可能会改变语法和功能。
浏览器 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
支持 | 57 | 15 | 48 | No | 44 | 10 |
浏览器 | Android webview | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
支持 | ? | 57 | Yes | 48 | No | ? | 10 |
方法返回一个给定对象自己的所有可枚举属性值的数组,值的顺序与使用for…in循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )。
var values = [];
Object.keys(obj).forEach(function(key){
values.push(obj[key])
})
现在只需要
var values = Object.values(obj)
Object.values(obj)
参数
返回值
var obj = { foo: "bar", baz: 42 };
console.log(Object.values(obj)); // ['bar', 42]
// array like object 长得像有序下标数组的对象
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.values(obj)); // ['a', 'b', 'c']
// array like object with random key ordering 长得像无序下标数组的对象
var an_obj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.values(an_obj)); // ['b', 'c', 'a']注意顺序
// getFoo is property which isn't enumerable 可枚举属性值
var my_obj = Object.create({}, { getFoo: { value: function() { return this.foo; } } });
my_obj.foo = "bar";
console.log(Object.values(my_obj)); // ['bar']
// non-object argument will be coerced to an object 字符串
console.log(Object.values("foo")); // ['f', 'o', 'o'] 实际上string 是 char 的数组['f', 'o', 'o']
Feature | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
Basic support | 54 | Yes | 47 | No | Yes | 10.1 |
浏览器 | Android webview | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
支持 | 54 | 54 | Yes | 48 | No | ? | 10 |
Object.entries()方法返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for…in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环也枚举原型链中的属性)。
Object.entries(obj)
const obj = { foo: 'bar', baz: 42 };
console.log(Object.entries(obj)); // [ ['foo', 'bar'], ['baz', 42] ]
// array like object
const obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.entries(obj)); // [ ['0', 'a'], ['1', 'b'], ['2', 'c'] ]
// array like object with random key ordering
const anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.entries(anObj)); // [ ['2', 'b'], ['7', 'c'], ['100', 'a'] ]
// getFoo is property which isn't enumerable
const myObj = Object.create({}, { getFoo: { value() { return this.foo; } } });
myObj.foo = 'bar';
console.log(Object.entries(myObj)); // [ ['foo', 'bar'] ]
// non-object argument will be coerced to an object
console.log(Object.entries('foo')); // [ ['0', 'f'], ['1', 'o'], ['2', 'o'] ]
// iterate through key-value gracefully
const obj = { a: 5, b: 7, c: 9 };
for (const [key, value] of Object.entries(obj)) {
console.log(`${key} ${value}`); // "a 5", "b 7", "c 9"
}
// Or, using array extras
Object.entries(obj).forEach(([key, value]) => {
console.log(`${key} ${value}`); // "a 5", "b 7", "c 9"
});
var obj = { foo: "bar", baz: 42 };
var map = new Map(Object.entries(obj));
console.log(map); // Map { foo: "bar", baz: 42 }
浏览器 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
支持 | 54 | Yes | 47 | No | Yes | 10.1 |
手机浏览器 | Android webview | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
支持 | 54 | 54 | Yes | 47 | No | No | No |
像同步一样写异步的代码
js一个重大的特点就是异步,但是人类的思维模式天然是同步的。所以要把异步和同步的流程化统一起来。
直接上例子:
getData(data => {
getMoreData(data2 =>{
getMoreData(data3 =>{
})
})
})
var def1 = $.Deferred();
var def2 = $.Deferred();
var def3 = $.Deferred();
def1.done(def2.resolve)
def2.done(def3.resolve)
def3.done(function(){})
new Promise().then().then()...
后面的虽然解决了回调地狱,但是本质上还是回调。
Jedis jedis = new Jedis("localhost");
System.out.println("连接成功");
jedis.set("key", "Hello world");
String key = jedis.get("key")
System.out.println("redis 存储的字符串为: "+ key)
let client = redis.createClient(RDS_PORT,.RDS_HOST,.RDS_OPTS);
client.select(RDS_DATABASE)
client.hmset("key", "Hello world",function(){
client.hmget("key",function(data){
console.log(data)
})
});
async function name([param[, param[, ... param]]]) { statements }
[return_value] = await expression;
AsyncFunction
对象。Promise
对象或者任何要等待的值ES7,asyns和await 更配哦
function resolveAfter2Seconds(x) {
return new Promise(resolve => {
setTimeout(() => {
resolve(x);
}, 2000);
});
}
async function add1(x) {
var a = resolveAfter2Seconds(20);
var b = resolveAfter2Seconds(30);
return x + await a + await b;
}
var ajax = () => {
return new Promise(resolve =>{
setTimeout(() => {
resolve("done");
}, 2000);
})
}
async function getData(x) {
var a = await ajax();
console.log(a)
}
async function myFetch(){
let res = await fetch("http://www.baidu.com/json")
let result = await res.json()
return result
}
myFetch().then(data => console.log(JSON.stringify(data)))
浏览器 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
支持 | 55 | Yes | 52 | No | 42 | 10.1 |
手机浏览器 | Android webview | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
支持 | Yes | 55 | Yes | 52 | No | 42 | 10.1 |
方法返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性)。
Object.getOwnPropertyDescriptor(obj, prop)
undefined
。//拷贝对象
var obj = {
a:"a",
get b(){return "b"}
}
var obj1 = Object.assign({},obj)
var obj2 = Object.create(
Object.getPrototypeOf(obj),
Object.getOwnPropertyDescriptors(obj)
)
console.log(obj)//{a: "a"}
console.log(JSON.stringify(obj))//{"a":"a","b":"b"}
console.log(obj1)//{a: "a", b: "b"}
console.log(JSON.stringify(obj1))//{"a":"a","b":"b"}
console.log(obj2)//{a: "a"}
console.log(JSON.stringify(obj2))//{"a":"a","b":"b"}
var obj = {
a:"a",
get b(){return "b"}
}
JSON.stringify(Object.getOwnPropertyDescriptors(obj))
/*
{
"a":{
"value":"a",
"writable":true,
"enumerable":true,
"configurable":true
},
"b":{
"enumerable":true,
"configurable":true
}
}
*/
浏览器 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
支持 | ? | ? | 50 (50) | ? | ? | ? |
手机浏览器 | Android webview | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
支持 | ? | ? | ? | 50.0 (50) | ? | ? | ? |
Object.getOwnPropertyDescriptor()
Object.defineProperty()
允许在参数定义和函数调用后面使用逗号。
function foo(
param1,
param2,
) {}
foo(param1,param3,)
管好自己的双手,不要用这个方式写就好了。
SharedArrayBuffer 对象用来表示一个通用的,固定长度的原始二进制数据缓冲区,类似于 ArrayBuffer 对象。对象,但它们可以用来在共享内存上创建视图。与 ArrayBuffer 不同的是,SharedArrayBuffer 不能被分离。
一个新的低级别Atomics命名空间对象和一个SharedArrayBuffer构造函数,来作为更高级别并发抽象的原始构建块。共享多个service worker和核心线程之间的SharedArrayBuffer对象的数据。在worker之间共享数据,改善worker之间的协调。
new SharedArrayBuffer(length)
略
略
传送门
Atomics
ArrayBuffer
includes() 方法用来判断一个数组是否包含一个指定的值,如果是,酌情返回 true或 false。
includes() 方法用来判断一个数组是否包含一个指定的值,如果是,酌情返回 true或 false。
arr.includes(searchElement)
arr.includes(searchElement, fromIndex)
[1, 2, 3].includes(2); // true
[1, 2, 3].includes(4); // false
[1, 2, 3].includes(3, 3); // false
[1, 2, 3].includes(3, -1); // true
[1, 2, NaN].includes(NaN); // true
var arr = ['a', 'b', 'c'];
arr.includes('c', 3); //false
arr.includes('c', 100); // false
var arr = ['a', 'b', 'c'];
arr.includes('a', -100); // true
arr.includes('b', -100); // true
arr.includes('c', -100); // true
(function() {
console.log([].includes.call(arguments, 'a')); // true
console.log([].includes.call(arguments, 'd')); // false
})('a','b','c');
略
TypedArray.prototype.includes()
String.prototype.includes()
Array.prototype.indexOf()