JavaScript深入浅出补充——(二)语句和严格模式,对象
2017-07-03 20:58
309 查看
三、语句和严格模式
JavaScript程序由语句组成,语句遵守语法规则。
例如:if语句,while语句,with语句等等……
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/5b92c64d45fbfa0fb5050af7743401c6.png)
block块语句
常用于组合0~多个语句,块语句用{}定义
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/b60a3d510b7a750bba046eb64b389a23.png)
直接以花括号开头会被理解成块,如果想被理解为自变量表达式需要赋值或再套一个括号
需要注意没有块级作用域:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/0074cf5fcfb87b3bba2c72345365f1a1.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/a4a0bc9d877037e0f2cf5f8829e2b1c1.png)
声明语句 var
需要注意的是我们可以再一个var语句里面定义多个变量
如var a=1,b=1
但是不能用var a=b=1
b会是一个隐式全局变量
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/c26e84b97f6e95bdacd8c445f77206eb.png)
try catch提供了一个异常捕获机制
执行的流程是首先执行try块中的代码,如果抛出了异常,由catch捕获并执行,如果没有异常则忽略,finally中的语句都会执行,try后面必须接着一个catch或者finally
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/437cfdac75eff0a0d00b8121e4809627.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/2365df93f7782073f15d5e66874e8057.png)
上面情况,第一个块里没有catch,所以它跳找到最近的catch,在跳出之前他会先执行里面的finally
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/06553cbf9740f40b33910d2417d04f85.png)
上面这种情况里面有catch,跑出异常之后会首先执行里面的catch,然后执行finally,因为一场在里面已经处理过了,所以不会再跑到外面在进行处理
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/a8ffaf67fa53b37ecfba929e6e856431.png)
上后面这种,顺序见右边,内部先try抛出异常,然后catch处理,finally,然后因为catch又抛出了这个异常,所以外面在处理,也就是如果里面的异常没有处理抛出了,它会在外面处理,但是要先执行里面的finally
function语句
function语句用来定义函数对象,用function定义的函数我们叫做函数声明,与之对应的另一种我们叫做函数表达式,如下
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/0eac81ba3471b2d55c9aceb57ba741dd.png)
他们的最主要的区别就是函数声明会被预先处理,或者叫函数前置
还可以通过new function 构造器的方式来创建函数对象
for …in语句
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/3e36760be15eecfdf673aa07f5357f05.png)
这里我们可以用for in去遍历obj中的属性
switch语句
如下三种方法
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/cb00216a957995d7552bd224f7fff2a8.png)
循环语句
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/413b2141d9aa32d78c0b0d4e3e4a23bd.png)
with语句
可以修改当前的作用域
如下,在js中已经不建议使用with了,因为在with中作用域会比较复杂
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/d2d0162d8430fdc9ecaa3b6cc804eee5.png)
严格模式
严格模式是一种特殊的执行模式,他修复了部分语言上的不足,提供更强的错误检查,并增强安全性
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/f783eaf07475babe4b0a97d7acc2bd9e.png)
可以向上兼容,如果老的浏览器不兼容,会被当做一个字符串忽略
需要注意的是并不一定是第一行的代码,再他前面可以用引号引起来abc这样,但不能用var 在前面
严格模式下的主要不同:
在严格模式下使用with或报错,SyntaxError语法错误
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/e22c103ff016036363cf2ca6c1df0941.png)
没有声明的变量被赋值会被报错
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/1149000c29c4b4e0db84e95c694f836b.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/bc3719026457a912889475ffec0a5588.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/6363c36009544e570e327e845be3916c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/ffdf43c6e92e5991349de88e457a0a32.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/1386287400e1765cc42fdc30ff364619.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/1780975eaf9ed7a87f5aeeddee6781d9.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/76ffdfbf1e26e8f02b086dcd2d3b5294.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/6a8384b435f7b57519682cab86929f2c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/0896c91b1773f47d004cc6efbcd36294.png)
严格模式是一种特殊的运行模式,他修复了部分语言上的不足,提供更强的错误检查,并增强安全性
严格模式是向上兼容的
四、对象
对象中包涵一系列属性,这些属性是无序的,每个属性都有一个字符串key和对应的value。
对象的字符串key
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/5a929c11141c975034f3a043f5f947c1.png)
对象的构造
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/0c66d8bb1f6224bf81e7628060fda5ca.png)
每个对象除了标签和方法之外还有原型
比如我们创建一个函数 foo
每一个函数都会有一个prototype这样一个对象属性
如果我们吧foo.prototype.z 设置为3
再去new一个foo指向一个对象obj,它的原型就会指向他的构造器的prototype属性,也就是foo.prototype,我们之前设置了foo.prototype.z 是3
如果我们访问obj的x属性,会返回1,如果访问obj的z属性,没有,就会查找obj的原型,如果还没就会继续向上找直到原型链的最末端
对象中还有一个class标签来标示他是属于哪一个种类的
extensible标签来标示是否允许继续增加新属性
创建对象,原型链
要想搞对象,先得有对象字面量创建对象
我们可以用花括号括起来设置属性,对象字面量可以做对象的嵌套,比如某些对象的值又是对象
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/f944355728008f9dd5e6f8fc7ba834c1.png)
new 原型链
如果我们用function创建一个对象 foo,他会带一个prototype属性,这是一个对象属性,给他设置一个z的值等于3
用new赋构造器的方式造了一个新的变量obj,给obj赋值添加两个属性
通过new构造对象
它的主要特点是它的原型会指向她的构造器的prototype属性,也就是foo.prototype
这样的作用是,当我们访问obj.x和obj.y都会返回他得值,当他访问obj.z他回去查找它的原型也就是foo.prototype,返回z值3
foo也是有原型的,它会指向object.prototype,object.prototype又会指向它的原型null
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/5b3bb94493dab3496c386808db6a0a14.png)
最后一句返回false表示z并不是他本身的,而是它的原型链上的
需要注意,当我们给对象赋值的时候,不会像原型链上去查找
如果他本身有这个属性,他会修改,如果没有,他会增加这个属性
这时候我们在看,obj.z是5,foo.prototype.z是3
如果我们给obj.z赋值undefined,在查找就会返回undefined
所以返回undefined并不一定是没有,可能他得值就是undef
如果想在拿到原型链上的z,需要先delete obj.z
delete obj.z不删除原型链
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/cdb8ce3cdf734d594230135dcea3b94c.png)
Object.create创建对象
这是一个系统内置的函数,他会接受一个参数,一般是一个对象,它会返回一个新创建的对象,并让这个对象的原型指向这个参数
并不是所有的对象都有toString,并不一定所有对象的原型链上都有Object.prototype
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/f4ac6fae40024ba096a25b6da69a1cc9.png)
属性操作
读写对象属性
我们可以过 . 操作符去访问他的对象属性,也可以用 【】 把他的key传进去,这里我们需要的是一个字符串,我们也可以写其他的,但是也会被转成字符串
一般建议用obj.的方式
但是如右边,有 x1 x2 ... 这里我们可能需要去循环动态的处理,我们需要区拼这个属性名的时候,往往要用 【】
除了用for去拼写外,我们也会用for in去遍历所有的属性,但是也可会吧原型链上的属性也遍历出来,并且顺序是不确定的
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/f1a6f1fc303cf5bf1ba088649845ce19.png)
当我们尝试去读写不存在的属性
比如我们创建一个对象obj,访问一个不存在的属性y,原型链查找,找到原型链的末端null还是找不到就会返回 underfined
如果写这个属性的话,如果有就修改对象的值,如果没有就创建并赋值
obj.y是undefined,再去访问obj.y.z就会报错不能获取underfined的属性z,返过来去赋值
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/8f40bdb113d7e2cfcd18c6902573ee40.png)
巧用运算符实现链式读取
定义变量yz,想去对obj.y去操作的时候,obj不为空,但是想要检测y属性是否有的时候,有时会用if,把y.z取出来做一些处理
巧用运算符,&&,如果有的话就继续向右去找,如果有一个是underfined就会返回,一直找到最后,如果obj.y.z存在就会返回z的值
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/6ae9457bbc62bba520b6b75eb1d58b7e.png)
删除属性
用delete删除返回true表示删除成功
也可以用 [ ] 传进去也可以实现属性的删除
如果重复删除,会不会有问题,由于属性已经不存在,JavaScript仍会返回true,所以delete返回true只说明没有了这个属性,并不说明删除成功
有些属性如 prototype 是不允许被删除的,会返回false
我们可以尝试传入,要查看的对象Object,要查看的属性prototype
下面的意思是否可配置 ,不
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/71e8da84182418d30dc9b648e83dc7ad.png)
如果用var定义的变量或者局部变量仍然不可以被删除
函数声明也是同理,或者函数内部的局部作用域的函数,都不可以被删除
如果饮食的创建全局变量,没有定义ohNo,我们可以用window. 来拿到 1,delete成功删除
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/c038250097223ff9b383276282e16c78.png)
检测
用new Object构造一个变量cat,通过赋值添加两个属性,
用in检测,in会查找到原型链,所以cat的属性legs和原型链上的toString都会返回true,但是abc这样一个不存在的会返回false
用hasOwnPrototy
最后是用prorerIsEnumerable是否可枚举
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/ed2e12b851e9e36b9ebf411f55fc4e19.png)
怎样自定义一个属性让他的枚举是false、
我们想把cat的legs数量乘以二,先用if 查看cat和cat。legs转化的布尔值都不是false时,称等于2
或者 !=underfined 时,一个等于null和underfined是想等的,也就是不等于null在做以下处理
如果只不等于underfined,要用!==
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/c5d5fb5ba826f7f86b0b4a8d4a0e2966.png)
枚举属性
定义变量o,有x y z三个属性
toString在o或者o的原型链上
不可枚举
定义变量key用in不会出来
如果我们用create创建一个变量obj,原型指向o,给obj添加属性a,值是4,可枚举
遍历不管是a,还是xyz都会在遍历中显示出来
有时只想处理变量上的属性不想处理原型链上的属性
只需要加一个has判断过滤掉原型链上的属性就可以
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/7f336a41e4ea64c111ffb62cf3a70bc1.png)
属性的getter,setter方法
可以看到这两个方法和其他方法区别很大
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/820c6c998e8b6493c13146db0422a324.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/97a71269e54ccc60cbdc01e9789b1b43.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/070559e065022ebe9b02840d86d215eb.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/8c664ae5adc7b609e6f3f684be1b2601.png)
属性标签
查看变量的属性标签
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/6c115f9cb48c09d8401e17fd91f8abb9.png)
管理或者说设置属性
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/58a237dea015b0ec2e672d72cce5dafc.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/0216e25fe8a327a7f8680b094b855465.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/3a33c92f8637cef9719e91dbe70ca135.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/ed4058722c168edd1203c05db12b2831.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/10fe41f39f4104212bb2d2c8e2fd8e64.png)
对象标签
主要有三种
proto class extensible
proto实际上就是原型
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/cd138ecb6e1f83483a7077848fd429bc.png)
class表示对象是哪个类型
没法获取,可以间接地
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/e804053cc6c8c8da82ba8d8b958a9d9a.png)
extensible表示是否可拓展
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/0f1ab17ffbaefd2d97cdc378cfab85c4.png)
序列化 其他对象方法
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/67adba489ca842003df9f720691ead0c.png)
序列化自定义
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/1e35f082305d793b016af4164c827685.png)
toString和valueOf也是常见的对象方法
JavaScript程序由语句组成,语句遵守语法规则。
例如:if语句,while语句,with语句等等……
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/5b92c64d45fbfa0fb5050af7743401c6.png)
block块语句
常用于组合0~多个语句,块语句用{}定义
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/b60a3d510b7a750bba046eb64b389a23.png)
直接以花括号开头会被理解成块,如果想被理解为自变量表达式需要赋值或再套一个括号
需要注意没有块级作用域:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/0074cf5fcfb87b3bba2c72345365f1a1.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/a4a0bc9d877037e0f2cf5f8829e2b1c1.png)
声明语句 var
需要注意的是我们可以再一个var语句里面定义多个变量
如var a=1,b=1
但是不能用var a=b=1
b会是一个隐式全局变量
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/c26e84b97f6e95bdacd8c445f77206eb.png)
try catch提供了一个异常捕获机制
执行的流程是首先执行try块中的代码,如果抛出了异常,由catch捕获并执行,如果没有异常则忽略,finally中的语句都会执行,try后面必须接着一个catch或者finally
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/437cfdac75eff0a0d00b8121e4809627.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/2365df93f7782073f15d5e66874e8057.png)
上面情况,第一个块里没有catch,所以它跳找到最近的catch,在跳出之前他会先执行里面的finally
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/06553cbf9740f40b33910d2417d04f85.png)
上面这种情况里面有catch,跑出异常之后会首先执行里面的catch,然后执行finally,因为一场在里面已经处理过了,所以不会再跑到外面在进行处理
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/a8ffaf67fa53b37ecfba929e6e856431.png)
上后面这种,顺序见右边,内部先try抛出异常,然后catch处理,finally,然后因为catch又抛出了这个异常,所以外面在处理,也就是如果里面的异常没有处理抛出了,它会在外面处理,但是要先执行里面的finally
function语句
function语句用来定义函数对象,用function定义的函数我们叫做函数声明,与之对应的另一种我们叫做函数表达式,如下
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/0eac81ba3471b2d55c9aceb57ba741dd.png)
他们的最主要的区别就是函数声明会被预先处理,或者叫函数前置
还可以通过new function 构造器的方式来创建函数对象
for …in语句
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/3e36760be15eecfdf673aa07f5357f05.png)
这里我们可以用for in去遍历obj中的属性
switch语句
如下三种方法
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/cb00216a957995d7552bd224f7fff2a8.png)
循环语句
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/413b2141d9aa32d78c0b0d4e3e4a23bd.png)
with语句
可以修改当前的作用域
如下,在js中已经不建议使用with了,因为在with中作用域会比较复杂
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/d2d0162d8430fdc9ecaa3b6cc804eee5.png)
严格模式
严格模式是一种特殊的执行模式,他修复了部分语言上的不足,提供更强的错误检查,并增强安全性
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/f783eaf07475babe4b0a97d7acc2bd9e.png)
可以向上兼容,如果老的浏览器不兼容,会被当做一个字符串忽略
需要注意的是并不一定是第一行的代码,再他前面可以用引号引起来abc这样,但不能用var 在前面
严格模式下的主要不同:
在严格模式下使用with或报错,SyntaxError语法错误
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/e22c103ff016036363cf2ca6c1df0941.png)
没有声明的变量被赋值会被报错
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/1149000c29c4b4e0db84e95c694f836b.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/bc3719026457a912889475ffec0a5588.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/6363c36009544e570e327e845be3916c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/ffdf43c6e92e5991349de88e457a0a32.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/1386287400e1765cc42fdc30ff364619.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/1780975eaf9ed7a87f5aeeddee6781d9.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/76ffdfbf1e26e8f02b086dcd2d3b5294.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/6a8384b435f7b57519682cab86929f2c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/0896c91b1773f47d004cc6efbcd36294.png)
严格模式是一种特殊的运行模式,他修复了部分语言上的不足,提供更强的错误检查,并增强安全性
严格模式是向上兼容的
四、对象
对象中包涵一系列属性,这些属性是无序的,每个属性都有一个字符串key和对应的value。
对象的字符串key
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/5a929c11141c975034f3a043f5f947c1.png)
对象的构造
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/0c66d8bb1f6224bf81e7628060fda5ca.png)
每个对象除了标签和方法之外还有原型
比如我们创建一个函数 foo
每一个函数都会有一个prototype这样一个对象属性
如果我们吧foo.prototype.z 设置为3
再去new一个foo指向一个对象obj,它的原型就会指向他的构造器的prototype属性,也就是foo.prototype,我们之前设置了foo.prototype.z 是3
如果我们访问obj的x属性,会返回1,如果访问obj的z属性,没有,就会查找obj的原型,如果还没就会继续向上找直到原型链的最末端
对象中还有一个class标签来标示他是属于哪一个种类的
extensible标签来标示是否允许继续增加新属性
创建对象,原型链
要想搞对象,先得有对象字面量创建对象
我们可以用花括号括起来设置属性,对象字面量可以做对象的嵌套,比如某些对象的值又是对象
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/f944355728008f9dd5e6f8fc7ba834c1.png)
new 原型链
如果我们用function创建一个对象 foo,他会带一个prototype属性,这是一个对象属性,给他设置一个z的值等于3
用new赋构造器的方式造了一个新的变量obj,给obj赋值添加两个属性
通过new构造对象
它的主要特点是它的原型会指向她的构造器的prototype属性,也就是foo.prototype
这样的作用是,当我们访问obj.x和obj.y都会返回他得值,当他访问obj.z他回去查找它的原型也就是foo.prototype,返回z值3
foo也是有原型的,它会指向object.prototype,object.prototype又会指向它的原型null
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/5b3bb94493dab3496c386808db6a0a14.png)
最后一句返回false表示z并不是他本身的,而是它的原型链上的
需要注意,当我们给对象赋值的时候,不会像原型链上去查找
如果他本身有这个属性,他会修改,如果没有,他会增加这个属性
这时候我们在看,obj.z是5,foo.prototype.z是3
如果我们给obj.z赋值undefined,在查找就会返回undefined
所以返回undefined并不一定是没有,可能他得值就是undef
如果想在拿到原型链上的z,需要先delete obj.z
delete obj.z不删除原型链
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/cdb8ce3cdf734d594230135dcea3b94c.png)
Object.create创建对象
这是一个系统内置的函数,他会接受一个参数,一般是一个对象,它会返回一个新创建的对象,并让这个对象的原型指向这个参数
并不是所有的对象都有toString,并不一定所有对象的原型链上都有Object.prototype
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/f4ac6fae40024ba096a25b6da69a1cc9.png)
属性操作
读写对象属性
我们可以过 . 操作符去访问他的对象属性,也可以用 【】 把他的key传进去,这里我们需要的是一个字符串,我们也可以写其他的,但是也会被转成字符串
一般建议用obj.的方式
但是如右边,有 x1 x2 ... 这里我们可能需要去循环动态的处理,我们需要区拼这个属性名的时候,往往要用 【】
除了用for去拼写外,我们也会用for in去遍历所有的属性,但是也可会吧原型链上的属性也遍历出来,并且顺序是不确定的
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/f1a6f1fc303cf5bf1ba088649845ce19.png)
当我们尝试去读写不存在的属性
比如我们创建一个对象obj,访问一个不存在的属性y,原型链查找,找到原型链的末端null还是找不到就会返回 underfined
如果写这个属性的话,如果有就修改对象的值,如果没有就创建并赋值
obj.y是undefined,再去访问obj.y.z就会报错不能获取underfined的属性z,返过来去赋值
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/8f40bdb113d7e2cfcd18c6902573ee40.png)
巧用运算符实现链式读取
定义变量yz,想去对obj.y去操作的时候,obj不为空,但是想要检测y属性是否有的时候,有时会用if,把y.z取出来做一些处理
巧用运算符,&&,如果有的话就继续向右去找,如果有一个是underfined就会返回,一直找到最后,如果obj.y.z存在就会返回z的值
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/6ae9457bbc62bba520b6b75eb1d58b7e.png)
删除属性
用delete删除返回true表示删除成功
也可以用 [ ] 传进去也可以实现属性的删除
如果重复删除,会不会有问题,由于属性已经不存在,JavaScript仍会返回true,所以delete返回true只说明没有了这个属性,并不说明删除成功
有些属性如 prototype 是不允许被删除的,会返回false
我们可以尝试传入,要查看的对象Object,要查看的属性prototype
下面的意思是否可配置 ,不
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/71e8da84182418d30dc9b648e83dc7ad.png)
如果用var定义的变量或者局部变量仍然不可以被删除
函数声明也是同理,或者函数内部的局部作用域的函数,都不可以被删除
如果饮食的创建全局变量,没有定义ohNo,我们可以用window. 来拿到 1,delete成功删除
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/c038250097223ff9b383276282e16c78.png)
检测
用new Object构造一个变量cat,通过赋值添加两个属性,
用in检测,in会查找到原型链,所以cat的属性legs和原型链上的toString都会返回true,但是abc这样一个不存在的会返回false
用hasOwnPrototy
最后是用prorerIsEnumerable是否可枚举
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/ed2e12b851e9e36b9ebf411f55fc4e19.png)
怎样自定义一个属性让他的枚举是false、
我们想把cat的legs数量乘以二,先用if 查看cat和cat。legs转化的布尔值都不是false时,称等于2
或者 !=underfined 时,一个等于null和underfined是想等的,也就是不等于null在做以下处理
如果只不等于underfined,要用!==
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/c5d5fb5ba826f7f86b0b4a8d4a0e2966.png)
枚举属性
定义变量o,有x y z三个属性
toString在o或者o的原型链上
不可枚举
定义变量key用in不会出来
如果我们用create创建一个变量obj,原型指向o,给obj添加属性a,值是4,可枚举
遍历不管是a,还是xyz都会在遍历中显示出来
有时只想处理变量上的属性不想处理原型链上的属性
只需要加一个has判断过滤掉原型链上的属性就可以
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/7f336a41e4ea64c111ffb62cf3a70bc1.png)
属性的getter,setter方法
可以看到这两个方法和其他方法区别很大
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/820c6c998e8b6493c13146db0422a324.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/97a71269e54ccc60cbdc01e9789b1b43.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/070559e065022ebe9b02840d86d215eb.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/8c664ae5adc7b609e6f3f684be1b2601.png)
属性标签
查看变量的属性标签
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/6c115f9cb48c09d8401e17fd91f8abb9.png)
管理或者说设置属性
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/58a237dea015b0ec2e672d72cce5dafc.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/0216e25fe8a327a7f8680b094b855465.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/3a33c92f8637cef9719e91dbe70ca135.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/ed4058722c168edd1203c05db12b2831.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/10fe41f39f4104212bb2d2c8e2fd8e64.png)
对象标签
主要有三种
proto class extensible
proto实际上就是原型
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/cd138ecb6e1f83483a7077848fd429bc.png)
class表示对象是哪个类型
没法获取,可以间接地
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/e804053cc6c8c8da82ba8d8b958a9d9a.png)
extensible表示是否可拓展
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/0f1ab17ffbaefd2d97cdc378cfab85c4.png)
序列化 其他对象方法
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/67adba489ca842003df9f720691ead0c.png)
序列化自定义
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/1e35f082305d793b016af4164c827685.png)
toString和valueOf也是常见的对象方法
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/07/a092379f7e61650e8367ca03eafc6bff.png)
相关文章推荐
- javascript 语句和严格模式(三)
- javascript 语句和严格模式(三)
- javascript 语句和严格模式(三)
- javascript 语句和严格模式(三)
- javascript学习 第2天 语法 标识符 严格模式 注释与语句 关键字与保留字
- JavaScript---语句(严格模式)
- JavaScript中的try...catch语句和es5的严格模式
- JavaScript严格模式禁用With语句的原因
- JavaScript严格模式为何要禁用With语句
- 原 2017/5 JavaScript基础5--- 语句、严格模式
- javascript 语句和严格模式(三)
- javascript 语句和严格模式(三)
- JavaScript严格模式禁用With语句的原因
- JavaScript面向对象编程,严格过程的标准化编程法,目前为止最面向对象的JS模式(像Java)
- JavaScript的变量及函数(变量提升、嵌套作用域、条件语句、严格模式、IIFE、闭包、模块化、this、原型)
- 是时候开始使用JavaScript严格模式了怎样启用javascri
- JavaScript 面向对象编程,严格过程的标准化编程法,目前为止最好的 JS 生成对象代码结构
- 深入理解JavaScript系列(48):对象创建模式(下篇)
- 深入理解JavaScript系列(47):对象创建模式(上篇)
- 是时候使用Javascript严格模式了