《JavaScript权威指南》--学习日志
2016-02-21 23:33
671 查看
javascript中包含6种数据类型:undifined,null,string,number,boolean和object,其中,前者是原始数据类型,object是对象类型。object类型中包括Object,Function,String,Number,Boolean,Array,Regexp,Date,Global,Math,Error,以及宿主环境提供的 object类型。
把数字转换为字符串:
i.要把一个数字转换为字符串,只要给它添加一个空的字符串即可:
var n_as_string=n+"";
ii.要让数字更加显示转换为字符串,可以使用String()函数:
var string_value=String(number);
iii.把数字转换为字符串的另一个方法是使用toString()方法:
string_value=number.toString();
把字符串转换为数字:
i.当一个字符串用于数字环境中,它会自动转换为一个数字,利用这一优点,我们只要把一个字符串减去0就可以将其转换为一个数字:
var number=string_value-0.
注意:给一个字符串值增加一个0会导致字符串连接,而不是类型转换。
ii.把Number函数作为一个函数来调用:
var number=Number(string_value);
但这种把字符串转换为数字的方法的麻烦之处在于它过于严格。它只对以10为基数的数字有效,并且尽管它允许开头的和结尾的空白,但是,在紧随数字的字符串中,它不允许出现任何的空白。
iii.parseInt()和parseFloat()更灵活,可以从字符串开始处转换和返回任何的数字,忽略或舍去非数字部分。
parseInt("3 blind mice"); //return 3
parseInt("3.14 meters"); //return 3
parseFloat(3.14); //return 3.14
parseInt(oxFF); //如果一个字符串以0x或0X开头,将被解释为一个十六进制的数字。
parseInt()可以接受另一个参数来指定要解析的数字的基数 (2-36)
parseInt("11",2); //return 3 (1*2+1)
parseInt("ff",16); //return 255 (15*16+15)
parseInt("077",10); //return 77(7*10+7)
如果parseInt()和parseFloat()不能把指定的字符串转换为数字,它们就会返回NaN:
parseInt("eleven"); //return NaN
parseFloat("$72.47"); //return NaN
null和undefined
null表示“无对象”的值,如果一个变量的值为null,那么就说明它的值不是有效的对象、数组、数字、字符串和布尔值。
undefined,在使用了一个并未声明的变量时,或者使用了已经声明但是还没有赋值的变量时,又或者使用了一个并不存在的对象属性时,就返回这个值。
虽然undefined和null值不同,但是==运算符却将两者看作相等,如果必须区分null和undefined,可以使用===运算符或typeof运算符。
Array.join()可以把一个数组的所有元素都转换成字符串,然后再把它们连接起来。可以指定一个可选的字符串来分隔结果字符串中的元素。如果没有指定分隔字符串,就使用逗号分隔元素。
var a=[1,2,3];
var s=a.join(); //s=="1,2,3"
Array.reverse()方法将颠倒数组元素的顺序并返回颠倒后的数组。
var a=new Array(1,2,3);
a.reverse(); //a[0]=3...
Array.sort() 排序
Array.concat()方法能创建并返回一个数组
var a=[1,2];
a.concat([4,5],[6,[7,8]]); //return [1,2,4,5,6,[7,8]], concat()并不能递归地展开一个元素为数组的数组
Array.slice()返回指定数组的一个片段。 截取的方式有点类似substring()方法
Array.splice()方法是插入或删除数组元素的通用方法。
splice()的第一个参数指定了要插入或删除的元素在数组中的位置。第二个参数指定了要从数组中删除的元素个数。如果第二个参数被省略,那么将删除从开始元素到数组结尾处的所有元素。
var a=[1,2,3,4,5,6,7,8];
a.splice(3);//return [4,5,6,7,8], a is [1,2,3]
a.splice(0,2);//returm [1,2],a is[3]
a.splice(0,0,'a');//return [], a is [3,'a','b']
push()可以将一个或多个新元素附加到数组的尾部,然后返回数组的新长度;pop()将删除数组的最后一个元素,减少数组的长度,返回它删除的值。
这两个方法都是在原数组上修改数组,而非生成一个修改过的数组副本。
var stack=[];
stack.push(a,b); //stack:[a,b], return 2
stack.pop(); //stack:[a], return b
stack.push(1); //stack:[a,1],return 2
stack.pop(); //stack:[a], return 1
unshift()会将一个或多个元素添加到数组的头部,它返回的是数组的新长度;shift()会删除并返回数组的第一个元素
var a=[];
a.unshift(a); //a:[a], return 1
a.unshift(99); //a:[99,a] ,return 2
a.shift(); //a:[a], return 99
typeof的主要用途是从对象中区分出基本类型。typeof null 是“object”,typeof undefined是“undefined”,另外,任何数组的类型都是“object”,任何函数的类型都是“function”
一旦确定了一个值是对象而不是基本类型或者函数,就可以使用instanceof运算符来详细地了解它。
正则表达式的锚字符:
\b : 匹配一个词语的边界。
/\bJava\b/ : 匹配"Java"这个单词本身。
\B : 匹配非词语边界的位置
/\B[Ss]cript/ : "Javascript"和“postscript”都与之匹配,但是不与“script”和“Scripting”匹配。
(?!p) : 反向前声明,要求接下来的字符不与模式匹配
/Java(?!Script)([A-Z]\w*)/ : 匹配的是“Java”后跟随一个大写字母和任意多个ASCII单字字符,但是不能跟随“Script”,它与“JavaBeans”匹配,不与“Javanease”匹配,与“JavaScrip”匹配,但不与“JavaScript”或“JavaScripter”匹配。
正则表达式的标志
i : 执行不区分大小写的匹配
g : 执行一个全局匹配。
m : 多行模式
类String支持四中正则表达式的方法.
i. search(),该方法以正则表达式为参数,返回第一个与之匹配的子串的开始字符的位置,如果没有任何匹配的字符,则返回-1. search() 不支持全局检索,因为它忽略了正则表达式参数的标志g。
ii. replace()执行检索与替换操作。它的第一个参数是正则表达式,第二个参数是要替换的字符串。如果正则表达式中设置了标志g,该方法将用替换字符串替换被检索的字符串中所有与之模式匹配的子串,否则它只替换所发现的第一个与模式匹配的子串。 如果replace()的第一个参数是字符串,而不是正则表达式,该方法将直接检索那个字符串,而不是像search()那样用RegExp()构造函数将它转换成一个正则表达式。
iii.match()它唯一的参数就是一个正则表达式(或把它的参数传递给构造函数RegExp()以转换成正则表达式),返回的是包含了匹配结果的数组。如果正则表达式设置了标志g,该方法返回的数组包含的就是出现在字符串中的所有匹配。
iv. split()这个方法可以把调用它的字符串分解为一个子串数组,使用的分隔符是它的参数
构造函数RegExp()有一个或两个字符串参数,它将创建一个新的RegExp对象。无论是字符串直接量还是正则表达式都使用了字符\表示转义序列,所以当将正则表达式作为字符串直接量传递给RegExp()时,必须用\\替换所有的\字符。RegExp()的第二个参数是可选的,它应该是"g","i","m"或它们的组合。
用于模式匹配的RegExp()方法
i. exec()方法在一个字符串中检索匹配。如果没有找到任何匹配,它将返回null,若找到一个匹配,将返回一个数组。这个数组的元素0包含的是与正则表达式相匹配的字符串,余下的所有元素包含的是与括号的子表达式相匹配的子串。而且,属性index包含了匹配发生的字符的位置,属性input引用的是被检索的字符串。当一个具有g标志的正则表达式调用exec()时,它将把该对象的lastIndex属性设置到紧接着匹配子串的字符串位置。
ii. test()的参数是一个字符串,如果这个字符串包含正则表达式的一个匹配,它就返回true:
Web浏览器中的JavaScript
Window对象代表的是一个Web浏览器窗口(或者窗口中的一个帧,在客户端JavaScript中,顶层窗口和帧本质上是一样的)。应用程序中出现的每个窗口都对应一个Window对象,而且都为客户端JavaScript定义了一个唯一的执行环境。换句话说,JavaScript代码在一个窗口中声明的全局变量并不是另一个窗口的全局变量。
在XHTML中,<script>标记中的内容被当做其它内容一样对待。如果JavaScript代码包含了<或&字符,这些字符就被解释成XML标记。因此如果要使用XHTML,最后把所有的JavaScript代码放到一个CDATA部分:
CDATA:指的是不由 XML 解析器进行解析的文本数据。在标记CDATA下,所有的标记、实体引用都被忽略,而被XML处理程序一视同仁地当做字符数据看待,CDATA的形式如下:
<![CDATA[文本内容]]>
CDATA的文本内容中不能出现字符串“]]>”,另外,CDATA不能嵌套。
defer: 在看defer属性的时候碰到一些问题,最后也解决了:http://www.oschina.net/question/1442518_2152697
所以记住:defer是用在对外部文件的延迟上的!
下面这种写法就可以实现了:
1.js
1.html:
JavaScript不能做什么
JavaScript针对恶意代码的两条防线:
i.第一道防线是这种语言不支持某些功能。 (例如客户端JavaScript不提供任何方式来读取、写入和删除客户端计算机上的文件或目录。没有File对象,也没有文件访问函数,一个JavaScript程序就无法删除用户的数据或者在用户的系统中植入病毒)
ii.第二道防线是JavaScript在自己所支持的某些功能上强加限制。 (例如,客户端的JavaScript可以脚本化HTTP协议来和Web服务器交换数据,并且它甚至可以从FTP或其他的服务器来下载数据。但是,JavaScript不提供通用的网络原语,并且无法为任何主机打开一个socket或者接受一个来自其它主机的连接)
把数字转换为字符串:
i.要把一个数字转换为字符串,只要给它添加一个空的字符串即可:
var n_as_string=n+"";
ii.要让数字更加显示转换为字符串,可以使用String()函数:
var string_value=String(number);
iii.把数字转换为字符串的另一个方法是使用toString()方法:
string_value=number.toString();
把字符串转换为数字:
i.当一个字符串用于数字环境中,它会自动转换为一个数字,利用这一优点,我们只要把一个字符串减去0就可以将其转换为一个数字:
var number=string_value-0.
注意:给一个字符串值增加一个0会导致字符串连接,而不是类型转换。
ii.把Number函数作为一个函数来调用:
var number=Number(string_value);
但这种把字符串转换为数字的方法的麻烦之处在于它过于严格。它只对以10为基数的数字有效,并且尽管它允许开头的和结尾的空白,但是,在紧随数字的字符串中,它不允许出现任何的空白。
iii.parseInt()和parseFloat()更灵活,可以从字符串开始处转换和返回任何的数字,忽略或舍去非数字部分。
parseInt("3 blind mice"); //return 3
parseInt("3.14 meters"); //return 3
parseFloat(3.14); //return 3.14
parseInt(oxFF); //如果一个字符串以0x或0X开头,将被解释为一个十六进制的数字。
parseInt()可以接受另一个参数来指定要解析的数字的基数 (2-36)
parseInt("11",2); //return 3 (1*2+1)
parseInt("ff",16); //return 255 (15*16+15)
parseInt("077",10); //return 77(7*10+7)
如果parseInt()和parseFloat()不能把指定的字符串转换为数字,它们就会返回NaN:
parseInt("eleven"); //return NaN
parseFloat("$72.47"); //return NaN
null和undefined
null表示“无对象”的值,如果一个变量的值为null,那么就说明它的值不是有效的对象、数组、数字、字符串和布尔值。
undefined,在使用了一个并未声明的变量时,或者使用了已经声明但是还没有赋值的变量时,又或者使用了一个并不存在的对象属性时,就返回这个值。
虽然undefined和null值不同,但是==运算符却将两者看作相等,如果必须区分null和undefined,可以使用===运算符或typeof运算符。
Array.join()可以把一个数组的所有元素都转换成字符串,然后再把它们连接起来。可以指定一个可选的字符串来分隔结果字符串中的元素。如果没有指定分隔字符串,就使用逗号分隔元素。
var a=[1,2,3];
var s=a.join(); //s=="1,2,3"
Array.reverse()方法将颠倒数组元素的顺序并返回颠倒后的数组。
var a=new Array(1,2,3);
a.reverse(); //a[0]=3...
Array.sort() 排序
Array.concat()方法能创建并返回一个数组
var a=[1,2];
a.concat([4,5],[6,[7,8]]); //return [1,2,4,5,6,[7,8]], concat()并不能递归地展开一个元素为数组的数组
Array.slice()返回指定数组的一个片段。 截取的方式有点类似substring()方法
Array.splice()方法是插入或删除数组元素的通用方法。
splice()的第一个参数指定了要插入或删除的元素在数组中的位置。第二个参数指定了要从数组中删除的元素个数。如果第二个参数被省略,那么将删除从开始元素到数组结尾处的所有元素。
var a=[1,2,3,4,5,6,7,8];
a.splice(3);//return [4,5,6,7,8], a is [1,2,3]
a.splice(0,2);//returm [1,2],a is[3]
a.splice(0,0,'a');//return [], a is [3,'a','b']
push()可以将一个或多个新元素附加到数组的尾部,然后返回数组的新长度;pop()将删除数组的最后一个元素,减少数组的长度,返回它删除的值。
这两个方法都是在原数组上修改数组,而非生成一个修改过的数组副本。
var stack=[];
stack.push(a,b); //stack:[a,b], return 2
stack.pop(); //stack:[a], return b
stack.push(1); //stack:[a,1],return 2
stack.pop(); //stack:[a], return 1
unshift()会将一个或多个元素添加到数组的头部,它返回的是数组的新长度;shift()会删除并返回数组的第一个元素
var a=[];
a.unshift(a); //a:[a], return 1
a.unshift(99); //a:[99,a] ,return 2
a.shift(); //a:[a], return 99
typeof的主要用途是从对象中区分出基本类型。typeof null 是“object”,typeof undefined是“undefined”,另外,任何数组的类型都是“object”,任何函数的类型都是“function”
一旦确定了一个值是对象而不是基本类型或者函数,就可以使用instanceof运算符来详细地了解它。
正则表达式的锚字符:
\b : 匹配一个词语的边界。
/\bJava\b/ : 匹配"Java"这个单词本身。
\B : 匹配非词语边界的位置
/\B[Ss]cript/ : "Javascript"和“postscript”都与之匹配,但是不与“script”和“Scripting”匹配。
(?!p) : 反向前声明,要求接下来的字符不与模式匹配
/Java(?!Script)([A-Z]\w*)/ : 匹配的是“Java”后跟随一个大写字母和任意多个ASCII单字字符,但是不能跟随“Script”,它与“JavaBeans”匹配,不与“Javanease”匹配,与“JavaScrip”匹配,但不与“JavaScript”或“JavaScripter”匹配。
正则表达式的标志
i : 执行不区分大小写的匹配
g : 执行一个全局匹配。
m : 多行模式
类String支持四中正则表达式的方法.
i. search(),该方法以正则表达式为参数,返回第一个与之匹配的子串的开始字符的位置,如果没有任何匹配的字符,则返回-1. search() 不支持全局检索,因为它忽略了正则表达式参数的标志g。
ii. replace()执行检索与替换操作。它的第一个参数是正则表达式,第二个参数是要替换的字符串。如果正则表达式中设置了标志g,该方法将用替换字符串替换被检索的字符串中所有与之模式匹配的子串,否则它只替换所发现的第一个与模式匹配的子串。 如果replace()的第一个参数是字符串,而不是正则表达式,该方法将直接检索那个字符串,而不是像search()那样用RegExp()构造函数将它转换成一个正则表达式。
iii.match()它唯一的参数就是一个正则表达式(或把它的参数传递给构造函数RegExp()以转换成正则表达式),返回的是包含了匹配结果的数组。如果正则表达式设置了标志g,该方法返回的数组包含的就是出现在字符串中的所有匹配。
"1 plus 2 equals 3".match(/\d+/g); //返回["1","2","3"]
iv. split()这个方法可以把调用它的字符串分解为一个子串数组,使用的分隔符是它的参数
"123,456,789".split(","); //returns ["123","456","789"]
构造函数RegExp()有一个或两个字符串参数,它将创建一个新的RegExp对象。无论是字符串直接量还是正则表达式都使用了字符\表示转义序列,所以当将正则表达式作为字符串直接量传递给RegExp()时,必须用\\替换所有的\字符。RegExp()的第二个参数是可选的,它应该是"g","i","m"或它们的组合。
var zipcode=new RegExp("\\d{5}","g"); //匹配字符串的所有五位数字
用于模式匹配的RegExp()方法
i. exec()方法在一个字符串中检索匹配。如果没有找到任何匹配,它将返回null,若找到一个匹配,将返回一个数组。这个数组的元素0包含的是与正则表达式相匹配的字符串,余下的所有元素包含的是与括号的子表达式相匹配的子串。而且,属性index包含了匹配发生的字符的位置,属性input引用的是被检索的字符串。当一个具有g标志的正则表达式调用exec()时,它将把该对象的lastIndex属性设置到紧接着匹配子串的字符串位置。
var pattern=/Java/g; var test="JavaScript is more fun than Java!"; var result; while((result=pattern.exec(test))!=null){ alert("Matched'"+result[0]+"'"+" at position "+result.index+"; next search begins at "+pattern.lastIndex); }
ii. test()的参数是一个字符串,如果这个字符串包含正则表达式的一个匹配,它就返回true:
var pattern=/java/i; pattern.test("JavaScript"); //returns true;
Web浏览器中的JavaScript
Window对象代表的是一个Web浏览器窗口(或者窗口中的一个帧,在客户端JavaScript中,顶层窗口和帧本质上是一样的)。应用程序中出现的每个窗口都对应一个Window对象,而且都为客户端JavaScript定义了一个唯一的执行环境。换句话说,JavaScript代码在一个窗口中声明的全局变量并不是另一个窗口的全局变量。
在XHTML中,<script>标记中的内容被当做其它内容一样对待。如果JavaScript代码包含了<或&字符,这些字符就被解释成XML标记。因此如果要使用XHTML,最后把所有的JavaScript代码放到一个CDATA部分:
<script><![CDATA[Your JavaScript code goes here]]></script>
CDATA:指的是不由 XML 解析器进行解析的文本数据。在标记CDATA下,所有的标记、实体引用都被忽略,而被XML处理程序一视同仁地当做字符数据看待,CDATA的形式如下:
<![CDATA[文本内容]]>
CDATA的文本内容中不能出现字符串“]]>”,另外,CDATA不能嵌套。
defer: 在看defer属性的时候碰到一些问题,最后也解决了:http://www.oschina.net/question/1442518_2152697
所以记住:defer是用在对外部文件的延迟上的!
下面这种写法就可以实现了:
1.js
callA(); function callA(){ document.getElementById("check").innerHTML="abcd"; }
1.html:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Test the function of "defer"</title> </head> <body> <script src="js/1.js" defer></script> <p id="check">123</p> </body> </html>
JavaScript不能做什么
JavaScript针对恶意代码的两条防线:
i.第一道防线是这种语言不支持某些功能。 (例如客户端JavaScript不提供任何方式来读取、写入和删除客户端计算机上的文件或目录。没有File对象,也没有文件访问函数,一个JavaScript程序就无法删除用户的数据或者在用户的系统中植入病毒)
ii.第二道防线是JavaScript在自己所支持的某些功能上强加限制。 (例如,客户端的JavaScript可以脚本化HTTP协议来和Web服务器交换数据,并且它甚至可以从FTP或其他的服务器来下载数据。但是,JavaScript不提供通用的网络原语,并且无法为任何主机打开一个socket或者接受一个来自其它主机的连接)
相关文章推荐
- JavaScript 中的 .prototype
- javascript之一切皆为对象3
- Javascript数据类型
- js中的执行上下文,菜鸟入门基础。
- Js实现深拷贝和浅拷贝
- Extjs 4.2 关闭浏览器不弹出提示窗口
- js实现的随机颜色实例代码
- javascript 变量,作用域,内存管理小结
- 初识JavaScript 变量, 操作符, 数组
- JS中的比较
- html5+javascript 简单的倒计时功能
- JSP response对象
- js之事件冒泡和事件捕获详细介绍
- 45个JavaScript小技巧
- 2016/2/21 JavaScript简介
- JS大总结
- js中event.keyCode用法及keyCode对照表
- 只有20行Javascript代码!手把手教你写一个页面模板引擎
- JS自动加载--自用 更新中
- JavaScript String Byte Length of UTF-8