(一)基本问题
JS的数据类型(不是数据结构)分:简单数据类型(undefined\null\boolean\string\number\symbol)、复杂数据类型(object).
对象是可变的键值对的集合,最关键是对象是无类型(class-free)的,也就是说对于新的属性值类型没有要求。属性名可以是name(标识符)、string(包括空字符串),很适合各类数据管理。最牛逼的机制是对象之间的非传统意义上的继承或是说委托更好一些;可以减少对象初始化的时间和内存。而且这是一种不同于类的新的编程思路。
对象的字面量表示法的属性名类型是字符串,虽然有时候输入的可能并不是字符串,但实际上是被转为了字符串;但若不符合标识符规则时就要显式的使用字符串。这在检索时会表现出来。对象查询属性时若找不到(包括原型链)返回undefined。可以使用"[]"、"."来获得,符合name规范时使用点访问法;其余使用[]访问法。若已有属性会被覆盖,若不含属性可以新建属性。
对象在堆内存中不会被复制,复制的是对象的引用。所以传递的函数、数组等都是引用而已。
(二)原型链问题
原型链是一种内部机制,我在我得第一篇博客已经表达过这个问题。就算根本不设置也会存在。对象有设置对象原型的方法DC原来提出有:
if ( typeof Object.beget !== "undefined") {
Object.create = function (obj) {
function F () {}
F.prototype = obj;
return new F();
}
}
另外,必须指出一下问题:使用返回的new F()的内部原型链由F.prototype更新。原型关系是一种动态关系,原型链中更新的时候,查找时会对其他立即显示。
对象属性的查找先从对象开始,然后会向原型链中查找。可以使用typeof来大致做一下过滤。
可以使用for/in语句来枚举对象的属性,但不能保证出来的顺序;同时还会枚举原型链的。可使typeOf和obj.hasOwnProperty()来过滤。如:
for ( var key in obj ) {
if (obj.hasOwnProperty(key)) {
if ( typeof key !=="function") {
//代码
} } }
可以使用delete来删除对象的属性,而不会修改原型链。
(三)减少全局变量污染
由于JS没有连接器,编译单元的*变量会出在全局变量中。为了减少变量污染,可以一个公共的接口来包含全局资源或使用闭包(与词法作用域相关)。
(四)其余问题
实际上对象的问题很复杂,这里不写了,以后陆续会有许多关于对象的问题。