对象
定义方式
- 文字形式声明(null/undefined只能文字声明)
- 构造形式(Date只能构造)
js种主要类型:
string/number/Boolean/null/undefined/object/symbol(简单基本类型)
对象子类型:
函数/数组(复杂基本类型)
内置对象:
String/Number/Boolean/Object/Function/Array/Date/RegExp/Error
(简单基本类型本身不是对象,但是typeof null 时会返回字符串 “object”)
对象和字面量
var strPrimitive = “I am a string”; //字面量
typeof strPrimitive; // “string”
strPrimitive instanceof String; // false
var strObject = new String( “I am a string” );//对象
typeof strObject; // “object”
strObject instanceof String; // true //
Object.prototype.toString.call( strObject ); // [object String]
访问对象:
var myObject = { a: 2 };
myObject.a; // 2
myObject[“a”]; // 2
- 属性访问:
命名要规范
(对象的内容是由一些存储在特定命名位置的(任意类型的)值组成的,我们称之为属性) - 键访问:
计算属性名ES6:文字形式包裹表达式作为属性名
var prefix = “foo”;
var myObject ={
[prefix + “bar”]:“hello”,
[prefix + “baz”]: “world” };
myObject[“foobar”]; // hello
myObject[“foobaz”]; // world
//symbol?
添加一个属性:最好只用对象来存储键 / 值对,只用数组来存储数值下标 / 值对
var myArray = [ “foo”, 42, “bar” ];
myArray[“3”] = “baz”;
myArray.length; // 4
myArray[3]; // “baz”
复制对象:
浅拷贝:
Object.assign(…)
var newObj = Object.assign( {}, myObject );
newObj.a; // 2
newObj.b === anotherObject; // true
newObj.c === anotherArray; // true
newObj.d === anotherFunction; // true
深拷贝:
1.对JSON安全:var newObj = JSON.parse( JSON.stringify( someObj ) );
js属性
属性的定义:对象的内容是由一些存储在特定命名位置的(任意类型的)值组成的, 我们称之为属性。
属性描述符:writable(是否可修改)/配置configure(能否配置二次调用defineProperty)/枚举enumrable(决定能否遍历)/删除(在严格模式/非严格模式下)
访问描述符:你给一个属性定义 getter、setter 或者两者都有时,这个属性会被定义为“访问描述符”。包括Getter/setter:创建不存在的属性,访问这个属性会调用隐藏的函数(可用于枚举/计算)
添加/修改对象属性:Object.defineProperty(…):
如何修改?
1.对象文字语法
get a() {
return this._a_;
}, // 给 a 定义一个 setter
set a(val) {
this._a_ = val * 2;
}
};
myObject.a = 2;
myObject.a; // 4
2.DEFINEPROPERTY(…)显式定义——枚举
get a() {
return 2;
} };
Object.defineProperty(
myObject, // 目标对象
"b", // 属性名
{ // 描述符 // 给 b 设置一个 getter
get: function(){ return this.a * 2 }, // 确保 b 会出现在对象的属性列表中
enumerable: true
}
);
myObject.a; // 2
myObject.b; // 4
判断属性存在性
in 操作符会检查属性是否在对象及其 [[Prototype]] 原型链中
hasOwnProperty(…) 只会检查属性是否在 myObject 对象中
遍历可枚举列表
- for…in
特点:按照索引,无法直接获取属性值
var myArray = [1, 2, 3]; for (var i = 0; i < myArray.length; i++) { console.log( myArray[i] ); } // 1 2 3 - For…of直接遍历
var myArray = [ 1, 2, 3 ];
for (var v of myArray) {
console.log( v );
} // 1 // 2 // 3
- 辅助迭代器foreach()/every()/some()
- 数组内置迭代器 Symbol.iterator 来获取对象的 @@iterator 内部属性。
var it = myArray[Symbol.iterator]();
it.next(); // { value:1, done:false }
it.next(); // { value:2, done:false }
it.next(); // { value:3, done:false }
it.next(); // { done:true }