学习了几天《JavaScript设计模式》后,发现虽然这个人写的书还是不错的,但貌似其中的代码普遍带有bug,导致无法运行,而我也不会调试,说明我JavaScript的基础还是不够好,在图书馆里找到了这本书,今天我就开始学习这本书,对JavaScript这门灵活的语言有一个更加深入的理解!Let`s Start!
第一章 基础JavaScript
导读:在刚开始学习JavaScript的时候,用它来进行编程感受。这是作者定义的一个JavaScript子集,是我们在学习的时候更有效率。
1.首先注意等号的用法:
一个等号(=)用于变量赋值
三个等号(===)用于比较两个值
2.语句和表达式
● 语句“做事情”。例如这个语句,它用来声明(或创建)一个变量foo: var foo;
● 表达式产生值。它们通常是函数的参数,或是赋值的右半部分。例如: 3 * 7;
3.保留字
以下标识符作为保留字,不能作为变量名使用:
arguments | break | case | catch |
class | const | continue | debugger |
default | delete | do | else |
enum | export | extends | false |
finally | for | function | if |
implenments | import | in | instanceof |
interface | let | new | null |
package | private | protected | public |
return | static | super | switch |
this | throw | true | try |
typeof | var | void | while |
还有3个标识符不是保留字,但是需要视为保留字: Infinity、NaN、undefined。
4.值
在JavaScript中,所有的值都有属性。每一个属性都有一个key(或name)和一个value。可以认为属性就像是一条记录的字段。
例如字符串‘abc’有length这个属性:
‘abc’.length // 3
5.原始值和对象
JavaScript中,对值得区分有点自由:
● 原始值(primitive)包括布尔值、数字、字符串、null和undefined。
● 其他的值都是对象(Object)。
这两者最主要的区别在于它们的比较方式;每个对象都有唯一的标识且只(严格地)等于自己:
var obj1 = {}; // 一个空对象 var obj2 = {}; // 另一个空对象 console.log (obj1 === obj2); // false
我:这其中包含了更加底层的原理,比如堆内存和栈内存的区别,和Object.prototype和__proto__的指向问题等,以后再来做解释,先留个坑。
相反,所有的原始值,只要编码值相同,则被视为相等:
var a = 'abc'; // 一个字符串 var b = 'a' + 'b' + 'c'; // 另一个字符串 console.log ( a === b ); // true
var a = 123; // 一个数字 var b = 123; // 另一个数字 console.log ( a === b ); // true
而原始值具有以下特点:
(1) 按值进行比较。如上面的例子。
(2) 不可改变。也就是说:原始值一旦创建,其属性不能被改变、添加或移除。
var a = 'abc'; delete a.length; // 无效 a.length = 1; console.log (a.length); // 3 a.foo = 2; console.log (a.foo); // undefined
对象具有以下特点:
(1) 按引用进行比较。每个值都有各自的身份标识。
console.log( {} === {} ); // false var obj1 = {}; var obj2 = obj1; console.log( obj1 === obj2 ); // true
(2) 默认可变。对象属性可以很自由的被改变、添加和移除。
var a = {}; a.x = 1; // 添加 console.log ( a.x ); // 1 a.x = 2; // 改变 console.log ( a.x ); // 2 delete a.x; // 删除 console.log ( a.x ); // undefined
6. undefined和unll
● undefined的意思是“没有值”。
① 未被初始化的变量即为undefined:
var foo; console.log ( foo ); // undefined
② 丢失的参数也是undefined:
function f ( x ) { return x; } console.log ( f() ); // undefined
③ 访问不存在的属性,也会得到undefined:
var a = {}; console.log ( a.x ); // undefined
● null的意思是“没有对象”或“空指针”。
注意:undefined和null没有属性,甚至连toString()这种标准方法都没有!
7. 使用typeof和instanceof对值分类
(1) typeof
用法: typeof value
它的返回值会是一个表示这个值“类型”的字符串。typeof的所有结果如下:
操作数 | 结果 |
undefined | undefined |
null | object |
布尔值 | boolean |
数字 | number |
字符串 | string |
函数 | function |
所有其他的常规值 | object |
(2) instanceof
用法: value instanceof Constructor
如果value是一个通过Constructor构造器创建的对象,则返回true:
console.log( [] instanceof Array ); // true console.log( {} instanceof Object ); // true console.log( [] instanceof Object ); // true
我:由此我们可以看出,使用typeof时,如果遇到数组,那么typeof的结果为object,那么我们就不知道它是否是一个数组。因此我们可以用instanceof来判断该对象是否为数组。
另,下面的例子看出typeof null === object只是JavaScript设计上的一个bug(属于历史遗留问题), 它不属于对象。
console.log( null instanceof Object ); // false
8. 布尔值
(1) 注意:以下的值会被解释成false:
● undefined、null
● 布尔值:false
● 数字: -0、NaN
● 空字符串: ‘’
除此之外的所有值都会解释成true。
(2) 二元逻辑运算符(&&和||)
JavaScript中的二元逻辑运算符是短路的。因为如果第一个运算数就足以确定结果,则不会对第二个运算数进行评估。
与(&&)—— 如果第一个运算数为假,返回它。否则,返回第二个运算数。
或(||)—— 如果第一个运算数为真,返回它。否则,返回第二个运算数。
9. 数字
JavaScript中所有的数字都是浮点数:
console.log( 1 === 1.00 ); // true
这里要提及一个Infinity,多数情况下是一个错误的值:
console.log( 3 / 0 ); // Infinity
注:Infinity比任何一个数都要大(NaN除外)。同样的,-Infinity比任何数都要小(NaN除外)。这使得这两个数字常用来作为默认值(比如当你需要一个最小值和一个最大值的时候)。
我:例:
function max() { var max = Number.NEGATIVE_INFINITY; for ( var i = 0; i < arguments.length; i++ ) { if ( arguments[i] > max ) { max = arguments[i]; } } return max; } var large = max( 610,1330,200,500,654 ); console.log( large );
10. 运算符
其他的比较简单,不在这里赘述。注意的是一个技巧:转变为数字: +值。
11. 函数
函数可以用函数声明的方式创建:
function add( param1 , param2 ) { return param1 + param2; }
也可以使用函数表达式的方式创建:
var add = function ( param1 , param2 ) { return param1 + param2; };
其中函数声明具有提升特性——它们的实体会移动到所在作用域的开始处。
我:详情参考《你不知道的JavaScript(上卷)》
12. 特殊的变量arguments
在JavaScript中,函数的所有参数都可以被自由调用,它会通过arguments变量来使所有参数可用。它看起来像是一个数组,但它却不具备数组的方法,它只是一个类数组的变量。
它有length属性和可以用[]访问它的元素。但除此之外,它不具备其他的数组的方法。
13. 变量作用域和闭包
我:详情参考《你不知道的JavaScript(上卷)》
剩下的内容就是简单的介绍了,不一一写上来了。详情我后面会每一节每一节的详细叙述。