JavaScript 学习笔记 对象属性 symbol

2023-12-26 21:17:01

JavaScript 学习笔记

目录

对象

遍历对象元素保留原来顺序

用非数字作为key,就不会把“1” 排在最前面了

let codes = {
  "+49": "Germany",
  "+41": "Switzerland",
  "+44": "Great Britain",
  // ..,
  "+1": "USA"
};

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

判断是否是空对象

方法1const isEmpty = (obj) => {
    for (let key in obj) {
        return false
    }
    return true
}
方法2const isEmpty = (obj) => JSON.stringify(obj) === '{}'
方法3const isEmpty = (obj) => Object.keys(obj).length === 0

对象浅拷贝

即,当对象属性为基本类型时,可以用如下方法进行对象拷贝;一旦含有引用类型属性时,下面的方法将失效。

const obj = {
    "type": "1",
    "title": "Criss",
    "phone": "+86-10-84556681",
}
const obj2={}
Object.assign(obj2, obj)
或缩写
let clone = Object.assign({}, obj);

对象深拷贝

let clone =JSON.parse(JSON.stringify(obj))

不会拷贝: function、属性值为undefined、
属性值变为null: 属性值为-Infinity、属性值为Infinity、属性值为NaN

使用 lodash 库的 _.cloneDeep(obj)。

对象的方法不能这样写成箭头函数,否则找不到title

const obj = {
    "title": "Criss",
    fun:()=>{ 
        console.log(this.title)
    }
}

对象的方法这样写,才能找到title

const obj = {
    "title": "Criss",
    fun(){ 
        console.log(this.title)
    }
}

可选链

user.address && user.address.street && user.address.street.name
user.address?.street?.name

?对其前面的属性进行可选性校验,第一级写了不起作用,所以不用写

obj.method?.() obj下有方法method才执行
vue 举例

title() {
  return this.list?.[0]?.['title'];
},

symbol 类型

  1. 唯一性
const { log } = console
const user = {
    id:1,
}
let id = Symbol("id");
let id2 = Symbol("id");
user[id]=2
user['id']=3
user[id2]=4
log(user)// { id: 3, [Symbol(id)]: 2, [Symbol(id)]: 4 }
  1. symbol 属性在 for…in 循环内不输出。
let id = Symbol("id");
let user = {
    [id]: 123,
    name:'1111'
};
for (let key in user) { 
    log(key)
}
// name ,忽略了symbol
  1. Object.keys(user) 也会忽略symbol
let id = Symbol("id");
let user = {
    [id]: 123,
    name:'1111'
};
let clone=Object.keys(user)
log( clone ); // [ 'name' ],忽略了symbol
  1. 相反,Object.assign({}, user)可以克隆
const { log } = console
let id = Symbol("id");
let user = {
  [id]: 123
};
let clone = Object.assign({}, user);
log( clone ); // { [Symbol(id)]: 123 },symbol依然存在
  1. symbol 总是不同的值,即使它们有相同的名字。如果我们希望同名的 symbol 相等,那么我们应该使用全局注册表:Symbol.for(key) 返回(如果需要的话则创建)一个以 key 作为名字的全局 symbol。使用 Symbol.for 多次调用 key 相同的 symbol 时,返回的就是同一个 symbol
let id = Symbol.for("id");
let id1 = Symbol.for("id");
let user = {
    [id]: 123,
    [id1]: 234,
    name:'1111'
};
log(user)// { name: '1111', [Symbol(id)]: 234 } 只有一个symbol

字符串

数组

正则

文章来源:https://blog.csdn.net/weixin_42708208/article/details/135220517
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。