var obj={x:1,y:2}
obj.x;//1
obj['y'];//2
for in有可能会读出原型链上的属性,并且顺序无序
属性读写:
var ovj={x:1}
obj.y;//原型链上也没有,返回undefined
var yz=obj.y.z;//typeError
obj.y.z=2;//typeError
var yz;(定义一个yz用于存放obj.y.z)== var yz=obj&&obj.y&&obj.y.z
if(obj.y){
yz=obj.y.z;
}
属性删除:
var person ={age:28,title:"fe"}
delete person.age;//true表示删除成功
delete persong["title"];//true
person.age//undefined
delete persong.age;//true,只要这个对象上不存在这个属性,用delete就会返回true
delete Object.prototype;//false
Object.getOwnPropertyDescriptor(对象,"属性");返回对象上的这个属性下的标签
var descriptor=Object.getOwnPropertyDescriptor(Object,"prototype")
descriptor.configurable;//false表示不可被配置
全局变量,函数中的局部变量都不能被删除,隐式的定义全局变量的方法可以被删除,通过evalu定义的变量可以被delete删除
var globalval=1;
delete globalval;//false
function(){ var localval=1; return delete localval }//false
ohNo =1;
window.ohNo;//1
delete ohNo;//true
属性检测:
对象.hasOwnProperty("属性名");判断对象上是否有这个属性
cat.hasOwnProperty("leg");//true有
cat.hasOwnProperty("toString");//false对象上没有,但是原型链上有,检测不到
Enumerable(true可以被枚举、显示;false不能被枚举)
cat.hasOwnProperty("leg");//true(只查找对象下的属性)
cat.hasOwnProperty("toString");//false在查找属性的时候就不会显示出来
用赋值、new Object方式定义对象的属性值的属性标签默认为true(可读、可写、可枚举 等)
用Object.defineProperty(对象名,"属性名","属性下的标签")方法创建的对象的属性的属性标签默认值为false
Object.defineProperty(cat,"price",{enumerable:false,value:1000});创建一个有price属性且不可枚举,值为1000的cat对象
cat.propertyIsEnumerable("price");//false因为不可枚举,返回false
cat.hasOwnProperty("price");//true
propertyIsEnumerable查找的是目标对象所有可遍历可枚举的属性;
hasOwnProperty查找的是目标对象自身可遍历的属性;
注意:
1. 用for-in遍历时,原型链上的属性也会被遍历到,而且是无序遍历。
2. 属性删除用delete, prototype属性不可被删除;var定义的变量也不可用delete删除,函数也不可以被delete掉(经验证,不同的内核实现方式不同,在chrome下不可被delete掉,返回false,但在firefox和IE10下可以被delete掉,返回true,对于函数也是相同的结果)
验证对象的属性:hasOwnProperty obj.hasOwnProperty('a')
验证对象的属性和对象原型链内的属性:in 'a' in obj
使用Object.defineProperty() 创建对象属性的话,默认enumerable等属性都为false,但是通过obj.x 的方式设置的话默认都为true
Object.defineProperty(cat, 'price', {enumerable: false, value: 1000})
表示在对象cat上增了一个值为1000的属性price,默认enumerable就是false,所以可以不用写
对象都有一个属性是 "propertyIsEnumerable" 这个属性的右边括号里 可以是这个对象已经它的原型链上的所有属性 但是如果enumerable的值是false的话 那返回的就是false了.
用in操作符查看某个属性是否在对象的原型链上 这个属性的enumerable是不考虑的
在for in 中 enumerable属性是false是无法被遍历出的 (意思是 for in考虑 enumerable 而 单独的 in 是不考虑的)
var 声明的变量 function声明的函数 都是无法delete掉的
只有不带var生命的 全局变量 可以被delete掉 (浏览器环境和Node环境下测试通过)
视频里还说到了"eval 里面生命的变量 是可以被delete掉的"(没有测试)
成功删除一个对象的属性后 再次删除还是会返回true
比如:
obj = {one: 1}
console.log(delete obj.one) //true
console.log(delete obj.one) //true! (非严格模式 严格模式下没有测试)
找一个不存在的一级属性 会返回undefined
找一个不存在的一级属性下面的一级属性(二级属性) 会报错 TypeError 同时 给一个不存在的一级属性下的二级属性写值 也会报错 TypeError
for in 遍历时 顺序是不确定的
Object.defineProperty(对象,'属性名',{对象属性})
自定义对象属性
.propertyIsEnumerable()
返回布尔值,表明指定的属性是否可枚举
Object.getOwnPropertyDescriptor(对象, 属性名)
获取一个对象的属性标签
.configurable
查看对象是否可配置
二刷!对属性不够熟悉
严格等于与非严格等于的区别:
var obj = {x:1, y:2}对象属性读写的两种方式
obj.x。
obj['x'],这种方式可以使用字符串拼接的方式实现动态获取属性值。
Object.defineProperty(cat, 'price', {enumerable: false, value: 1000});
enumerable可以不写,默认为false。
判断对象属性是否存在,有几种方式
该方法可以判断对象的自有属性和继承来的属性是否存在。
var o={x:1};"x" in o; //true,自有属性存在"y" in o; //false"toString" in o; //true,是一个继承属性
2.使用对象的hasOwnProperty()方法。
该方法只能判断自有属性是否存在,对于继承属性会返回false。
var o={x:1};o.hasOwnProperty("x"); //true,自有属性中有xo.hasOwnProperty("y"); //false,自有属性中不存在yo.hasOwnProperty("toString"); //false,这是一个继承属性,但不是自有属性
自有属性和继承属性均可判断。
var o={x:1};o.x!==undefined; //trueo.y!==undefined; //falseo.toString!==undefined //true
该方法存在一个问题,如果属性的值就是undefined的话,该方法不能返回想要的结果,如下。
var o={x:undefined};o.x!==undefined; //false,属性存在,但值是undefinedo.y!==undefined; //falseo.toString!==undefined //true
这种方式会将o.x转成boolean类型,null、undefined、NaN、+0、-0、""
,这六种转换成布尔类型是false,其余都是true。
var o={};if(o.x) o.x+=1; //如果x是undefine,null,false," ",0或NaN,它将保持不变
如果指向处理某个对象上的属性,不想(key in obj遍历原型链上的属性,只需要加一个if判断if(obj.hasOwnProperty(key)){}
继前例子
是否枚举的方法
Object.defineProperty方法(对象,属性名字, 对象标签);//此方法默认的属性是false,不可枚举
对象标签:{enumerable:false,value:1000} //加粗为false则不可枚举
属性检测
cat.hasOwnProperty('toString');是检测的对象cat,不在原型链上查找。
枚举
cat.propertyIsEnumerable('legs');//true 表示可枚举
函数的局部变量和全局变量是不能delete的。
对于隐式创建,如图ohNo 是可以delete的
属性删除delete
属性检测1
in 原型链属性
hasOwnProperty 自身
cat.propertyIsEnumerable
对象属性,读写,删除 检测,枚举 属性删除 声明的不可以,非声明的可以
obj.hasOwnProperty("toString") 是否自身obj的属性
obj.propertyisenumerable("toString") 是否是可枚举的属性
加判断,过滤原型上的属性
Object.create创建对象,obj的原型指向o
这样原型可以被遍历