《你不知道的js》——对象

对象

定义方式

  1. 文字形式声明(null/undefined只能文字声明)
  2. 构造形式(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

  1. 属性访问:
    命名要规范
    (对象的内容是由一些存储在特定命名位置的(任意类型的)值组成的,我们称之为属性)
  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 对象中

遍历可枚举列表

  1. for…in
    特点:按照索引,无法直接获取属性值
    var myArray = [1, 2, 3]; for (var i = 0; i < myArray.length; i++) { console.log( myArray[i] ); } // 1 2 3
  2. For…of直接遍历
var myArray = [ 1, 2, 3 ]; 
for (var v of myArray) { 
console.log( v );
 } // 1 // 2 // 3
  1. 辅助迭代器foreach()/every()/some()
  2. 数组内置迭代器 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 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值