一、创建一个对象的语法

var myObj = { key: value
// ... };//字面量
var myObj = new Object(); //new
myObj.key = value;

二、js中的内置对象

String,Number,Boolean,Object,Function,Array,Date,RegExp,Error

在使用string 等创建的字面量形式时,js会隐试转换成其对应的内置对象,nullundefined没有对应的构造形式,Date 只有构造,没有字面量形式

三、对象的中的属性

var myObject = {
a: 2
};
myObject.a; // 2
myObject["a"]; // 2

. 操作符要求属性名满足标识符的命名规范,而 [".."] 语法 可以接受任意 UTF-8/Unicode 字符串作为属性名。在对象中,属性名永远都是字符串。如果你使用 string(字面量)以外的其他值作为属性 名,那它首先会被转换为一个字符串。即使是数字也不例外

四、可计算属性名

ES6 增加了可计算属性名[prefix + "bar"]

var prefix = "foo";
var myObject = {
[prefix + "bar"]:"hello",
[prefix + "baz"]: "world"
};
myObject["foobar"]; // hello
myObject["foobaz"]; // world

五、对象复制

function anotherFunction() { /*..*/ }
var anotherObject = {
c: true
};
var anotherArray = [];
var myObject = {
a: 2,
b: anotherObject, // 引用
c: anotherArray, // 引用
d: anotherFunction
};
anotherArray.push( anotherObject, myObject );

以上代码myObject中的b,c只是引用了anotherObject,anotherArray,相当于b指向anotherObject,anotherObject指向c,而b并没有直接指向c,只是做了一层浅拷贝。

可以通过JSON实现一个深拷贝,JSON.stringify( someObj ) 将对象someObj生成一个JSON字符串,但这种方法只适用于对象内的属性可以被JSON序列化的情况

var newObj = JSON.parse( JSON.stringify( someObj ) );

ES6 Object.assign(..) 可以实现对象的浅拷贝

六、对象的属性描述符

var myObject = { a:2
};
Object.getOwnPropertyDescriptor( myObject, "a" );
// {
// value: 2,
// writable: true, 可写
// enumerable: true,可枚举
// configurable: true 可配置
// }

Object.getOwnPropertyDescriptor获取对象属性的描述,

var myObject = {};
Object.defineProperty( myObject, "a", {
value: 2,
writable: true,
configurable: true,
enumerable: true
} );
myObject.a; // 2
  • Writable决定是否可以修改属性的值。

  • Configurable只要属性是可配置的,就可以使用 defineProperty(..) 方法来修改属性描述符

  • Enumerable控制属性是否会出现在对象的属性枚举中

var myObject = {};
Object.defineProperty( myObject, "FAVORITE_NUMBER",
{ value: 42,
writable: false,
configurable: false } );

结合 writable:falseconfigurable:false就可以创建一个常量属性(不可修改、 重定义或者删除)

var myObject = {
a:2
};
Object.preventExtensions( myObject );
myObject.b = 3; myObject.b; // undefined

Object.preventExtensions( myObject );禁止一个对象myObject添加新属性并且保留已有属性

Object.seal(..) 会创建一个“密封”的对象,这个方法实际上会在一个现有对象上调用 Object.preventExtensions(..) 并把所有现有属性标记为 configurable:false。

Object.freeze(..) 会创建一个冻结对象,这个方法实际上会在一个现有对象上调用 Object.seal(..) 并把所有“数据访问”属性标记为 writable:false,这样就无法修改它们的值。

七、[[Get]]

var myObject = { a: 2};myObject.a; // 2

在语言规范中,myObject.a 在 myObject 上实际上是实现了 [[Get]] 操作,对象默认的内置 [[Get]] 操作首先在对象中查找是否有名称相同的属性, 如果找到就会返回这个属性的值,反之遍历可能存在的 [[Prototype]] 链上是否有属性a,没有[[Get]] 操作会返回值 undefined。

注意,这种方法和访问变量时是不一样的。如果你引用了一个当前词法作用域中不存在的变量,并不会像对象属性一样返回 undefined,而是会抛出一个 ReferenceError 异常

var myObject = {
a: undefined
};
myObject.a; // undefined
myObject.b; // undefined

仅根据返回值无法判断出到底变量的值为 undefined 还是变量不存在

8、[[Put]]

[[Put]] 被触发时,如果已经存在这个属性,[[Put]] 算法大致会检查下面这些内容。

  1. 属性是否是访问描述符,如果是并且存在setter就调用setter。

  2. 属性的数据描述符中writable是否是false?如果是,在非严格模式下静默失败,在严格模式下抛出 TypeError 异常。

  3. 如果都不是,将该值设置为属性的值。

九、Getter和Setter“访问描述符”

在 ES5 中可以使用 getter 和 setter 部分改写默认操作,但是只能应用在单个属性上,无法应用在整个对象上。getter 是一个隐藏函数,会在获取属性值时调用。setter 也是一个隐藏函数,会在设置属性值时调用。对于访问描述符来说,JavaScript 会忽略它们的 value 和 writable 特性,取而代之的是关心 set 和 get(还有 configurable 和 enumerable)特性。

var myObject = {
// 给 a 定义一个 getter
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

不管是对象文字语法中的get a() { .. },还是defineProperty(..)中的显式定义,二者 都会在对象中创建一个不包含值的属性,对于这个属性的访问会自动调用一个隐藏函数, 它的返回值会被当作属性访问的返回值

var myObject = {
// 给 a 定义一个 getter
get a() {
return this._a_;
},
// 给 a 定义一个 setter
set a(val) {
this._a_ = val * 2;
}
};
myObject.a = 2;
myObject.a; // 4

setter 会覆盖单个属性默认的 [Put]操作。通常来说 getter 和 setter 是成对出现的

十、如何区分属性是否存在

var myObject = {
a:2
};
("a" in myObject); // true
("b" in myObject); // false
myObject.hasOwnProperty( "a" ); // true
myObject.hasOwnProperty( "b" ); // false

in 操作符会检查属性是否在对象及其 [[Prototype]] 原型链中,hasOwnProperty(..) 只会检查属性是否在 myObject 对象中,不会检查 [[Prototype]] 链。

枚举

var myObject = { };
Object.defineProperty( myObject,
"a",
// 让 a 像普通属性一样可以枚举
{ enumerable: true, value: 2 }
);
Object.defineProperty( myObject,
"b",
// 让b不可枚举
{ enumerable: false, value: 3 }
);
myObject.b; // 3
("b" in myObject); // true
myObject.hasOwnProperty( "b" ); // true
// .......
for (var k in myObject) {
console.log( k, myObject[k] );
}
myObject.propertyIsEnumerable( "a" ); // true
myObject.propertyIsEnumerable( "b" ); // false
Object.keys( myObject ); // ["a"]
Object.getOwnPropertyNames( myObject ); // ["a", "b"]
// "a" 2

propertyIsEnumerable(..) 会检查给定的属性名是否直接存在于对象中(而不是在原型链 上)并且满足 enumerable:true。

总结

对象中的函数并不属于对象本身而只是保存了对函数引用的指针,指向函数实际的地址。

对象本身并不带有迭代器,所以要使用for...of遍历对象时需要内置一个迭代器,而数组内部自带了迭代器可以直接使用for...of遍历。

对象查找属性时先会寻扎当前对象是否有该属性,没有则在该对象的原型链上查找,没找到会返回undefined,所以当获取一个属性值返回undefined时并不能确定该属性是否不存在

for ... in...用在对象上,用在数组上不仅会包含所有数值索引,还会包含所有可枚举属性,数组用for循环

有 的 对 象 可 能 没 有 连 接 到 Object.prototype( 通 过 Object. create(null) 来创建)Object.prototype.hasOwnProperty. call(myObject,"a")

【你不知道的javaScript 上卷 笔记6】javaScript中的对象相关内容的更多相关文章

  1. 你不知道的JavaScript上卷笔记

    你不知道的JavaScript上卷笔记 前言 You don't know JavaScript是github上一个系列文章   初看到这一标题的时候,感觉怎么老外也搞标题党,用这种冲突性比较强的题目 ...

  2. 【你不知道的javaScript 上卷 笔记3】javaScript中的声明提升表现

    console.log( a ); var a = 2; 执行输出undefined a = 2; var a; console.log( a ); 执行输出2 说明:javaScript 运行时在编 ...

  3. javascript 学习笔记之JQuery中的Deferred对象

    Deffered是Jquery中的一个非常重要的对象,从1.5版本之后,Jquery中的ajax操作都基于Deffered进行了重构,这个对象的处理模式就像其他Javascript框中的Promise ...

  4. Javascript学习笔记1 javascript的特点

    ..对于网页而言,Javascript无处不在,对于英语不好的人它简直是噩梦般的存在,但形式所逼,今天开始着手学习!希望自己能坚持下去.从什么地方着手,我的目标是从大处着眼,从应用着眼,不抠细节,反正 ...

  5. JavaScript学习笔记(6)——JavaScript语法之对象

    JavaScript 中的所有事物都是对象:字符串.数字.数组.日期,等等. 在 JavaScript 中,对象是拥有属性和方法的数据. 属性是与对象相关的值. 方法是能够在对象上执行的动作. 提示: ...

  6. JavaScript学习笔记(4)——JavaScript语法之变量

    一.变量可以使用短名称(比如 x 和 y),也可以使用描述性更好的名称(比如 age, sum, totalvolume). 变量必须以字母开头 变量也能以 $ 和 _ 符号开头(不过我们不推荐这么做 ...

  7. 1.2(JavaScript学习笔记)JavaScript HTML DOM

    一.DOM DOM全称为document object model(文档对象模型). 此处的文档指当前HTML文档,对象指HTML标签. 当网页被加载时,浏览器会创建页面的文档对象模型. 下面结合具体 ...

  8. 1.3 (JavaScript学习笔记)JavaScript对象

    在JavaScript中所有事物都是对象,字符串.数值.数组.函数...等, JavaScript还允许自定义对象.这些在1.1中有所介绍. 一.遍历对象属性 <!DOCTYPE html> ...

  9. Javascript学习笔记3 Javascript与BOM简介

    什么是BOM BOM是browser object model的缩写,简称浏览器对象模型 BOM提供了独立于内容而与浏览器窗口进行交互的对象 由于BOM主要用于管理窗口与窗口之间的通讯,因此其核心对象 ...

随机推荐

  1. CentOS、Ubuntu的安装

    Linux使用最广泛的2个发行版:CentOS.Ubuntu. CentOS安全性高,常用作企业的服务器,Ubuntu常用作个人桌面. 常见的虚拟机有2个: VM VirtualBox,这个是Orac ...

  2. 疫情之下,使用FRP实现内网穿透,远程连接公司电脑进行办公

    当前情况下,经常会有需要到公司电脑进行一些操作,比如连接内网OA,数据库或者提交文档.为了减少外出,将使用frp进行内网穿透的方法进行一个说明. 前提条件 1. 一台拥有公网 IP 的设备(如果没有, ...

  3. DK1.5-JDK11各个新特性

    摘要: 参考文献: https://blog.csdn.net/lsxf_xin/article/details/79712537 JDK各个版本的新特性 要了解一门语言,最好的方式就是要能从基础的版 ...

  4. 【转载】ibit-mybatis介绍

    原文链接:ibit-mybatis介绍 概述    ibit-mybatis是一个Mybatis的增强工具,在Mybatis的基础上增加了新的特性与功能,志在简化开发流程.提高开发效率. 特性 无侵入 ...

  5. 【React Native】在网页中打开Android应用程序

    React Native官方提供Linking库用于调起其他app或者本机应用.Linking的主要属性和方法有: 属性与方法 canOpenURL(url); 判断设备上是否有已经安装相应应用或可以 ...

  6. java面向对象入门(1)-入门介绍

    在本 Java OOPs 概念教程中,我们将学习四种主要的面向对象原则 -- 抽象.封装.继承和多态性.它们也被称为面向对象编程范式的四大支柱. _抽象_是在不考虑无关细节的情况下公开实体基本细节的过 ...

  7. [Python]PyCharm中%matplotlib inline报错

    %matplotlib作用 是在使用jupyter notebook 或者 jupyter qtconsole的时候,才会经常用到%matplotlib,也就是说那一份代码可能就是别人使用jupyte ...

  8. 使用centos6.5整理出来的常用命令

    1.Vi 基本操作1) 进入vi 在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ vi myfile 进入vi之后,是处于「命令行模式(command mode)」,您要切换到「插 ...

  9. Python_2_daythree2_CyclicStructure

    """Function_1: for-in循环用for循环实现1~100之间的奇数求和 Time: 2020.1.27Author: YaoXie"" ...

  10. js获取页面缩放比例

    今天在网上看到一位大神写的一篇文章,出处记不得了,只是因为我在做项目的时候需要用到所以看了一眼. 经理要求我把两张图表上下排列(非响应式的)改成可以适配浏览器的,刚开始只是想改样式,看到代码才发现原来 ...