js-ES6学习笔记-对象的扩展
2017-02-21 21:33
399 查看
1、ES6允许直接写入变量和函数,作为对象的属性和方法。这种写法用于函数的返回值,将会非常方便。CommonJS模块输出变量,就非常合适使用简洁写法。
2、ES6 允许字面量定义对象时,用表达式作为对象的属性名,即把表达式放在方括号内。
3、ES5比较两个值是否相等,只有两个运算符:相等运算符(
ES6提出“Same-value equality”(同值相等)算法,用来解决这个问题。
4、
对于这种嵌套的对象,一旦遇到同名属性,
注意,
5、ES5有三个操作会忽略
ES6新增了一个操作
总的来说,操作中引入继承的属性会让问题复杂化,大多数时候,我们只关心对象自身的属性。所以,尽量不要用
6、属性的遍历:
for...in——遍历对象自身的和继承的可枚举属性(不含Symbol属性)。
[b]Object.keys(obj)——返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性)。[/b]
[b][b]Object.getOwnPropertyNames(obj)——返回一个数组,包含对象自身的所有属性(不含Symbol属性,但是包括不可枚举属性)。[/b][/b]
[b][b][b]Object.getOwnPropertySymbols(obj)——返回一个数组,包含对象自身的所有Symbol属性。[/b][/b][/b]
[b][b][b][b]Reflect.ownKeys(obj)——返回一个数组,包含对象自身的所有属性,不管是属性名是Symbol或字符串,也不管是否可枚举。[/b][/b][/b][/b]
以上的5种方法遍历对象的属性,都遵守同样的属性遍历的次序规则。
首先遍历所有属性名为数值的属性,按照数字排序。
其次遍历所有属性名为字符串的属性,按照生成时间排序。
最后遍历所有属性名为Symbol值的属性,按照生成时间排序。
7、ES5 引入了
上面代码中,
8、现在有一个提案,引入了“Null 传导运算符”(null propagation operator)
“Null 传导运算符”有四种用法。
var ms = {}; function getItem (key) { return key in ms ? ms[key] : null; } function setItem (key, value) { ms[key] = value; } function clear () { ms = {}; } module.exports = { getItem, setItem, clear }; // 等同于 module.exports = { getItem: getItem, setItem: setItem, clear: clear };
2、ES6 允许字面量定义对象时,用表达式作为对象的属性名,即把表达式放在方括号内。
let propKey = 'foo'; let obj = { [propKey]: true, ['a' + 'bc']: 123 };
3、ES5比较两个值是否相等,只有两个运算符:相等运算符(
==)和严格相等运算符(
===)。它们都有缺点,前者会自动转换数据类型,后者的
NaN不等于自身,以及
+0等于
-0。
ES6提出“Same-value equality”(同值相等)算法,用来解决这个问题。
Object.is就是部署这个算法的新方法。它用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致。
+0 === -0 //true NaN === NaN // false Object.is(+0, -0) // false Object.is(NaN, NaN) // true
4、
Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。注意,如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。
Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。
对于这种嵌套的对象,一旦遇到同名属性,
Object.assign的处理方法是替换,而不是添加。
注意,
Object.assign可以用来处理数组,但是会把数组视为对象。
Object.assign([1, 2, 3], [4, 5]) // [4, 5, 3] //上面代码中,Object.assign把数组视为属性名为0、1、2的对象,因此源数组的0号属性4覆盖了目标数组的0号属性1。
5、ES5有三个操作会忽略
enumerable为
false的属性。
for...in循环:只遍历对象自身的和继承的可枚举的属性
Object.keys():返回对象自身的所有可枚举的属性的键名
JSON.stringify():只串行化对象自身的可枚举的属性
ES6新增了一个操作
Object.assign(),会忽略
enumerable为
false的属性,只拷贝对象自身的可枚举的属性。
总的来说,操作中引入继承的属性会让问题复杂化,大多数时候,我们只关心对象自身的属性。所以,尽量不要用
for...in循环,而用
Object.keys()代替。
6、属性的遍历:
for...in——遍历对象自身的和继承的可枚举属性(不含Symbol属性)。
[b]Object.keys(obj)——返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性)。[/b]
[b][b]Object.getOwnPropertyNames(obj)——返回一个数组,包含对象自身的所有属性(不含Symbol属性,但是包括不可枚举属性)。[/b][/b]
[b][b][b]Object.getOwnPropertySymbols(obj)——返回一个数组,包含对象自身的所有Symbol属性。[/b][/b][/b]
[b][b][b][b]Reflect.ownKeys(obj)——返回一个数组,包含对象自身的所有属性,不管是属性名是Symbol或字符串,也不管是否可枚举。[/b][/b][/b][/b]
以上的5种方法遍历对象的属性,都遵守同样的属性遍历的次序规则。
首先遍历所有属性名为数值的属性,按照数字排序。
其次遍历所有属性名为字符串的属性,按照生成时间排序。
最后遍历所有属性名为Symbol值的属性,按照生成时间排序。
7、ES5 引入了
Object.keys方法,返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键名。ES2017 引入了跟
Object.keys配套的
Object.values和
Object.entries,作为遍历一个对象的补充手段,供
for...of循环使用。
Object.values只返回对象自身的可遍历属性。
var obj = Object.create({}, {p: {value: 42}}); Object.values(obj) // []
上面代码中,
Object.create方法的第二个参数添加的对象属性(属性
p),如果不显式声明,默认是不可遍历的,因为
p的属性描述对象的
enumerable默认是
false,
Object.values不会返回这个属性。只要把
enumerable改成
true,
Object.values就会返回属性
p的值。
8、现在有一个提案,引入了“Null 传导运算符”(null propagation operator)
?.
“Null 传导运算符”有四种用法。
obj?.prop// 读取对象属性
obj?.[expr]// 同上
func?.(...args)// 函数或对象方法的调用
new C?.(...args)// 构造函数的调用
?.运算符,只要其中一个返回
null或
undefined,就不再往下运算,而是返回
undefined。
相关文章推荐
- JS关于对象的安全性之扩展,密封,冻结
- 扩展JS Date对象时间格式化功能的小例子
- 扩展js的String对象
- js-ES6学习笔记-Promise对象(2)
- 使用prototype扩展JS内部对象String的功能
- android 上 webkit js 本地扩展之全局本地对象实现步骤
- JS中禁止对象属性扩展、密封对象、冻结对象
- js实现复制对象、扩展对象 方法
- JS常用扩展内建对象
- js框架设计1.2对象扩展笔记
- js中使用prototype扩展对象方法
- JS模块化编程(五)---按照AMD规范扩展全局对象
- JS:收集的一些Array及String原型对象的扩展实现代码
- 模仿JQuery.extend函数扩展自己对象的js代码
- [js高手之路] es6系列教程 - 对象功能扩展详解
- js深入研究之扩展类,克隆对象,混合类(自定义的extend函数,clone函数,与augment函数)
- JS中禁止对象属性扩展、密封对象、冻结对象
- JS中Array对象扩展(一)
- webkit的js对象扩展(一)——binding方式创建自定义对象(单实例)
- js对象深拷贝和对象扩展