JavaScript高级程序设计第5章读书笔记(18)

localeCompare()方法

localeCompare()方法,可以比较两个字符串,并返回下列值中的一个:

  • 如果字符串在字母表中应该排在字符串参数之前,则返回一个负数(多数情况下是-1)
  • 如果字符串等于字符串参数,则返回0
  • 如果字符串在字母表中应该排在字符串参数之后,则返回一个正数(多数情况下是1)

因为localeCompare()返回的数值取决于具体的实现,所以,最好像如下例子去使用。也就是说,localeCompare()方法返回负数的时候,不一定是-1;返回正数的时候,也不一定是1。

localeCompare()方法比较特殊的地方在于,实现所支持的地区(国家和语言)决定了这个方法的行为。比如,美国以英语作为ECMAScript实现的标准语言,因此localeCompare()就是区分大小写的,于是大写字母在字母表中排在小写字母前面就成为了一项决定性的比较规则。不过,在其他地区就不一定如此。

fromCharCode()方法

String构造函数本身有一个静态方法: fromCharCode()。这个方法的任务是接收一或多个字符编码,然后将它们转换成一个字符串。从本质上看,它与实例方法charCodeAt()执行的是相反的操作。比如:

HTML方法

早起的Web浏览器提供商觉察到了使用JavaScript动态格式化HTML的需求。于是,他们扩展了标准,实现了一些专门用于简化常见HTML格式化任务的方法。但是,尽量不要去使用这些方法,因为它们创建的标记通常无法表达语义。

方法 输出结果
anchor(name) string
big() string
bold() string
fixed() string
fontcolor() string
fontsize(size) string
italics() string
link(url) string
small() string
strike() string
sub() string
sup() string

单体内置对象

ECMA-262对内置对象的定义: “由ECMAScript实现提供的、不依赖于宿主环境的对象,这些对象在ECMAScript程序执行之前就已经存在了。”意思就是说,开发人员不必显示地实例化内置对象,因为它们已经实例化了。比如:Object、Array、String,都是内置对象。另外,ECMA-262还定义了两个单体内置对象: GlobalMath

Global对象

Global(全局)对象可以说是ECMAScript中最特别的一个对象了,因为不管从什么角度上看,这个对象都是不存在的。不属于任何其他对象的属性和方法,最终都是它的属性和方法。事实上,没有全局变量或者全局函数;所有在全局作用域中定义的属性和函数,都是Global对象的属性。比如,isNan()、isFinite()、parseInt()以及parseFloat()这些方法,实际上都是Global对象的方法。

URI编码方法

Global对象的encodeURI()encodeURIComponent()方法可以对URI(Uniform Resource Identifiers,通用资源标识符)进行编码,以便发送给浏览器。有效的URI中不能包含某些字符,比如,空格。而这两个URI编码方法就可以对URI进行编码,它们用特殊的UTF-8编码替换所有无效的字符,从而让浏览器能够接受和理解。

其中,encodeURI()主要用于整个URI(比如, http://www.4455q.com/test js.htm),而encodeURIComponent()主要用于对URI中的某一段(例如前面URI中的test js.htm)进行编码。它们的主要区别在于,encodeURI()不会对本身属于URI的特殊字符进行编码,例如:冒号、正斜杠、问号、井字号;而encodeURIComponent()则会对它发现的任何非标准字符进行编码。

与encodeURI()和encodeURIComponent()方法对应的两个方法分别是decodeURI()decodeURIComponent()。其中,decodeURI()只能对使用encodeURI()替换的字符进行解码。比如,它可以将%20替换成一个空格,但是,不会将%23替换为#,因为#不是使用encodeURI()替换的。同样的,decodeURIComponent()能够解码使用encodeURIComponent()编码的所有字符串,即它可以解码任何特殊字符的编码。

URI方法encodeURI()、encodeURIComponent()、decodeURI()和decodeURIComponent()用于替代已经被ECMA-262第3版废弃的escape()和unescape()方法。URI方法能够编码所有Unicode字符,而原来的方法只能正确地编码ASCII字符。因此,不要再使用escape()和unescape()方法。

eval()方法

eval()方法就像是一个完整的ECMAScript解析器,它只接收一个参数,即要执行的ECMAScript(或JavaScript)字符串。比如:

当解析器发现代码中调用eval()方法时,它会将传入的参数作为实际的ECMAScript语句来解析,然后把执行结果插入到原位置。通过eval()执行的代码被认为是包含该次调用的执行环境的一部分,因此被执行的代码具有与该执行环境相同的作用域链。这意味着通过eval()执行的代码可以引用在包含环境中定义的变量,比如:

在eval()中创建的任何变量或函数都不会被提升,因为在解析代码的时候,它们被包含在一个字符串中,它们只能在eval()被执行的时候被创建。

严格模式下,在外部访问不到eval()中创建的任何变量或函数,因此,前面的例子会出错。同样,严格模式下,为eval赋值也会导致错误。

eval()虽然强大,但也非常危险。使用的时候,要非常谨慎,特别是用它来执行用户输入数据的情况下。否则,可能会有恶意用户输入威胁网站安全,即所谓的代码注入