语法
- 对象创建形式
- 字面量创建/构造形式创建
- 区别:字面量声明可以添加多个键值对,而构造形式必须手动逐个添加属性。
- 类型
- 简单类型:string,number,boolean,null,undefined
- 复杂(引用)类型: object
- es6 新增 symbol
- null 有时会被当做一种对象类型,其实是 js 的一个 bug,即对 null 执行 typeof null 会返回字符串'object',原因是不同的对象在底层都表示二进制,在 js 中二进制前三位都为 0 的会被判断为 object 类型,null 的二进制全是 0,自然前三位也是 0,所以执行 typeof 是返回'object'
内置对象
- String,Number,Boolean,Onject,Function,Array,Date,RegExp,Error
- 这些内置对象从表现形式来说很像其他语言中的类型(type)或者类(class).这些内置函数可以当做构造函数(new 调用)来使用,从而可以构造一个对应子类型的新对象.
内容
- 对象的内容时由一些存储在特定命名位置的(任意类型)的值组成的,称之为属性
- 存储在对象容器内部的是这些属性的名称,它们就像指针(技术角度看就是引用)一样,指向这些值真正的存储位置
var myObj ={
a:2
}
myObj.a // 2
myObj[a] //2
- 可以用.操作符或者[]操作符访问.
- .操作符被称为"属性访问",["a"]被称为键访问.
- 实际上它们访问的是同一个位置,并且会返回相同的值
- 区别:.操作符要求属性名满足标识符的命名规范,而[".."]语法可以接受任意UTF-8/Unicode字符串作为属性名.
- 在对象中,属性名永远都是字符串
可计算属性名
- 如可以使用myObj[prefix+name]
- ES6增加了可计算属性名,可以在文字形式中使用[]包裹一个表达式来当做属性名.
var prefix = 'foo'
var myObj = {
[prefix+"bar"] : 'hello',
[prefix+'baz'] : 'world'
}
myObj['foobar'] // hello
myObj['foobaz'] // world
不变性
- 结合writeable:false,configurable:false可以创建一个真正的常量属性(不可修改,删除,重定义)
- 禁止扩展:使用Object.preventExtensions(..)
Object.preventExtensions(obj)
obj.b=4
console.log(obj.b) //undefined
- 密封:Object.seal(..)创建一个密封对象,这个方法实际上会在一个现有对象上调用Object.preventExtensions(..)并把所有现有属性标记为configurable:false
- 冻结:Object.freeze(..):创建一个冻结对象,调用Object.seal(..),并把所有"数据访问"属性标记为writeable:false,即无法配置也不可写.
var objec = {a:2}
Object.freeze(objec)
objec.a =3
console.log(objec.a) //2
存在性
var uObj = {
a:2
}
console.log("a" in uObj) // true
console.log("b" in uObj) // false
console.log(uObj.hasOwnProperty('a'))// true
console.log(uObj.hasOwnProperty('b'))// false
- in 操作符会检出属性是否在对象及其Prototype原型链中
- hasOwnProperty(..)只会检查属性是否在uObj对象中,不会检查原型链。
- in操作符检查的是属性名
枚举
- 相当于可以出现在对象属性的遍历中
- Object.keys(..)和Object.getOwnPropertyNames(..)都只会查找对象直接包含的属性.
遍历
- ES5增加了一些数组的辅助迭代器,包括forEach(..),every(..)和some(..),
- forEach会遍历数组中的所有值并忽略回调函数的返回值。
- every会一直运行直到回到函数返回false
- some会一直运行到回调函数返回true
- every和some中特殊的返回值和普通for循环中的break语句类似,会提前终止遍历
- 使用for...in遍历对象是无法直接获取属性值的,实际上遍历的是对象中所有可枚举属性,需要手动获取属性值。
for (item in [1,2,3]){
console.log(item) // 0 1 2
}
for (key of [1,2,3]){
console.log(key) // 1 2 3
}
- ES6的for...of循环语法,直接遍历值而不是下标
- for..of 循环首先会向北访问对象请求一个迭代器对象,然后通过调用迭代器对象的next()方法来遍历所有返回值
- 数组有内置的@@iterator ,因此for..of可以直接应用在数组上
Comments | NOTHING