首页 > 代码库 > 读书笔记-你不知道的JS上-对象
读书笔记-你不知道的JS上-对象
好想要对象···
函数的调用位置不同会造成this绑定对象不同。但是对象到底是什么,为什么要绑定他们呢?(可以可以,我也不太懂)
语法
对象声明有两个形式:
1、字面量 => var obj = { ... };
2、构造形式 => var obj = new Object();
两种形式生成的对象是一样的,唯一的区别是,在文字声明中可以添加多个键值对,构造形式只能逐个添加。
类型
JS中有六种主要类型:string、number、booleam、null、undefined、object。
注意,简单数据类型本身并不是对象,null有时会被当成一种对象类型,但是这其实只是语言本身的一个bug,即对null执行typeof null时会返回字符串object。实际上,null本身是基本类型。(原理是这样的,不同的对象在底层都表现为二进制,在JS中二进制的前三位都为0的话会被判断为object类型,null的二进制表示是全0,所以执行时会返回object。)
有一种常见的错误是‘万物皆对象’,这显示是错误的(我去,被老师骗了)。
实际上,JS中有许多特殊的对象子类型,称之为复杂基本类型。
函数就是对象的一个子类型(技术角度来讲叫可调用对象)。JS中的函数是‘一等公民’,因为它们本质上和普通对象一样,所以可以像操作其他对象一样操作函数。
数组也是对象的一种类型。
内置对象
JS有一些对象子类型,通常被称为内置对象。
包括String、Number、Boolean、Object、Function、Array、Date、RegExp、Error。
内置对象可以当作构造函数来使用,从而可以构造一个对应子类型的新对象。
如果用字面量形式创建number、string(var str = ‘jimmy‘,num = 1),调用对象方法(length)时会自动转换成对象并调用方法,然后还原为基本数据类型返回,这个过程是不可见的。但是也没有必要为了性能特地通过构造形式声明基本数据,这种转换十分频繁,所以底层已经做了优化,用字面量更好更快。
null和undefined没有对应的构造形式,只有文字形式。
Date只有构造,没有文字形式。
对于Object、Array、Function、RegExp来说,无论使用哪种形式出来的都是对象。
Error对象很少在代码中显示创建,一般在抛出异常的时候被自动创建。也可以用new Error()这种构造形式创建,一般来说,用不着。
报错误信息,vue源码中用了console.error(),如下代码:
warn = function(msg, vm) { if (hasConsole && (!config.silent)) { console.error("[Vue warn]: " + msg + " " + ( vm ? formatLocation(formatComponentName(vm)) : ‘‘ )); } };
专门用来生成错误信息的函数,jQuery源码中反正是没见着,尤大还是很贴心的。
内容
对象内容由键值对组成,键更像是一个指针,保存内容所在存储位置的地址。(ES6之前,不支持奇怪的键,所以只能用普通字符串定义键)
可以用点访问和[]访问键,主要区别是点访问属性名必须满足标识符的命名规范,而[]可以接受任意形式的字符串。
还有一个细微差别:
function fn(a) { console.log(obj.a); //undefined console.log(obj[a]); //1 } var obj = { ab: 1, } fn(‘ab‘);
当访问的属性名作为参数传入函数时,使用[]访问才能正常得到结果。
在对象中,属性名永远是字符串,如果使用其余类型的值作为属性名,会被强制调用toString方法。
var obj = {} obj[true] = 1; obj[1] = 2; obj[obj] = 3; console.log(obj[‘true‘]); //1 console.log(obj[‘1‘]); //2 console.log(obj[‘[object Object]‘]); //3
好玩!
可计算属性名
ES6中可以使用表达式计算属性名。
读书笔记-你不知道的JS上-对象