廖雪峰的JS教程学习
在Web世界里,只有JavaScript能跨平台、跨浏览器驱动网页,与用户交互,新兴的Node.js把JavaScript引入到了服务器端,JavaScript已经变成了全能型选手。前端后端都可以。
在上个世纪的1995年,当时的网景公司正凭借其Navigator浏览器成为Web时代开启时最著名的第一代互联网公司。由于网景公司希望能在静态HTML页面上添加一些动态效果,于是叫Brendan Eich这哥们在两周之内设计出了JavaScript语言。
因为网景开发了JavaScript,一年后微软又模仿JavaScript开发了JScript,为了让JavaScript成为全球标准,几个公司联合ECMA(European Computer Manufacturers Association)组织定制了JavaScript语言的标准,被称为ECMAScript标准。所以简单说来就是,ECMAScript是一种语言标准,而JavaScript是网景公司对ECMAScript标准的一种实现。那为什么不直接把JavaScript定为标准呢?因为JavaScript是网景的注册商标。不过大多数时候,我们还是用JavaScript这个词。如果你遇到ECMAScript这个词,简单把它替换为JavaScript就行了。
由于JavaScript的标准——ECMAScript在不断发展,最新版ECMAScript 6标准(简称ES6)已经在2015年6月正式发布了,所以,讲到JavaScript的版本,实际上就是说它实现了ECMAScript标准的哪个版本。由于浏览器在发布时就确定了JavaScript的版本,加上很多用户还在使用IE6这种古老的浏览器,这就导致你在写JavaScript的时候,要照顾一下老用户,不能一上来就用最新的ES6标准写,否则,老用户的浏览器是无法运行新版本的JavaScript代码的。
0.调试代码
浏览器:
# Console:
var a = 6*6;
console.log(a);
# Sources:断点、单步执行等高级技巧
1.数据类型
- 原始类型primitive type:Number String Boolean
- 对象类型object type
数字、字符串、布尔、null/undefines属于不可变类型immutable,
对象和数组属于可变类型。
1.1原始类型
## Number
NaN; // NaN表示Not a Number,当无法计算结果时用NaN表示
Infinity; // Infinity表示无限大,当数值超过了JavaScript的Number所能表示的最大值时,就表示为Infinity
2 / 0; // Infinity
0 / 0; // NaN
## String
以单引号'或双引号"括起来的任意文本
## Boolean
JavaScript在设计时,有两种比较运算符:
第一种是==比较,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果;
第二种是===比较,它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,再比较。
1 == '1'
true
1 === '1'
false
## 两个特殊的原始值:null和undefined
null表示一个“空”的值,它和0以及空字符串''不同,0是一个数值,''表示长度为0的字符串,而null表示“空”。
在其他语言中,也有类似JavaScript的null的表示,例如Java也用null,Swift用nil,Python用None表示。但是,在JavaScript中,还有一个和null类似的undefined,它表示“未定义”。
JavaScript的设计者希望用null表示一个空的值,而undefined表示值未定义。事实证明,这并没有什么卵用,区分两者的意义不大。大多数情况下,我们都应该用null。undefined仅仅在判断函数参数是否传递的情况下有用。
判断null请使用myVar === null;
1.2 对象类型
1.2.0 对象
普通的JavaScript的对象是一组由键-值组成的无序集合。
var person = {
name: 'Bob',
age: 20,
tags: ['js', 'web', 'mobile'],
city: 'Beijing',
hasCar: true,
zipcode: null
};
console.log(person)
Object {name: "Bob", age: 20, tags: Array(3), city: "Beijing", hasCar: true,zipcode:null}
JavaScript对象的键都是字符串类型,值可以是任意数据类型。
上述person对象一共定义了6个键值对,其中每个键又称为对象的属性,例如,person的name属性为'Bob'。要获取一个对象的属性,我们用对象变量.属性名的方式:
person.name; // 'Bob'
person.zipcode; // null
访问属性是通过.操作符完成的,但这要求属性名必须是一个有效的变量名。如果属性名包含特殊字符,就必须用''括起来:
var xiaohong = {
name: '小红',
'middle-school': 'No.1 Middle School'
};
xiaohong的属性名middle-school不是一个有效的变量,就需要用''括起来。访问这个属性也无法使用.操作符,必须用['xxx']来访问:
xiaohong['middle-school']; // 'No.1 Middle School'
xiaohong['name']; // '小红'
xiaohong.name; // '小红'
也可以用xiaohong['name']来访问xiaohong的name属性,不过xiaohong.name的写法更简洁。我们在编写JavaScript代码的时候,属性名尽量使用标准的变量名,这样就可以直接通过object.prop的形式访问一个属性了。
注:变量的概念
var a = 123;
var申明变量,变量声明时不指定变量类型,赋值时给变量的值决定变量类型,这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言(比如Java,变量声明同时必须指定类型)。
注:strict模式的概念
如果一个变量没有通过var申明就被使用,那么该变量就自动被申明为全局变量:
i = 10;
判断某个全局变量是否存在用typeof window.myVar === 'undefined';
函数内部判断某个变量是否存在用typeof myVar === 'undefined'。
使用var申明的变量则不是全局变量,它的范围被限制在该变量被申明的函数体内(函数的概念将稍后讲解),同名变量在不同的函数体内互不冲突。
为了修补JavaScript这一严重设计缺陷,ECMA在后续规范中推出了strict模式,在strict模式下运行的JavaScript代码,强制通过var申明变量,未使用var申明变量就使用的,将导致运行错误。
启用strict模式的方法是在JavaScript代码的第一行写上:
'use strict';
1.2.1 数组Array
特殊的对象类型,因为是有编号值的有序集合。
[1, 2, 3.14, 'Hello', null, true];
[1, 2, 3.14, "Hello", null, true]
new Array(1, 2, 3);
[1, 2, 3]
splice()方法是修改Array的“万能方法”,它可以从指定的索引开始删除若干元素,然后再从该位置添加若干元素:
var arr = ['Microsoft', 'Apple', 'Yahoo', 'AOL', 'Excite', 'Oracle'];
// 从索引2开始删除3个元素,然后再添加两个元素
arr.splice(2, 3, 'Google', 'Facebook');
["Yahoo", "AOL", "Excite"]
arr;
["Microsoft", "Apple", "Google", "Facebook", "Oracle"]
多维数组
var arr = [[1, 2, 3], [400, 500, 600], '-'];
var x = arr[1][1]; //取到500
判断Array要使用Array.isArray(arr);