引用
1 | document.write("hello,world!"); |
让文档写一个hello,world
JS特性
运行环境:浏览器
解释型: 不需要编译连接
DOM: Document Object Model 文档对象模型
浏览器中的JS分为两个部分,一部分 ECMAScript 定义了基本的语法
Javascript程序设计 -> DOM编程艺术
历史
1995 Netscape Navigator 2.0 js诞生
ECMAScript 1 1997年
W3C DOM 规范 1998年
ECMAScript 3 2000年
Ajax Web2.0 2005年
ECMAScript 5.1 2011年
ECMAScript 6 2015年
JS调试
JS 调试,需要用到开发者工具中的Source面板
command + o 查找文件
基本语法
字面量,直接量 var number = 1
标识符
- 命名要求:以字母、下划线或者美元符号$开头
- 由字母、下划线、美元符号$和数字组成
- 不能以关键字为名称。
- 大小写敏感
语句
1 | if (sex == 1){ |
每个语句以分号结尾,每个语句结尾要加分号。
注释
- 单行注释: //
- 块级注释:以
/*
开头,以*/
结尾 - 不可嵌套
基本类型
Number String Boolean Object NuLL Undefined
整数、八进制(以0开头:070//56)、十六进制(0xff)、浮点数1.2(1.4E2 10的平方)、NaN(特殊值,不是一个数字)
[] 的bool值是true。 1 的bool 值是 true
“”是false null是false
Object
是一组无序的名值对的集合
NULL
值:null
出现场景:表示对象不存在,在未初始化时声明为null
Undefined
值:undefined
出现场景:以声明未赋值的变量,获取对象不存在的属性
类型识别 typeof
值类型和引用类型。
操作符
一元操作符
++ --
算数操作符
+ - * / %
关系操作符
> < >= <=
相等操作符
== != === !==
在做相等操作符 == 的时候,会进行类型转换。 bool类型值会转换为数字。 true会转换为1 。空字符串会转换为0
=== 全等,不会做类型转换。
逻辑操作符
! && ||
条件操作符
? :
逗号操作符
, 用于赋值操作。
对象操作符
new delete . [] instanceof in
new
1 | var cat = new Object(); |
delete
1 | var cat = {name: 'kitty', age:2}; |
.
获取对象的属性
[]
通过[]获取值
1 | var cat = {name:'kitty', age:2}; |
instanceof
1 | var cat = {name:'kitty', age:2}; |
判断是否是某个类型的实例
in
1 | var cat = {name:'kitty', age:2}; |
判断某个属性是否属于一个实例
位操作符
~ & | ^ << >> >>>
语句
条件语句 | 循环语句 | with语句 | 异常捕获语句
循环语句 for-in
访问一个对象中每一个属性
1 | var cat = { |
with语句
with(表达式){语句}
作用:把当前语句中代码的作用域指向到一个特殊的对象上。表达是一般是对象。
1 | var kitty = { |
异常捕获语句
try{
语句
} catch (exception){
语句
} finally {
语句
}
1 | try{ |
数值
函数:
Math.abs(x) // 获取绝对值
Math.round(x) // 四舍五入
Math.ceil(x) // 向上取整 1.1 -> 2 1.9 -> 2
Math.floor(x) // 向下取整
Math.max(…) // 获取最大值 Math.max(-1, -2, -3)
Math.min(…)
Math.random() // 随机数 范围:0<=x<1 区间的数值
Math.cos(x) // 以弧度为单位 返回余弦值
Math.exp(x) // 数值 返回 e的x次方
Math.log(x) // 数值 返回 e的y次方 = x 返回y的值
Math.sqrt(x) // 数值 返回 平方根
Math.pow(x, y)// 基数,指数 返回 x的y次方
parseInt(string, radix(输入几禁止的数))
1 | parseInt('1.1') // 1 |
parseFloat(String)
保留小数点
1 | parseFloat('1.1') // 1.1 |
Number(value)
1 | Number(100.1) // 100.1 |
num.toFixed(digits) digits 表示保留几位小数 返回字符串
1 | (100.123).toFixed(2) // "100.12" |
字符串
length属性,获取字符串的长度
str.charAt(index) 返回 字符
str.indexOf(searchValue, fromIndex) 返回 index
只返回匹配到的第一个要查询的符号
str.search(regexp(正则))
1 | "micromajor163".search(/[0-9]/) // 10 |
str.match(regexp) -> 数组
1 | "micromajor163".match(/[0-9]/) // ["1"] |
正则里面的全局参数决定了match输出单个还是输出集合
str.replace(regexp|substr, newSubstr | function)
如果不注明全局 g ,只替换第一个匹配的字符
1 | "micromajor163".replace("163", "###") // "micromajor###" |
str.substring(indexA[, indexB]) 截取 []表示第二个参数可以没有
A包含,B不包含
第二个参数不写表示后面所有的字符串都会被截取
1 | "micromajor".substring(5,7) // "ma" |
关于课程中所说的substring不能传负数的说法,严格意义上是不准确的。其实substring可以传入负数,但是负数对substring是没有任何意义的,都会处理成0,所以我们可以理解为substring其实不支持负数。
str.slice(beginSlice[, endSlice]) (也是截取)
begin包含,end不包含
1 | "micromajor".slice(5,7) // "ma" |
str.substr(start[,length])
从5开始 取两个
1 | "micromajor".substr(5,2) // "ma" |
str.split([separator][,limit]) 通过某个字符分割字符串
1 | "micro major".split(" ") // ["micro", "major"] |
str.toLowerCase() 转化为小写 str.toUpperCase()
1 | "MicroMajor".toLowerCase() // "micromajor" |
连接 +
1 | "0571" + "-" + "88888888" |
String() 把值转化为 字符串
1 | String(163) // "163" |
转译
1 | "micro\"major" // "micro"major" |
对象
创建对象
1 | var car = new Object() |
属性和方法:
1 | var car = { |
增加属性和方法,修改属性
删除属性和方法
1 | var car = { |
obj.constructor 来找到是由哪个图纸构建出来的
1 | var car = { |
obj.toString() 将对象转为字符串
obj.valueOf() 获取对象的原始值
obj.hasOwnproperty()
1 | var car = { |
数组
创建数组
1 | var array = new Array(); |
length
arr.indexOf(searchElement[,fromIndex = 0])
1 | var telephones = [110, 120, 114]; |
arr.forEach(callback[, thisArg]) 遍历
每遍历一个元素,就会调用callback
1 | var student = [ |
arr.reverse() 将数组倒序
arr.sort(compareFunction)
sort放改变原来的数组
1 | var student = [ |
如果不传入回调方法,则会按默认编码顺序。
arr.push(element1,…)
push将元素添加到数组的最后。
arr.unshift(element1,…)
将元素添加到数组的前面
arr.shift()
返回数组第一个元素,而且数组中的第一个元素被移除了。
arr.pop()
返回数组最后一个元素,并且将原来数组中的最后一个元素移除了。
arr.splice(index,howMany[,ele1[]])
1 | student. |
以上方法都改变了原来的数组
arr.slice(begin[,end]) 从区间拷贝出来一份数组
begin 包含,end不包含
如果end不传,则从begin开始一直到最后一个元素
arr.concat(value1,…,valueN)
做连接,连多个值,将很多个值连起来组成一个新的数组
1 | var newStudent = student1.concat(student2, student3) |
arr.join([separator])
将数组中的每个元素用分号连接起来
1 | var emails = ["wq@163.com", "gp@163.com", "xl@163.com"]; |
arr.map(callback[,thisArg])
1 | var scores = [60, 70, 80, 90]; |
arr.reduce(callback,[initialValue])
1 | var student = [ |
以上这些方法 对原来的数组没有修改
函数
function 函数名([行参列表]){
执行代码
}
函数名([实参列表])
当实参数量多于形参
当实参数量多于形参,如何取到传入的参数
在给函数传入实参时,有一个隐藏的参数arguments
如果参数为对象类型: 则引用传递!
作用域
函数创建了一个作用域。变量的作用域就是变量起作用的范围
变量的作用域:从定义变量的那一行开始,直到所在的代码块结束
函数作为对象属性
构造函数
构造函数调用的结果,相当于return this
原型
1 | function Point(x, y) { |
调用构造函数,var point = new Point(1, 1); // {x = 1; y = 1}
然而,point 也可以调用move方法。 move是个隐藏方法
这样就可以用很节约的方法,创造大量的对象,且对象也会拥有强大的功能。
Date 日期
当前时间 new Date();
2014年12月5日 new Date(2014, 11, 5) 注意月份从0开始
创建日期
- new Date() 获取当前日期
- new Date(year, month[, day[, hour[, minutes[, seconds[, milliseconds]]]]])
new Date(1978, 11) 1978-12-01 00:00:00
new Date(2001, 8, 11) 2001-09-11 00:00:00
newDate(2015, 7, 20, 14, 57, 18) 2015-08-20 14:57:18
date.getXXX() 格式化
1 | function padding(number) { |
padding的作用:如果获取的是个位数,会在前面补0
date.setXXX()
如果date.setDate(35); -> 会将天数加到下个月,以此类推
案例: 获取指定月数的天数
new Date(2001, 2, 0) -> 2001 - 02 - 28 00:00:00
1 | function getDays(year, month) { |
Date -> Number
date.getTime(); // 距离1970年 1月 1日 0时0分0秒
RegExp 正则表达式
描述字符串规则的表达式
- /pattern规则/attrs属性
- new RegExp(pattern, attrs)
regexObj.test(str)
test只需要被指定字符串包含正则表达式所描述字符串。
1 | /13566668888/.test('13566668888'); // false |
锚点
匹配一个位置
^ : 其实位置
/^http:/
表示以http为起始的url$ : 结尾位置
/\.jpg&/
表示以.jpg结尾的字符串\b: 单词边界
/\bis\b/
表示是否包含 is 这个单词
1 | /^135666688888$/.test('13566668888'); // true |
字符类
匹配一类字符中的一个
[abc]: a或b或c
[0-9]: 一个数字
[^0-9]:非数字的一个字符[a-z]: 一个字母
. :任意字符(换行除外)
1 | /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$/.test('13566668888'); // true |
字符类
具有特殊意义的字符
^、$、\b
\d <==> [0-9] 数字 \D <==> [^\d] 非数字
\s <==> 空白符 \S <==> [^\s]
\w <==> [A-Za-z0-9_] \W <==> [^\W]
非单词字符
1 | /\d/.test('123') // true |
简化:
1 | /^1\d\d\d\d\d\d\d\d\d\d$/.test('13566668888'); // true |
量词
表示出现的次数:
点星加问号
{m,n}表示 m到n次
* 表示{0,} 出现0到任意多次
? : {0,1} 表示出现0 到 1次
+ : {1,} 表示至少出现1次
1 | /\d*/.test('abc') // true |
简化:
1 | /^1\d{10}$/.test('13566668888'); // true |
转义符
需要匹配的字符是元字符
/^http:\/\//
/@163\.com$/
1 | /@163\.com$/.test('abc@163.com') // true |
多选分支
/thi(c|n)k
|表示多选分支,表示能匹配 thick 或 think ()表示限定范围
等价于 /thi[cn]k/
例子:检测一个图片是否是图片文件 /\.(png|jpg|jpeg|gif)$/
捕获
保存匹配到的字符串。
() :捕获
带括号的内容可以把匹配到的字符保存下来
(?:) 不需要捕获
使用:
$1, $2...
- api参数或返回值
str.match(regexp)
获取匹配的字符串
分析案例:
1 | var url = 'http://blog.163.com/album?id=1#comment'; |
str.replace 用正则替换一个数字
1 | var str = 'The price of tomato is 5, the price of apple is 10.'; |
小案例
1 | var container = document.getElementById('container'); |
全局模式
/g 表示 全局模式, /i 表示不区分大小写
lastIndex表示下一次匹配的起始位置
如果将lastIndex 改变,则会改变下一次匹配的位置
1 | var str = 'aabab'; |
JSON
JavaScript Object Notation
JSON.parse(text,[function])
Json -> JS
1 | var userjson = ' |
第二个参数传入一个方法,会将key 跟 value 传入,便于转换之后进行一些操作:
1 | var user = JSON.parse(userJson, function(k, v) { |
parse IE6/7 不支持的做法如下:
JSON.stringify(value,[replacer])
序列化,将JS->JSON
replacer数组表示 进行部分序列化,将想要序列化的属性传入。