定义(文字)形式和构造形式。
// 对象的文字语法大概是这样:
var myObj = {
key: value
// ...
};
// 构造形式大概是这样:
var myObj = new Object();
myObj.key = value;
• string
• number
• boolean
• null
• undefined
• object
其中,简单基本类型(string,boolean,number,null,undefined) 本身不是对象。null 会被当做一种对象类型,只是语言本身的一个bug,即对 null 执行 typeof null 时会返回字符串 object。但实际上,null 本身就是基本类型。
• String
• Number
• Boolean
• Object
• Function
• Array
• Date
• RegExp
• Error
在 JavaScript 中,为什么 typeof null 会返回 object?
var myObject = {
a: 2
};
myObject.a; // 2
myObject["a"]; // 2
. 操作符被称为属性访问, [] 操作符被称为键访问。
var myObject = {
a:2
};
Object.getOwnPropertyDescriptor( myObject, "a" );
// {
// value: 2,
// writable: true, 是否可写
// enumerable: true, 是否可枚举
// configurable: true 是否可配置
// }
即便 configurable: false,但我们还是可以把 writable 的状态从 true 改为 false,但是无法由 false 改为 true。除了无法修改,configurable: false 这个属性还会禁止删除这个属性。
var myObject = {
a:2
};
myObject.a; // 2
delete myObject.a;
myObject.a; // undefined
Object.defineProperty( myObject, "a", {
value: 2,
writable: true,
configurable: false,
enumerable: true
} );
myObject.a; // 2
delete myObject.a;
myObject.a; // 2
var myObject = {};
Object.defineProperty( myObject, "FAVORITE_NUMBER", {
value: 42,
writable: false,
configurable: false
} );
禁止扩展: 若想禁止一个对象添加新属性并且保留已有属性,可使用
Object.preventExtensions(...)``非严格模式下,创建属性 b 会静默失败。在严格模式下,将会抛出 TypeError 错误。
var myObject = {
a:2
};
Object.preventExtensions( myObject );
myObject.b = 3;
myObject.b; // undefined
密封:Object.seal(..) 会创建一个“密封”的对象,这个方法实际上会在一个现有对象上调用。Object.preventExtensions(..) 会把所有现有属性标记为 configurable:false。
冻结:Object.freeze(..) 会创建一个冻结对象,这个方法实际上会在一个现有对象上调用Object.seal(..) 并把所有“数据访问”属性标记为 writable:false,这样就无法修改它们的值。
可在不访问属性值的情况下判断对象中是否存在这个属性:
var myObject = {
a:2
};
("a" in myObject); // true
("b" in myObject); // false
myObject.hasOwnProperty( "a" ); // true
myObject.hasOwnProperty( "b" ); // false
in 操作符会检查属性是否在对象及其[[prototype]] 原型链中。hasOwnProperty() 只会检查属性是否在某个对象中,不会检查 [[prototype]] 原型链。
propertyIsEnumerable(...) 会检查给定的属性名是否存在于对象中,而不是原型链中,并且满足 enumerable: true;
Object.keys(...) 会返回一个数组,包含所有可枚举属性,Object.getOwnPropertyNames(...)会返回一个数组,包含所有属性,无论他们是否可枚举。
in 与 hasOwnProperty(...) 的区别在于是否查找 [[prototype]] 原型链,而 Object.keys(...)、Object.getOwnPropertyNames(...)、propertyIsEnumerable(...)、hasOwnProperty() 都只会查找对象中是否直接包含某个属性。
对象一共有两种语法:`定义(文字)形式和构造形式。`
// 对象的文字语法大概是这样:
var myObj = {
key: value
// ...
};
// 构造形式大概是这样:
var myObj = new Object();
myObj.key = value;
var myObject = {
a: 2
};
myObject.a; // 2
myObject["a"]; // 2
. 操作符被称为属性访问, [] 操作符被称为键访问。
禁止扩展: 若想禁止一个对象添加新属性并且保留已有属性,可使用
Object.preventExtensions(...)``非严格模式下,创建属性 b 会静默失败。在严格模式下,将会抛出 TypeError 错误。
密封:Object.seal(..) 会创建一个“密封”的对象,这个方法实际上会在一个现有对象上调用。Object.preventExtensions(..) 并把所有现有属性标记为 configurable:false。
冻结:Object.freeze(..) 会创建一个冻结对象,这个方法实际上会在一个现有对象上调用Object.seal(..) 并把所有“数据访问”属性标记为 writable:false,这样就无法修改它们的值。
in 操作符会检查属性是否在对象及其[[prototype]] 原型链中。hasOwnProperty() 只会检查属性是否在某个对象中,不会检查 [[prototype]] 原型链。
propertyIsEnumerable(...) 会检查给定的属性名是否存在于对象中,而不是原型链中,并且满足 enumerable: true;
Object.keys(...) 会返回一个数组,包含所有可枚举属性,Object.getOwnPropertyNames(...)会返回一个数组,包含所有属性,无论他们是否可枚举。
in 与 hasOwnProperty(...) 的区别在于是否查找 [[prototype]] 原型链,而 Object.keys(...)、Object.getOwnPropertyNames(...)、propertyIsEnumerable(...)、hasOwnProperty() 都只会查找对象中是否直接包含某个属性。
•问题标注 Q:(question)
•答案标注 R:(result)
•注意事项标准:A:(attention matters)
•详情描述标注:D:(detail info)
•总结标注:S:(summary)
•分析标注:Ana:(analysis)
•提示标注:T:(tips)