- 全局变量
Javascript中最糟糕的特性就是它对全局变量的依赖性。因为一个全局变量可以被程序的任何部分.在任意时间改变,它们会使得程序的行为被极大地复杂化。在程序中使用全局变量降低了程序的可靠性。
三种方式可以定义全局变量:
a.脱离任何函数直接安排一个var语句. var foo = value;
b.直接添加一个属性到全局对象上. window.foo = value;
c.直接使用未经声明的变量。这被称为隐式的全局变量: foo = value;
- 作用域
Javascript 的语法来源自C. 在所有其他类似C语言风格的语言里,一个代码块(括在一对花括号中的一组语句)会创造一个作用域。代码块中声明的变量在其外部是不可见的。而在Javascript中,代码块中声明的变量在包含此代码块的函数的任何位置都是可见的。(注意,函数拥有作用域) 在Javascript中,声明变量的方式应该是在每个函数的开头部分声明所有变量。
function blockArea(){
if(true){
var field = "in block!";
}
window.alert(field); // field 依然可见
}
blockArea();
- 自动补全分号
Javascript有一个机制,它试图通过自动插入分号来修正程序。但千万不能依靠它,他可能会掩盖更为严重的错误。请考虑在return 语句中自动插入分号导致的后果。如果一个return 语句返回一个值,这个值表达式的开始部分必须和return 在同一行上(!):
function autoComplete(){
return // --> return ; --> undefined
{
status : true
};
}
window.alert(autoComplete());
// 自动插入分号导致程序被误解却没有任何警告信息。可以通过把 '{' 放在上一行的尾部来解决这个问题.
function fixedComplete(){
return {
status : true
};
}
window.alert(fixedComplete());
- 保留字
Javascript保留了Java中大部分关键词,其中对于 class,byte,interface 等强类型语言所用的关键词而言,Javascript是无法使用上的。这些无用的保留关键词使得无法使用它们作为变量名,以及进行对象的属性导航(.)。同时,像 undefined, NaN, infinity 等使用到的关键词却不是保留字.
- typeof
typeof 运算符返回一个用于识别其操作数类型的字符串。例如 typeof 98.6 将返回'number'. 然而不幸的是,尝试 typeof null 将返回 'object' 而不是 'null'. 所以 typeof 将不能识别null, 当对null进行判断时,可以直接判断 value === null 或者 if(value && typeof value === 'object').
另一个缺点是 typeof 对 正则表达式对象的识别在各个浏览器中式不一致的。有的返回 'object', 而另外的则返回 'function'.
- parseInt
parseInt 是一个将字符串转换为整数的函数. 但它却在遇到非数字时只是停止解析.所以 parseInt('16')与 parseInt('16 tons') 将产生相同的效果。它们均返回16而不会产生异常。如果parseInt 的第一个字符时0, 那么该字符串将是基于八进制来求值的。而八进制中 8与9 不是数字,所以parseInt('08) 和 parseInt('09) 均返回0. 这个错误导致了程序解析日期和时间时会出错。幸运的是,parseInt 还接受一个基础来作为参数,这样,parseInt('08',10) 的结果将是10, 所以应该总是提供这个参数.
- + 运算符
+ 运算符可以用于加法运算或字符串连接。它究竟会执行那种操作时取决于其操作数的类型。在强类型语言中,这可能不是一个问题。但在Javascript中,如果你想要进行的是加法运算,请保证两个运算符都是整数.这通常是BUG的常见来源。
- 浮点数
二进制的浮点数不能正确地处理十进制的小树,因此在Javascript 中, 0.1 + 0.2 并不等于 0.3. 如果想要在Javascript中进行精度运算,可以将小数转换为整数后进行操作。之后再缩小为浮点数。
document.writeln(0.1+0.2); // 0.30000000000000004
document.writeln((0.1+0.2) === 0.3); // false
document.writeln( (0.1 * 10 + 0.2 * 10) / 10 === 0.3); // true
- NaN
NaN 是 IEEE 754中定义的一个特殊数量值。它表示值不是一个数字。然而下面的运算符将会返回true. typeof NaN === 'number', 该值可能会在试图将非数字形式的字符串转换为数字时产生(parseInt)。NaN 并不等同于它自己。 所以判断 NaN === NaN 将会返回false, 而 NaN !== NaN 将返回true. Javascript 提供了一个isNaN 函数可以辨别数字与NaN, 但判断一个值是否可用作数字的最佳方法是使用isFinite函数, 因为它会筛除掉NaN 和 Infinity:
function isNumber(value){
return typeof value === 'number' && isFinite(value);
}
- 伪数组
在Javascript中,并不存在真正的数组. 虽然这也不完全是坏事,带方法的数组确实很容易使用,并且不会产生数组越界错误. 但它们的性能与真正的数组比起来差别是很大的。而且 typeof 运算符不能识别数组和对象,要判断一个值是否为数组,还得必须检查它的 constructor 属性. 此外,在对不同帧或窗口创建的数组进行检测时,应该做更多的判断.
function isArray(value){
return typeof value === 'object' && value.constructor === Array;
}
function isArray_enhanced(value){
return value && typeof value === 'object' &&
// 数组或伪数组(arguments)对象均包含length属性
typeof value.length === 'number' &&
// 对于 arguments对象,去掉下列判断将返回true.
typeof value.splice === 'function' &&
// 判断属性是否为可枚举的(for in 循环可用),对于所有数组,将得到false.
!(value.propertyIsEnumerable('length'));
}
最后,函数中的arguments 对象并不是一个真正的数组,它只是一个带有length成员元素的对象.
- false 的取值
在进行布尔判断是,Javascript 会将一系列值看做false:
// Number --> 0 或 NaN
// String --> ''(空串)
// Boolean --> false
// Object --> null
// Undefined --> undefined
这些值都等同于逻辑假值,但它们却是不可互换的。
- hasOwnProperty
hasOwnProperty 方法可以确认对象中的属性是否为原生属性(不继承自原型链). 然而由于它是一个方法而不是运算符. 所以在任何对象中,他可能会被一个不同的函数甚至一个非函数的值所替换。
相关推荐
《JavaScript的精华部分笔记》是基于道格拉斯·克罗克福德(Douglas Crockford)的著作《JavaScript: The Good Parts》的一份详细注解。这份开源资源深入解析了JavaScript语言中最为核心、最有价值的部分,帮助...
"LearningJS: 通过 Crockford 和其他来源的 Good Parts 书学习 JS" 提到的学习资源,很可能是指 Douglas Crockford 的《JavaScript: The Good Parts》一书和其他相关材料。这本书是 JS 开发者的经典之作,Crockford ...
《JavaScript The Good Parts》是Douglas Crockford所著的一本深入探讨JavaScript语言核心特性的书籍。在学习JavaScript的过程中,理解假值(falsy values)以及全等运算符(===)是非常重要的。假值是指在...
关于道格拉斯·克罗克福德的《 JavaScript的精髓》 :rocket: 这些都是书上的笔记Javascript the Good Parts ,其于2008年出版,ES6之前。 在撰写本文时,该书尚未发布任何修订版,有关此方面的持续讨论,请参见 。 ...
在JavaScript编程中,作用域和闭包是两个非常重要的概念,它们对于理解代码的执行流程以及如何有效地管理变量至关重要。本文将深入探讨这两个主题,并举例说明如何使用它们来避免全局空间污染。 首先,我们来看看...
在探讨JavaScript编程语言时,作用域、闭包和避免全局变量污染是几个非常重要的概念。作用域决定了代码块中变量和其他资源的可见性和生命周期,闭包是JavaScript中一个强大的特性,它允许函数访问并操作函数外部的...
附件中的《OReilly.JavaScript.The.Good.Parts.May.2008.pdf》可能是这本书的电子版,详细解释了JavaScript语言的各个方面,对于理解webOS的JavaScript开发非常有帮助。而“Kristen Stewart.jpg”可能是无关文件,与...
前端面试笔记 可能在前端职位面试中出现的有用笔记和算法的集合。 仅供学术使用。 Challenges.js 包含一些在 JS 中...crockford.js 包含来自“Javascript the Good Parts”的注释 dom.js 包含有用的 DOM 方法和属性