标签:es5 script roc 表达 欢迎来到 参数 symbol prope level
var foo = 'bar';
var baz = {foo};
console.log( baz ) // { foo: 'bar' }
//等同于
var foo = 'bar';
var baz={ foo:foo};
console.log( baz ) // { foo: 'bar' }
var func= {
method() {
return "这里是ES6方法简写!";
}
};
// 等同于
var func= {
method: function() {
return "这里是ES6以前的方法!";
}
};
定义对象属性的两种方法
// 方法一
obj.foo = true;
// 方法二
obj['a' + 'bc'] = 123;
let propKey = 'foo';
let obj = {
[propKey]: true,
['a' + 'bc']: 123 // ES5使用大括号时不能这样定义
}
let obj = {
['f' + 'unc']() {
return '欢迎来到w3cschool';
}
};
obj.func() // 欢迎来到w3cschool
? ES6一共有5种方法可以遍历对象的属性
for...in
for...in循环遍历对象自身的和继承的可枚举属性(不含Symbol属性)。
Object.keys(obj)
返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性)
Object.getOwnPropertyNames(obj)
? 返回一个数组,包含对象自身的所有属性(不含Symbol属性,但是包括不可枚举属性)。
Object.getOwnPropertySymbols(obj)
? 返回一个数组,包含对象自身的所有Symbol属性。
Reflect.ownKeys(obj)
返回一个数组,包含对象自身的所有属性,不管是属性名是Symbol或字符串,也不管是否可枚举。
总结:同样的属性遍历次序规则:
(1)为对象添加属性
//将x属性和y属性添加到Person 类的对象实例。
class Person {
constructor(x, y) {
Object.assign(this, {x, y});
}
}
(2)为对象添加方法
Object.assign(Person.prototype, {
method1(arg1, arg2) {
···
},
method2() {
···
}
});
// 等同于下面的写法
Person.prototype.method1 = function (arg1, arg2) {
···
};
Person.prototype.method2 = function () {
···
};
(3)克隆对象
//将原始对象拷贝到一个空对象,就得到了原始对象的克隆。
//此方法为浅拷贝,不能克隆它继承的值。
function clone(origin) {
return Object.assign({}, origin);
}
(4)合并多个对象
//将多个对象合并到某个对象。
const merge =function(target, ...sources){
Object.assign(target, ...sources);
}
(5)为属性指定默认值
//DEFAULTS对象是默认值,options对象是用户提供的参数。
//Object.assign方法将DEFAULTS和options合并成一个新对象,
//如果两者有同名属性,则option的属性值会覆盖DEFAULTS的属性值。
const DEFAULTS = {
logLevel: 0,
outputFormat: 'html'
};
function processContent(options) {
options = Object.assign({}, DEFAULTS, options);
}
ES5比较两个值是否相等
+0 === -0 //true
NaN === NaN // false
Object.is 同值相等算法
Object.is(+0, -0) // false
Object.is(NaN, NaN) // true
补充:+0与-0的用处:更多应用在实际业务,例如负号代表运动的方向
var { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
x // 1
y // 2
z // { a: 3, b: 4 }
//解构赋值必须是最后一个参数
let { ...x, y, z } = obj; // 句法错误
let { x, ...y, ...z } = obj; // 句法错误
//解构赋值拷贝的是这个值的**引用
let obj = { a: { b: 1 } };
let { ...x } = obj; // 解构赋值
obj.a.b = 2;
x.a.b // 2
扩展运算符( ... )用于取出参数对象的所有可遍历属性,拷贝到当前对象之中。
如果用户自定义的属性,放在扩展运算符后面,则扩展运算符内部的同名属性会被覆盖掉。
let z = { a: 3, b: 4 };
let n = { ...z }; // n的值 { a: 3, b: 4 }
// 相当于Object.assign方法
let m = Object.assign( {}, z ); // m的值 { a: 3, b: 4 }
let ab = { ...a, ...b };
// 等同于
let ab = Object.assign({}, a, b);
let newobj= { ...obj, x: 1, y: 2 };
// 等同于
let newobj= Object.assign({}, obj, { x: 1, y: 2 });
标签:es5 script roc 表达 欢迎来到 参数 symbol prope level
原文地址:https://www.cnblogs.com/xuzhengguo/p/12041169.html