js判断对象是否为空对象_js对象

七种数据类型 number string bool symbol undefined null object

五个Falsy 值 undefined null 0 NaN ''

对象 object

第七种数据类型,唯一一种复杂类型

  • 定义
  • 无序的数据租户
  • 键值对的集合
  • 写法
  • let obj = {'name':'frank','age':18}
  • let obj = new Object({'name:'frank'})
  • console.log({'name':'frank','age':18})

细节

  • 键名是字符串,不是标识符,可以包含任意字符 (没有数字键名,没有数字下标)
var obj ={'':1
}
obj
{"":1}
var obj = {2:'222222'
}
Object.key(obj)  // 打印出键名
["2"]
  • 引号可以省略,省略之后就只能写标识符
  • 就算引号省略了,键名也还是字符串(重要)

属性名:每个key都是对象的属性名(property)

属性值:每个value都是对象的属性值

奇怪的属性名

  • 所有的属性名会自动变成字符串
let obj ={
1:'a',
3.2:'b',
1e2:'true'
1e-2:true,
.234:true,
0xFF:true
};
Object.key(obj)
=>["1","100","255","3.2","0.01","0.234"]
  • 细节
  • Object.key(obj)key得到obj的所有key

变量作属性名

  • 如何用变量做属性名
  • 之前都是用常量做属性名
  • let p1 ='name'
  • let obj ={p1:'frank'}这样写,属性名为'p1'
  • let obj={[p1]:'frank'}这样写,属性名为'name'
var obj ={{a}:1111
}obj
{xxx:1111}
  • 对比
  • 不加[]的属性名会自动变成字符串
  • 加了[]则会当做变量求值
  • 值如果不是字符串,则会自动变成字符串

对象的隐藏属性

  • 隐藏属性
  • js中的每一个对象都有一个隐藏属性
  • 这个隐藏属性储存着其共有属性组成的对象的地址
  • 这个公有属性组成的对象叫做原型
  • 也就是说,隐藏属性存储着原型地址(公有属性)

代码示例

  • var obj ={}
  • obj.toString()// 居然不报错
  • 因为obj的隐藏属性对应的对象上有toString()

对象的增删改查

删除属性

  • delete http://obj.xxx或 dele obj['xxx'] (删除属性名)
  • 即可删除obj的xxx属性
  • 请区分 属性值为undefined 和 不含属性名
var obj ={name:'frank',age:18}
obj.name = undefined
obj
{name:undefined,age:18}
delete obj.name
true
obj
{age:18}
  • 不含属性名
  • 'xxx' in obj === false (注意要加单引号)
  • 含有属性名,但是值为 undefined
  • 'xxx' in obj && obj.xxx === undefined
  • 注意 obj.xxx === undefined
  • 不能断定 'xxx'是否为obj的属性
  • 类比
  • 你有没有卫生纸
  • A:你有没有卫生纸?//不含属性名
  • B:有,但是没带//含有属性名,但是值为 undefined

查看所有的属性(读属性)

  • 查看自身所有属性
  • Object.keys(obj) Object.values(obj)只想知道值 Object.entries(obj) 知道key 和value
  • 查看自身+共有属性
  • console.dir(obj)
  • 或者自己依次用 Object.key 打印出obj.__proto__
  • 判断一个属性是自身的还是共有的
  • obj.hasOwnProperty('toString')

原型

  • 每个对象都有原型
  • 原型里存着对象的共有属性
  • 比如obj的原型就是一个对象
  • obj.__proto__存着这个对象的地址
  • 这个对象里有toString/constructor/valueOf等属性
  • 对象的原型也是对象
  • 所以 对象的原型也有原型
  • obj={}的原型即为所有对象的原型
  • 这个原型包含所以对象的共有属性,是对象的根
  • 这个原型也有原型,null

81aa82303d9227f92d3c961e209d55a4.png

查看属性

  • 两种方法查看属性
  • 中括号语法:obj['key']
  • 点语法:obj.key
  • 坑新人语法:obj[key]//变量key值一般不为'key'
  • 请优先用中括号语法
  • 点语法会误导你,让你以为key不是字符串
  • 等确定不会弄混两种语法,再改用点语法
var obj ={name:'frank',age:18}
obj['name']
"frank"
obj.name
"frank"

重要

obj.name等价于 obj['name']

obj.name不等价于obj[name] 这里的[name]是变量, 而我们要的是name是字符串

真正等价的情况

let name = 'frank' obj[name]等价于obj['frank']

let list =['name','age','gender']
let person ={name:'frank',age:18,gender:'man'}
for(let i =0;i<list.length;i++){
let name =list[i]
console.log(person________)
}填空
console.log(person[name])

修改或增加属性(写属性)

  • 直接赋值
let obj ={name:'frank'}//name 是字符串
obj.name = 'frank' // name 是字符串
obj['name'] = 'frank'
obj[name]='frank' 错误 因为name值不确定
obj['na'+'me']='frank'
let key = 'name';obj[key]= 'frank'
let key = 'name'obj.key ='frank'//错误
因为 obj.key 等价于obj['key']
  • 批量赋值
  • Object.assign(obj,{age:18,gender:'man'})

修改或增加共有属性

  • 无法通过自身修改或增加共有属性
  • let obj={},obj2={}//共有toSring
  • obj.toString='xxx'只会改obj自身属性
  • obj.toString 还是在原型上
  • 我偏要修改或增加原型上的属性
  • obj.__proto__.toString='xxx'//不推荐用__proto
  • Object.prototype.toString='xxx'
  • 一般来说,不要修改原型,会引起很多问题
var common = {'国籍':'中国',hairColor:'black'}
undefined
var person ={name:'frank'}
undefined
person.__protp__=common
{国籍: "中国", hairColor: "black"}
console.dir(person)
Objectname: "frank"__protp__: {国籍: "中国", hairColor: "black"}__proto__: Object
undefined

6337657b3749e97588858db2e8bca163.png

修改隐藏属性

  • 不推荐使用__proto__
  • let obj ={name:'frank'}
  • let obj2={name:'jack' }
  • let common ={kind:'human'}
  • obj.__proto__ =common
  • obj.__proto__=commom
  • 推荐使用 Object.create
  • let obj =Object.create(common)
  • obj.name = 'frank'
  • let.name2 =Object.create(commom)
  • obj2.name='jack'
  • 规范大概的意思是.要改就一开始就该,别后来再改

5:'name' in obj和obj.hasOwnProperty('name') 的区别

前者可以查看是否有这个属性,后者查看这个属性是自身还是共有的

总结

delete obj['name']
'name'in obj//false
obj.hasOwnProperty('name')//false
Object.keys(obj)
console.dir(obj)
obj['name']
obj.name//name是字符串
obj[name]//name是变量
改自身obj['name']='Tom'
批量改自身Object.assign(obj,{age:18,...})
改共有属性:obj.__proto__['toString']='xxx'
改共有属性:Object.prototype['toString']='xxx'
改原型:obj.__proto__=common
改原型:let obj=Object.create(common)
注:所有_proto__代码都是强烈不推荐写的
基本同上:已有属性则改;没有属性则增

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python字典方法

字典也有方法&#xff0c;很有用&#xff0c;但其使用频率可能没有列表和字符串方法那样高。1、clear 删除所有的字典项d {key: value} d.clear() print(d){}2、copy 方法copy返回一个新字典&#xff0c;其包含的键值对与原来的字典相同&#xff08;这各方法是浅复制&#xff…

交流充电桩电路图_直流充电桩和交流充电桩给电动汽车充电过程中是如何工作的?...

近几年来&#xff0c;新能源汽车发展越来越快&#xff0c;而限制新能源电动汽车发展的主要因素是续航里程和充电问题。续航里程要靠提高电池性能来解决&#xff0c;而解决充电问题就要靠充电桩的普及来实现。下面小编带着大家一起来了解一下直流充电桩和交流充电桩给电动汽车充…

Windows上安装Ubuntu子系统练习linux基本命令

经常在我的群里看到自学测试的小伙伴花费了大量的时间在环境搭建和各种软件的安装上面&#xff0c;有很多就卡在第一步&#xff0c;虚拟机的安装。 有很多安装之后比如启动蓝屏之类的等等&#xff0c;其实&#xff0c;我想说的是&#xff0c;这些都是在走弯路&#xff0c;在这个…

如何巧妙的申请换部门_如何设置户外广告?市城管局局长体验户外广告审批流程...

为巩固拓展“不忘初心、牢记使命”主题教育成果&#xff0c;落实“对标找差、再攀新高”工作要求&#xff0c;优化营商环境&#xff0c;提升服务品质&#xff0c;近日&#xff0c;张家港市城管局局长殷沪飞以个体工商户的身份&#xff0c;到行政审批局城管窗口体验户外广告设置…

安卓APP版本发布流程(一)

一、加固安卓包&#xff08;新版安卓Release包&#xff09;1、下载安装加固软件&#xff0c;注册登录账号https://jiagu.360.cn/#/global/index2、添加签名设置&#xff0c;对应签名路径、密码、别名、别名密码向安卓开发要3、添加签名后&#xff0c;APK加固-添加应用&#xff…

小程序弹出层禁止列表滑动_是时候展现真正的技术了!小程序教程来了——百战Web前端课程更新05.07...

百战程序员十大精品课程&#xff0c;实时更新&#xff0c;保持行业领先。本次更新课程Web前端第二十九阶段安心食疗-微信小程序全部7个章节及课程资料。小程序是依托微信而生的&#xff0c;是一种不用下载就能使用的应用&#xff0c;也是一项创新&#xff0c;经过近几年的发展&…

Jmeter实战(二)|同用户重复并发多次抢红包

之前我们有写过Jmeter多人并发抢1个红包&#xff0c;今天我们来写另外一种场景&#xff0c;同用户重复并发多次抢红包&#xff0c;两种场景还是不太一样&#xff0c;都是比较切合用户实际使用场景&#xff0c;如果1个用户在某些条件下&#xff0c;能重复领取到2次红包&#xff…

【北京上海】七猫内推,高薪海量岗位等你来~

微信长按识别、扫码&#xff0c;查看海量待招岗位&#xff01;&#xff01;&#xff01;UI、产品、测试、开发、运营、数据分析等等

Fiddler无所不能——之测试开发攻城狮必备神器

fiddler官网 https://www.progress.com/ 官网下载fiddler https://www.telerik.com/download/fiddler/fiddler4 fiddler插件下载 https://www.telerik.com/fiddler/add-ons Fiddler无所不能——之测试开发攻城狮必备神器 1、模拟真实网络环境4g网、3g网络、2g网络、弱网等​…

TensorFlow7-多元线性回归模型

运行结果&#xff1a;错误 # 不确定多少行为None。列为12列。即12个数据特征 xtf.placeholder(tf.float32,[None,12],name"X") # 12个特征数据ytf.placeholder(tf.float32,[None,1],name"Y") # 1个标签数据### 创建变量 定义模型结构# 定义了一个命令空…

史上最全jmeter逻辑控制器案例详解

在jmeter中逻辑控制器可以控制采样器(samplers)的执行顺序。由此可知&#xff0c;控制器需要和采样器一起使用&#xff0c;否则控制器就没有什么意义了。放在控制器下面的所有的采样器都会当做一个整体&#xff0c;执行时也会一起被执行。 &#xff08;1&#xff09;控制测试计…

python3.8.2中文手册chm_3.2.2中文语法考察

3自然语言3.1动物的语言3.2自然语言3.2.1英文语法考察3.2.2中文语法考察常见理论可对中文进行的描写与解读如下。汉字的起始是笔划&#xff0c;包括有&#xff1a;横、竖、撇、点、捺、提六种基本笔划&#xff1a;一、丨、丿、丶、㇏、㇀。这些基本笔划可以进一步组合出25种复合…

TensorFlow8-mnist手写数字识别入门

分类问题的损失函数为什么一般不用MSE&#xff1f;MSE在逻辑回归中可能具有多个局部最优点 不能用梯度下降算法