前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >重学JS-4-一图掌握对象

重学JS-4-一图掌握对象

作者头像
luciozhang
发布2023-04-22 16:16:04
2500
发布2023-04-22 16:16:04
举报
文章被收录于专栏:前端lucio

思维导图

通过下面的思维导图,我们先对JavaScript的对象有一些基本的了解。

《重学JavaScript-对象》思维导图.png
《重学JavaScript-对象》思维导图.png

下文记录一些以前不了解的知识点。

知识点

in操作符判断属性是否存在

除了直接访问属性,查看器是否存在,我们还可以用in操作符来判断。

代码语言:javascript
复制
let user = { name: "John", age: 30 };

alert( "age" in user ); // true,user.age 存在
alert( "blabla" in user ); // false,user.blabla 不存在。

for-in可以遍历对象,但不推荐使用

不推荐使用是因为,如果用法不正确,eslint检查会报错。

eslint有一条guard-for-in规则,这条规则要求for-in语句要包含一个if判断来判断objectkey是否存在,以避免一些意外的错误。

此规则的错误代码示例:

代码语言:javascript
复制
/*eslint guard-for-in: "error"*/

for (key in foo) {
    doSomething(key);
}
复制代码

此规则的正确代码示例:

代码语言:javascript
复制
/*eslint guard-for-in: "error"*/

for (key in foo) {
    if (Object.prototype.hasOwnProperty.call(foo, key)) {
        doSomething(key);
    }
}

for (key in foo) {
    if ({}.hasOwnProperty.call(foo, key)) {
        doSomething(key);
    }
}
复制代码

当然除了加判断,也可以直接改用Object.keysforEach

代码语言:javascript
复制
currentValues= {hey:1212, git:1212, nmo:12121}

Object.keys(currentValues).forEach(function(key) {
  yield put(setCurrentValue(key, currentValues[key]));
})

对象的顺序

整数属性会被进行排序。

代码语言:javascript
复制
let codes = {
  "49": "Germany",
  "41": "Switzerland",
  "44": "Great Britain",
  // ..,
  "1": "USA"
};

for(let code in codes) {
  alert(code); // 1, 41, 44, 49
}

其他属性则按照创建的顺序显示。

代码语言:javascript
复制
let user = {
  name: "John",
  surname: "Smith"
};
user.age = 25; // 增加一个

// 非整数属性是按照创建的顺序来排列的
for (let prop in user) {
  alert( prop ); // name, surname, age
}

浅复制与深复制

Object.assign用于浅复制和合并。

代码语言:javascript
复制
let user = {
  name: "John",
  sizes: {
    height: 182,
    width: 50
  }
};

let clone = Object.assign({}, user);

alert( user.sizes === clone.sizes ); // true,同一个对象

// user 和 clone 分享同一个 sizes
user.sizes.width++;       // 通过其中一个改变属性值
alert(clone.sizes.width); // 51,能从另外一个看到变更的结果

lodash 库的 _.cloneDeep(obj)用于深复制。

代码语言:javascript
复制
var objects = [{ 'a': 1 }, { 'b': 2 }];
 
var deep = _.cloneDeep(objects);
console.log(deep[0] === objects[0]);
// => false

执行上下文this

推荐技术蛋老师的这两个视频:

函数作用域

this关键字

判断函数是否由new操作符生成

ES6,用new.target

代码语言:javascript
复制
function User() {
  alert(new.target);
}

// 不带 "new":
User(); // undefined

// 带 "new":
new User(); // function User { ... }

ES5,有另一种判断方法是this instanceof User(如果读过vue2的源码,这个操作会有点印象,vue开始的地方😄)。

?.可选链用于判断属性链上是否有undefined

代码语言:javascript
复制
let user = {}; // user 没有 address 属性

alert( user?.address?.street ); // undefined(不报错)

但是用lodash的get会更方便!!

代码语言:javascript
复制
var object = { 'a': [{ 'b': { 'c': 3 } }] };
 
_.get(object, 'a[0].b.c');
// => 3
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 思维导图
  • 知识点
    • in操作符判断属性是否存在
      • for-in可以遍历对象,但不推荐使用
        • 对象的顺序
          • 浅复制与深复制
            • 执行上下文this
              • 判断函数是否由new操作符生成
                • ?.可选链用于判断属性链上是否有undefined
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档