对象到基本类型的转换
- 首先,不管何时,当一个非空对象用在布尔环境中的时
if((typeof o == "object") && (o instanceof Date))
候,它都转换为false。这对于所有的对象(包括数组和函数)都是成立的,即便对那些用来表示应转换为false的基本类型值的包装对象来说,也是如此。例如,所有如下对象在布尔环境中的时候都转换为true。
- new Boolean(false)
- new Number(0)
- new String("")
- new Array
行数对用过程中的传值与传址
- 基本类型传址,对象传址
- String为immutable,看起来是对象类型,但是表现起来反而类似传值
- Array、Function是特殊的对象,所以传址
第四章 变量
变量的声明
- 可以用var语句多次声明同一个变量
- 尝试读取一个未声明的变量的值会发生错误
- 尝试给一个未用var声明的变量赋值,javascript会隐式声明该变量。但是要注意,隐式声明的变量总是被创建为全局变量,及时改变量只在一个函数体内使用。要防止创建局部变量的使用创建全局变量,就必须在函数体内部使用var语句。
var scope = "global";
function checkscope(){
scope = "local";//local
document.write(scope);
myscope = "local";//declare a new global var implicitly
document.write(myscope);
}
checkscope();
document.write(scope);
document.write(myscope);//print "local"
函数使用了局部作用域内定义的全局变量,可是全局作用域内的函数更本不知道它怎么来的,所以这是一件很危险的事,所以在局部作用域内都要使用var声明。- 没有块级作用域
深入理解变量作用域
1. 每个JavaScript执行环境都和一个和它关联在一起的作用域链(scope chain)。这个作用域链式一个对象列表或对象链。当javascript代码需要查询变量x的值时,它开始查看该链的第一个对象。如果那个对象有一个名为x的属性,那么就采用那个属性的值。如果第一个对象没有名字x的属性,那么会继续查询联众的第二个对象,以此类推。在javascript的顶层代码中(不属于任何函数定义的代码)。作用域链只由一个对象构成,那就是全局对象。
第五章 对象和数组
- 属性枚举使用for......in
- 检出属相的存在性两种方法
- in运算符
if("x" in o)o.x = 1
- 直接判断属性是否存在
if(o.x !==undefined)o.x = 1;
但是,一个属性页可能已经存在但是未定义,如:
这种情况下,两种方式执行效果就不一致了o.x = undefined
- 删除属性使用delete
delete o.x
- "."运算符和“[]”运算符都可以作为属性访问运算符,但是后者使用字符串作为参数,更加灵活
Object对象的属性和方法
- Constructor:每个对象都有一个constructor属性,它引用了初始化这个对象的构造函数。可以使用如下的代码来确定一个位置的类型:
instanceof 运算符检查constructor属性的值,因此上面的代码可以写成:if((typeof o == "object") && (o.constructor == Date))
if((typeof o == "object") && (o instanceof Date))
- valueOf():和toString()很像,用在JS需要把一个对象转换为某种数据类型,也就是一个数字而不是一个字符串的时候,才调用该方法。如果一个对象用在需要一个基本数值的环境中,JS会自动调用该方法。默认的valueOf什么也不做。
- hasOwnProperty()方法:如果一个对象用一个单独的字符串参数所指定的名字来本地定义一个非继承的属性,hasOwnProperty()方法就返回true。否则返回false。
- isPrototypeOf()方法:如果isPrototypeOf()方法所属的对象时参数的原型对象,那么,该方法就返回true。否则,它返回false,如:
var o = {} Object.prototype.isPrototypeOf(0)//true:o.constructor == Object Object.isPrototypeOf(0);//false o.isPrototypeOf(Object.ptototype) Function.prototype.isPrototypeOf(Object)
数组
- 数组的声明:
A. 直接 “[ ]”声明var a = [] var b = [1,2,3,4,5] var c = [1,,3]//长度为3,中的的元素为undefied
B.使用new声明var x = new Array()//无参数 var y = new Array(1,2,3,"testing")//指定前几个值 var c = new Array(10)//指定数组初始长度,然后每个都设置为undefined
- 数组的长度是动态的
- 关于内存分配:javascript中的数组时稀疏的。这意味着数组的下标不必落在一个连续的数字范围内,只由那些真正存储在数组中的元素才能够有javascript是吸纳分配到内存。比如:
js职位下标0和10000分配了内存,中间的0~9,999并没有分配内存a[0] = 1; a[10000] = "this si element 10,000"
- 数组的删除:
delete运算符吧一个数组元素设置为undefined,但元素本身还继续存在。要真正删除一个元素,以使下标高于它的所有元素都向下迁移到较低的下标位置,需要使用以下一组方法:
A.shift() 删除数组第一个元素
B.pop()删除最后一个元素
C.splice()从一个数组中删除一个连续范围内的元素。 - 其他方法:
1. join(var):转化为字符串,中间参数为希望的分隔符
2.split(var):和join相反
3.reverse():讲调到元素的顺序并返回颠倒后的数组。它在原数组上执行这一操作,而不是创建一个重排元素的新数组。
4.sort():在原数组上排序
5.slice(start,end):返回片段,end可以为负数,-1表示数组最后一个元素
6.push()和pop():实现栈的操做
7.unshift()和shift():和push、pop类似,只不过是在数组的头部进行元素的插入和删除 - 6.