@iwanglong
2018-10-29T09:40:25.000000Z
字数 3261
阅读 327
技术
本文摘自阮一峰老师的es6讲解,一下只是个人的笔记,更多详细内容可以点这里
ES6允许直接写入变量和函数,作为对象的属性和方法。啥意思呢?不多说,上两个简单的例子吧!
列子1
const foo = "123"; // 定义了一个字符串变量
const baz = {foo}; // 这里baz是一个对象,表现形式为:{foo:"123"}
等同于
const baz = {foo:foo} // key : foo ,value : 变量foo的值
等同于
const o = {
method : function (){
return : "Hello"
}
}
看到这个标题,有点😳,属性名表达式是啥意思?简单来说就是用 这个[]中括号来搞事情,就是对对象的属性搞事情的,到底怎么搞事情,下边举几个🌰就明白了。
更多的Object使用方法可以来这里查看
ES5比较两个值是否相等,只有两个运算符:相等运算符(==)和严格相等运算符(===),这两个运算符都有缺点,前者会自动转换数据类型,后者的NaN不等于自身,以及+0 等于-0。
这种相等性判断逻辑和传统的 == 运算符所用的不同,== 运算符会对它两边的操作数做隐式类型转换(如果它们类型不同),然后才进行相等性比较,(所以才会有类似 "" == false 为 true 的现象),但 Object.is 不会做这种类型转换。
这与===运算符也不一样。===运算符(和==运算符)将数字值-0和+0视为相等,并认为Number.NaN不等于NaN。
Object.is('foo', 'foo'); // true
Object.is(window, window); // true
Object.is('foo', 'bar'); // false
Object.is([], []); // false
var test = { a: 1 };
Object.is(test, test); // true
Object.is(null, null); // true
// 特例
Object.is(0, -0); // false
Object.is(-0, -0); // true
Object.is(NaN, 0/0); // true
这家伙就一个合并操作,用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
Object.assign 方法只会拷贝源对象自身的并且可枚举的属性到目标对象。该方法使用源对象的[[Get]]和目标对象的[[Set]],所以它会调用相关 getter 和 setter。因此,它分配属性,而不仅仅是复制或定义新的属性。如果合并源包含getter,这可能使其不适合将新属性合并到原型中。为了将属性定义(包括其可枚举性)复制到原型,应使用Object.getOwnPropertyDescriptor()和Object.defineProperty() 。
String类型和 Symbol 类型的属性都会被拷贝。
在出现错误的情况下,例如,如果属性不可写,会引发TypeError,如果在引发错误之前添加了任何属性,则可以更改target对象。
注意,Object.assign 不会跳过那些值为 null 或 undefined 的源对象。
对象的每个属性都有一个描述对象(Descriptor),用来控制该属性的行为。Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象。
let obj = { foo: 123 };Object.getOwnPropertyDescriptor(obj, 'foo')// {// value: 123,// writable: true,// enumerable: true,// configurable: true// }
描述对象的enumerable属性,称为“可枚举性”,如果该属性为false,就表示某些操作会忽略当前操作。
目前有4个操作会忽略enumerable为false的属性。
举个例子吧
var obj = {name : 'xiaohong',age : 10,test : 'enumerable is false'}Object.defineProperty(obj1, 'test', {configurable: false,enumerable: false,value: 'not enumerable'});
以上5种方法遍历对象的的键名,都遵守同样的属性遍历的次序规则。
- 首先遍历所有数值键,按照数值升序排列。
- 其次遍历所有字符串键,按照加入时间升序排列
- 最后遍历所有 Symbol 键,按照加入时间升序排列。
Reflect.ownKeys({ [Symbol()]:0, b:0, 10:0, 2:0, a:0 })// ['2', '10', 'b', 'a', Symbol()]