《javascript权威指南》学习笔记数组对象

时间:2022-08-27 08:14:55

一、对象是属性的合集,是动态的,可变的。

二、常见6种用法:创建、设置、查找、删除、检测、枚举。

           创建对象的三种方法:(1)对象直接量:var empty = {};
(2)new:var 0 = new Object();
(3)Object.create():var o1 = Object.create({x:1 ,y=2});

删除属性:delete只能删除自有属性,不能删除继承属性。

检测属性:大致有这几个方法:in、hasOwnPreperty()、propertyIsEnumerable()
in方法:例如:var o = { x:1 };
"x" in o; // true:“x”是o的属性
“toString” in o //true:o继承toString属性

“!===”方法(区别 in 方法):
var o = { x:undefined };
o.x !==undefined //false,属性存在,但值为undefined
o.y !==undefined //false。属性不存在
"x" in o //true.属性存在
"y" in o //false.属性不存在

hasOwnPreperty()方法:检测给定的名字是否为对象的自有属性,对于继承属性返回false。

枚举属性:for/in 循环可以遍历对象中所有可枚举的属性(包括自有和继承),对象继承的内置方法是不可枚举的,比如“toString”
var o = { x:1 ,y:2 ,z:3 };
o.propertyIsnumerable("toString") // =>false.不可枚举
for( p in o ) // 遍历属性

三、属性特性(3种):可写(writable attribute)、可枚举(enumerable attribute)、可配置(configurable attribute)
对象特性(3种):对象的原型(prototype)、对象的类(class)、对象的扩展标记(extensible flag)

四、对象的种类(3类):内置对象、宿主对象、自定义对象
对象的属性类别(2类):自有属性、继承属性

五、 原型链概念:使用{}和使用new创建的对象的原型都是Object.prototype.同样,通过new Array()创建的对象的原型就是Array.prototype,通过new Date()创建的对象的原型就是 Date.prototype.所以的内置构造函数都有一个继承自Object.prototype的原型,例如,Date.prototype的属性继承自Object.prototype。这一系列链接的原型对象就是所谓的“原型链”(prototype chain)。

   对象继承概念:假设要查询0对象的属性x,如果o中不存在x,那么将会继续在o的原型对象中查询属性x,如果没有,则在这个原型对象的原型上查询,直到找到x或者找到一个原型是nul的对象为止。

六、属性查询和设置:“.” 或 “[ ]”
注意:当使用方括号时,方括号内的表达式必须返回字符串或者一个可用转换成字符串的值。

七、关联数组:object[“prototype”],也称为散列、映射或者字典

八、getter和setter
由getter和setter定义的属性称作“存取器属性”。如果属性同时具有getter和setter方法,那么它是一个读/写属性。
getter方法无参数,setter方法有参数。
var o = {
data_prop : value;
get accessor_prop(){ },
get accessor_prop(){ }
};
存储器属性定义为一个或两个和属性同名的函数,但是这个函数定义没有使用function关键词,而是用get和set。

九、序列化对象:JSON.stringify()和JSON.parse()用来序列化和还原。
JSON.stringify()只能序列化对象可枚举的自有属性。

十、对象方法:toString()方法、toLocaleString()方法、toJSON()方法、valueOf()方法
一、javascript的数据类型分为:原始类型(数字、字符串、布尔)、对象类型;
特殊的原始值: null、undefined
特殊的对象: 全局对象、数组、函数
javascript变量是无类型的。

二、数字
javascript不区分整数值和浮点数值;
表示的整数范围为:-9007199254740992 ~ 9007199254740992(-2^53 ~ 2^53),包括边界值;
采用IEEE 754标准定义的64位浮点格式表示数字,这是一种二进制表示法。只能精确表示1/2^n的分数,并不能精确表示类似0.1这样简单的数字。
例如:

三、文本
字符串的使用:
var s = “Hello, world”;
s.charAt(0) //=>”H”
s.slice(-3) //=>”rld”
s.replace(“H”,”h”) //=>”hello, world”
s.toUpperCase() //=>”HELLO, WORLD”
注意:在js中,字符串是固定不变的,类似replace()和toUpperCase()的方法都是返回新字符串,源字符串并没有变换。
也可以用 [ ] 来访问字符串的单个字符,例如:
s[0] //=>”H”

四、null和undefined
null是关键字,undefined不是关键字。

五、包装对象

   包装对象:存取字符串、数字、布尔值的属性时创建的临时对象。

例如:
var s = “hello world!”
var word = s.substring(s.indexOf(” “)+1, s.length);
解读:引用字符串s的属性时,js就将字符串值通过new String(s) 的方式转换成对象,这个对象继承了字符串 的方法。一旦引用结束,这个新创建的临时对象就被销毁。
例如:
var s = “test”;
s.len = 4;
var t = s.len;
运行代码,t的值是undefined。因为,js在第二行代码创建临时对象并赋值为4,随机销毁了对象。 一、 数组索引值:基于零的32位数(0~2^32 - 2)

二、 创建数组:var a = new Array( 10 ) //数组长度10
var empty = [ , , ] //数组有2个元素,都是undefined
因为数组直接量的语法允许有可选的结尾的逗号。

三、 设置数组只读:在ECMAScript 5 中,Object.defineProperty()
a = [ 1, 2 ,3];
Object.defineProperty( a, “length” ,{ writable :false });
a.length = 0; // a不会变化!

四、 遍历数组:在嵌套循环或其他性能非常重要的上下文中,数组的长度应该只查询一次而非每次循环都要查询。所以下面是优化的遍历函数:
for(var i=0, len = keys.length ; i< len ; i++ ){ }

五、 ECMAScript 3 的数组方法:

六、 ECMAScript 5 中的数组方法:

七、数组相对其他对象独有的特性:
(1)自动更新length属性
(2)设置length为较小值将截断数组
(3)从Array.prototype中继承一些有用的方法
(4)类属性为“Array”

八、 类数组:var a = { };
var i = 0; //添加一些属性,称为“类数组”
while(i<10){
a[i] = i*i;
i++;
}
a.length =i;

九、 作为数组的字符串:
var a = test;
s.charAt(0) //=> “t”
s[0] //=> “t”

    注意:字符串是不可变值,故看做数组是只读的,如push()、sort()、reverse()、splice()等数组方法会修改数组,它们在字符串上是无效的。  会导致出错,但不报错//fibonacci函数被调用了453次。

//我们调用11次,而它自身调用了442次计算可能已被刚计算过的值。
var fibonacci = function(n){
return n<2 ? n:fibonacci(n-1)+fibonacci(n-2);
};
for(var i=0;i<=10;i+=1){
document.writeln(‘//’+i+’:’+fibonacci(i));
}

//改:

//它只被调用29次。我们调用11次,自身调用18次取得之前存储的结果。
var fibonacci = function(){
var memo = [0,1];
var fib = function(n){
var result = memo[n];
if(typeof result !== ‘number’){
result = fib(n-1)+fib(n-2);
memo[n]=result;
}
return result;
};
return fib;
}();。