[size=medium]1.字符串的操作[/size]
[size=small]
JavaScript中提供了很多字符串的操作,例如字符串的截断,字符串的链接等,所有这些操作都不会引起字符串本身的变化,操作的结果是返回一个新的字符串。substr和substring都是返回一个原来字符串的子串,二者的区别在于substring(m, n)表示的是[m,n)即左闭右开区间,而substr(m,n)表示的是[m,n]左闭右闭区间。
[/size]
[size=medium]2.给字符串设置一个属性[/size]
[size=small]
我们定义一个字符串,然后给字符串设置一个len属性,发现我们设置的属性是无效的,看看下面的代码段
[/size]
[size=small]
上述程序中再次使用s.len的时候,发现t的值是undefined。第二行代码创建了一个临时字符串对象,并给其len属性赋值为4,随即销毁这个对象。第三行通过原始的字符串值创建一个新字符串对象,尝试读取其len属性,这个属性自然不存在,表达式求值结果为undefined。这段代码说明了在读取字符串,数字和布尔值的属性值的时候,表现的像对象一样。但是如果你试图给其属性赋值,则会忽略这个操作:修改只是发生在临时对象身上,而这个临时对象并未继续保留下来。
[/size]
[size=medium]3.强制转换[/size]
[size=small]
在Javascript中我们写+x表示把x强制转换成数字,!!x表示把x强制转换成bool值。这两个强制转换要在平时写代码的时候灵活使用。
[/size]
[size=medium]4.函数作用于的问题[/size]
[size=small]
在一些类似C语言的编程语言中,一对花括号之间定义的变量只有在花括号内部是有效的,出了花括号之后,这些变量就是不可见的,这就是所谓块级作用域的意思。但是在Javascript中没有块级作用域的概念,但是有函数作用域的概念,就是说在一个函数内声明的变量在当前函数体以及当前函数体中的任意嵌套函数体内都是可见的。
下面我们来看看一段和函数作用域有关的代码段:
[/size]
[size=small]
上述代码的输出结果是:undefined local,对于第一个输出为什么不是global呢?我们看完代码之后感觉第一个输出应该是global才对呀,但是输出结果却是undefined,就是说暂时还没有定义值,其实为啥不输出global的原因是因为我们在函数作用域中定义了scope这个变量,假如没有定义输出就是global了。由于函数作用域的特性,局部变量在整个函数体内始终是有定义的,也就是说在函数体内,局部变量遮盖了全局变量。同时这也说明了一个问题,在Javascript中变量的使用可以先于定义。其实上述代码的等价代码是:
[/size]
[size=medium]5.作为属性的变量[/size]
[size=smalll]
当声明一个Javascript全局变量时,实际上是定义了全局对象的一个属性,当使用var声明一个变量时,创建的这个属性是不可配置的,也就是说这个变量无法通过delete运算符删除。
[/size]
[size=medium]6.关于对象的创建[/size]
[size=small]
我们知道在Javascript中可以使用new来创建一个对象,比如new Object();此时就创建了一个JS对象,我们可以认为Object()是一个构造函数,这个构造函数不带任何参数,如果是不带任何参数的构造函数,我们在创建对象的时候可以省略(),也就是说new Object()和new Object的效果是一样的。
如果一个构造函数确实返回了一个对象值,那么这个对象就作为整个对象创建表达式的值,而新创建的对象就废弃了。
[/size]
[size=medium]7.关于属性的访问[/size]
[size=small]
在JS中属性访问定义了下面两种方式
expression.identifier
expression[expression]
显然.identifier的写法更加简单,对于使用过C++/JAVA的程序员而言这是一种非常熟悉的方式,但是coder要注意的是,这种方式只适用于要访问的属性名称是合法的标识符,并且需要知道要访问的属性的名字。如果属性名称是一个保留字或者包含空格和标点符号,或者是一个数字(对于数组来说),则必须使用方括号的写法。当属性名是通过运算得出的值而不是固定值的时候,这时必须使用方括号写法。
[/size]
[size=small]
JavaScript中提供了很多字符串的操作,例如字符串的截断,字符串的链接等,所有这些操作都不会引起字符串本身的变化,操作的结果是返回一个新的字符串。substr和substring都是返回一个原来字符串的子串,二者的区别在于substring(m, n)表示的是[m,n)即左闭右开区间,而substr(m,n)表示的是[m,n]左闭右闭区间。
[/size]
[size=medium]2.给字符串设置一个属性[/size]
[size=small]
我们定义一个字符串,然后给字符串设置一个len属性,发现我们设置的属性是无效的,看看下面的代码段
[/size]
var s = "test";
s.len = 4;
var t = s.len;
[size=small]
上述程序中再次使用s.len的时候,发现t的值是undefined。第二行代码创建了一个临时字符串对象,并给其len属性赋值为4,随即销毁这个对象。第三行通过原始的字符串值创建一个新字符串对象,尝试读取其len属性,这个属性自然不存在,表达式求值结果为undefined。这段代码说明了在读取字符串,数字和布尔值的属性值的时候,表现的像对象一样。但是如果你试图给其属性赋值,则会忽略这个操作:修改只是发生在临时对象身上,而这个临时对象并未继续保留下来。
[/size]
[size=medium]3.强制转换[/size]
[size=small]
在Javascript中我们写+x表示把x强制转换成数字,!!x表示把x强制转换成bool值。这两个强制转换要在平时写代码的时候灵活使用。
[/size]
[size=medium]4.函数作用于的问题[/size]
[size=small]
在一些类似C语言的编程语言中,一对花括号之间定义的变量只有在花括号内部是有效的,出了花括号之后,这些变量就是不可见的,这就是所谓块级作用域的意思。但是在Javascript中没有块级作用域的概念,但是有函数作用域的概念,就是说在一个函数内声明的变量在当前函数体以及当前函数体中的任意嵌套函数体内都是可见的。
下面我们来看看一段和函数作用域有关的代码段:
[/size]
var scope = "global";
function f() {
console.log(scope);
var scope = "local";
console.log(scope);
}
[size=small]
上述代码的输出结果是:undefined local,对于第一个输出为什么不是global呢?我们看完代码之后感觉第一个输出应该是global才对呀,但是输出结果却是undefined,就是说暂时还没有定义值,其实为啥不输出global的原因是因为我们在函数作用域中定义了scope这个变量,假如没有定义输出就是global了。由于函数作用域的特性,局部变量在整个函数体内始终是有定义的,也就是说在函数体内,局部变量遮盖了全局变量。同时这也说明了一个问题,在Javascript中变量的使用可以先于定义。其实上述代码的等价代码是:
[/size]
var scope = "global";
function f() {
var scope;
console.log(scope);
scope = "local";
console.log(scope);
}
[size=medium]5.作为属性的变量[/size]
[size=smalll]
当声明一个Javascript全局变量时,实际上是定义了全局对象的一个属性,当使用var声明一个变量时,创建的这个属性是不可配置的,也就是说这个变量无法通过delete运算符删除。
[/size]
[size=medium]6.关于对象的创建[/size]
[size=small]
我们知道在Javascript中可以使用new来创建一个对象,比如new Object();此时就创建了一个JS对象,我们可以认为Object()是一个构造函数,这个构造函数不带任何参数,如果是不带任何参数的构造函数,我们在创建对象的时候可以省略(),也就是说new Object()和new Object的效果是一样的。
如果一个构造函数确实返回了一个对象值,那么这个对象就作为整个对象创建表达式的值,而新创建的对象就废弃了。
[/size]
[size=medium]7.关于属性的访问[/size]
[size=small]
在JS中属性访问定义了下面两种方式
expression.identifier
expression[expression]
显然.identifier的写法更加简单,对于使用过C++/JAVA的程序员而言这是一种非常熟悉的方式,但是coder要注意的是,这种方式只适用于要访问的属性名称是合法的标识符,并且需要知道要访问的属性的名字。如果属性名称是一个保留字或者包含空格和标点符号,或者是一个数字(对于数组来说),则必须使用方括号的写法。当属性名是通过运算得出的值而不是固定值的时候,这时必须使用方括号写法。
[/size]