- for/in语句语法:
for(variable in object)
statement
ariable是变量名,表示数组的一个元素或者对象的一个属性。在循环体statement内部,可以使用变量variable和“[ ]”来查询该对象属性的值。如下
for(var prop in my_obj)
document.write("name: " + prop + "; value: " + my_obj[prop]);
注意:for/in并不会遍历所有对象的所有可能属性。对象的属性是只读的、永久的(不可删除的)或者不可枚举的,此时for/in不能枚举出来。 - 在try/catch/finally中,在try语句块中出现return、continue或break使控制流离开try块,那么在控制流到达新目的前,finally块会被执行。
- 检查属性的存在性的三种方法
1)if("prop" in obj) ...
2)if(obj.prop !== undefined) ...
3)if(obj.prop) ... - 访问对象属性的两中方式:
1)obj.prop
2)obj["prop"] - JavaScript中的所有对象都继承自Object。
- JavaScript中的每一个Object对象都有一个constructor属性,它引用了初始化这个对象的构造函数。如
var d = new Date();
d.constructor == Date; //返回true
d.constructor == Date与o instanceof Date都可以用来判断d的构造函数是否是Date。 - 数组调用toString方法,返回一个数组元素的列表,每一个元素都转换陈刚一个字符串。function函数调用toString则返回函数的源代码。
- 数组的创建
1)直接量的方式:var a = [ 1, 3 ]; a = [ ]
2)无参数调用:var a = new Array();
3)指定数组的前n个元素的值:var a = new Array(4, 2);
4)指定数组的长度:var a = new Array(10); - JavaScript中的数组是稀疏的,意味着数组的下标不必落在一个连续的数字范围内,只有真正存储在数组中的元素才能够分配到内存。如下,只有下标为0和1000的元素分配到了内存,而下标为1-999的元素不分配内存
a[0] = 1;
a[1000] = "1000“; - delete数组中的一个元素时并没有真正的删除该元素,元素本身还存在,只是把该元素的值设置为undefined。要真正删除一个元素,可以使用Array.shift()或Array.pop()或Array.splice()。
- 数组的length属性及可以读也可以写,如果给length设置了一个比它当前值小的值,就会发生截断,这个长度之外的元素会被抛弃。如果length设置的值比当前的大,那么新的,未定义的元素就会被添加到数组末尾以使得数组增长到指定的长度。
- 给函数传递参数时,如果传递的参数比函数需要的个数多,那么多余的值会被忽略。如果传递的参数比函数需要的个数少,那么所忽略的几个参数会被赋予undefined。
- Arguments对象是一个类似数组的对象,获取实际传递给函数的参数值。arguments[0]表示传递给函数的第一个参数值,arguments[n]表示传递个函数的n个参数值。arguments.length表示实际传递给函数的个数。Arguments对象还定义了callee属性,用来引用当前正在执行的函数。
- 函数的length属性表示函数声明时的参数个数。
- call()和apply()第一个参数都是要调用的函数对象,在函数体内值this的值。call的剩余参数是传递给要调用的函数的值。apply的剩余是用方括号括起来的参数值。
- Function()构造函数最后一个参数是函数体,前面的参数是要传递的参数。
var f = function(x, y){return x+y;};
var F = new Function("x", "y", "return x+y;");//与上面等价 - var obj = new Object();在创建这个空对象后,new设置了这个对象的原型,一个对象的原型就是构造函数的prototype属性的值。所有函数都有一个prototype属性,当这个函数定义时,prototype属性自动创建和初始化。prototype属性的初始化值是一个对象,这个对象有个constructor属性,它指回和原型相关联的构造函数。添加个这个原型对象的任何属性,都会成为构造函数初始化的对象的属性。
- 原型是放置方法和其他不变属性的理想地方。
- 使用原型对象可以显著的减少每个对象所需的内存数量,因为对象可以继承原型的很多属性。即便在对象创建后才添加到原型中的属性,对象也可以继承它。这意味着可以为已有的类添加新的方法。
- 类属性:Obj.prop = ”property“;
- 原型对象本身是一个对象,它由Object()构造函数创建,这意味着原型对象继承了Object.prototype属性。基于原型的继承并不限于一个单个的原型对象,而是包含了一个原型对象的链。因此,Obj类的对象就继承了Obj.prototype和Object.prototype属性。当在查询某个属性的时,首先查询这个对象本身,若未查到,则沿着原型链依次查询Obj.prototype和Object.prototype对象。若在中途找到了该属性,就不继续查找了。
- 调用被覆盖的方法:Obj.prototype.toString.apply(this);
- typeof 布尔值:boolean
typeof 数值:number
typeof 字符串:string
typeof null或对象或数组:object
typeof undefined:undefined
typeof 函数:function - 下面的表达是都为true
typeof f == "function"
f instanceof Function
f instanceof Object - 根据目录创建名字空间,该空间内有define和provide两个方法。假设目录flanagan/Class.js
var flanagan; if(!flanagan) flanagan = {}; flanagan.Class = {}; flanagan.Class.define = function(data){}; flanagan.Class.provide = function(o, c){};
- 根据域名创建名字空间,该空间内有define和provide两个方法。假设该域名lxzflanagan.com
var com; if(!com) com = {}; else if(typeof com != "object") throw new Error("com已经存在"); if(!com.lxzflanagan) com.lxzflanagan = {}; throw new Error("com.lxzflanagan已经存在"); if(!com.lxzflanagan.Class) throw new Error("com.lxzflanagan.Class已经存在"); com.lxzflanagan.Class = { define: function(data){}, provide: function(o, c){} };
- 测试一个模块的可用性
if(!com || !com.lxzflanagan || !com.lxzflanagan.Class) com.lxzflanagan = {}; throw new Error("com.lxzflanagan.Class不存在");
- JavaScript不能明确的区别私有与公有标记。通常我们通过文档说明的方式来告诉开发者哪些公有哪些私有,开发者要严格遵循API文档的说明来使用。还可以通过在私有变量前加下滑线来标记私有属性,如_name。
JavaScript小笔记(二)
最新推荐文章于 2024-03-16 13:21:00 发布